Voglio mostrare che se modifico un bit o un byte da un determinato certificato X509 i risultati della verifica della firma sono falsi (poiché questa modifica risulta dal valore hash diverso dal certificato). Sono bloccato nel caso in cui come fare la modifica sul certificato utilizzando il metodo getTBSCertificate (). Il mio codice seguente fa il processo di verifica perfettamente, ma ho provato a farlo fallire usando l'idea di modifica di bit o byte ma non funziona. Si noti che questa idea che ho proposto è quella di dimostrare che qualsiasi modifica sul certificato causerà un errore durante la verifica della firma
public class VerifyX509 {
private static Certificate getCACert;
private static Certificate[] getCert;
public static void main(String[] args) throws CertificateEncodingException {
setURLConnection("https://www.google.com");
X509Certificate x509cert= (X509Certificate) getCert[0];
byte[] b= x509cert.getTBSCertificate();
b[0] = (byte) ~b[0];
// HOW TO UPDATE getTBSCertificate() after flipping the b[0] to make Verify() in my method verifySign() return false!
verifySign();
}
public static void setURLConnection(String link){
try{
int i=1;
URL destinationURL = new URL(link);
HttpsURLConnection con = (HttpsURLConnection) destinationURL.openConnection();
con.connect();
getCert = con.getServerCertificates();
for (Certificate c : getCert)
{
if (i==2)
{
getCACert= c;
return;
}
i+=1;
}
}catch (Exception e1) {
JOptionPane.showMessageDialog(null, "Error while connection! Check your Internet Connection.");
e1.printStackTrace();
}
}
public static boolean verifySign()
{
try
{
getCert[0].verify(getCACert.getPublicKey());
return true;
} catch (GeneralSecurityException e2)
{
return false;
}
}