【问题标题】:Public key verification always returns "Signature does not match"公钥验证总是返回“签名不匹配”
【发布时间】:2012-08-28 09:49:58
【问题描述】:

我正在尝试验证证书的公钥。已使用以下命令将证书导入密钥库:

keytool -importcert -file cert.cer -keystore kstore.jks -alias mycert -storepass changeit

这是我用来验证公钥的java代码:

File keyStore = new File("kstore.jks");
String keyStorePassword = "changeit";
KeyStore ks = null;
try {
   ks = KeyStore.getInstance("jks");
   ks.load(keyStore.toURI().toURL().openStream(), keyStorePassword.toCharArray());
} catch (Exception e) {
   e.printStackTrace();
} 

try {
   Certificate cert = ks.getCertificate("mycert");
   PublicKey pk = cert.getPublicKey();
   cert.verify(pk);
   //cert.verify(pk, "SunRsaSign");
   System.out.println("Keys verified");
} catch (Exception e) {
   e.printStackTrace();
}

我得到的例外是:

java.security.SignatureException: Signature does not match.
   at sun.security.x509.X509CertImpl.verify(X509CertImpl.java:446)
   at sun.security.x509.X509CertImpl.verify(X509CertImpl.java:389)
   at VerifyEBXMLSignature.runIt3(VerifyEBXMLSignature.java:62)
   at VerifyEBXMLSignature.main(VerifyEBXMLSignature.java:41)

证书包含公钥,我无权访问私钥。 是否可以根据我导入密钥库的证书验证公钥?公钥来自证书本身,所以应该是正确的。

证书我还应该注意什么?

我刚刚获得了有关证书的更多信息:它是从私钥导出的。该过程中是否有任何可能做错的事情?

【问题讨论】:

  • 您使用的是自签名证书吗?
  • 我相信原始证书是自签名的。但是,公钥证书(我正在使用的)已从原始证书中导出。
  • 仅当“mycert”引用的证书是自签名证书时,发布的代码才有效。
  • 这是否意味着无法在公钥证书上验证公钥(如:cert.verify(pk);)?

标签: java security x509certificate keystore


【解决方案1】:

您不应该传递从证书中提取的公钥。您应该传递颁发者证书的公钥来验证签名。

因此,正如 Robert 在 cmets 中指出的那样,您的上述代码仅在它是自签名证书(证书由自身签名)时才有效。

【讨论】:

  • 是的,这似乎是正确的。我得到了原始证书,它通过了验证,没有错误。
【解决方案2】:

公钥验证方法内部使用X509证书实现。

所以它只能验证那些按照X509标准生成的证书。

欲了解更多信息,请访问http://en.wikipedia.org/wiki/X.509

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多