0
我想表明,如果我修改了给定X509证书中的一个位或字节,则签名验证结果为false(因为此修改会导致证书中的不同哈希值)。我陷入了如何使用getTBSCertificate()方法对证书进行修改的情况。我的下面的代码完全验证过程,但我试图使它失败,使用位或字节修改的想法,但它不起作用。需要注意的是这种想法,我建议是要证明,证书上的任何修改将使故障而签名验证如何更新getTBSCertificate()方法
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;
}
}
}
您是否在尝试进行某种测试?为什么不扩展证书? – ITomas
是的,这是一个测试。但我需要显示反例时,有人翻转或更改证书中的任何位,verify()必须返回false – user3317181
因此,也许扩展证书和重新实现getTBSCertificate,所以添加setter方法将工作? – ITomas