我正在尝试验证证书的公钥。证书已使用以下命令导入到 keystore 中:

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();
}

我得到的异常(exception)是:
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)

证书包含一个公共(public) key ,但我无权访问该私有(private) key 。
是否完全可以根据我导入到 keystore 中的此证书来验证公钥?公钥来自证书本身,因此它应该是正确的。

我还需要什么证书?

我刚刚获得了有关证书的更多信息:它是从私钥导出的。在此过程中是否有可能做错了什么?

最佳答案

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

因此,正如罗伯特(Robert)在评论中指出的那样,您的上述代码仅在它是自签名证书(该证书已与自身签名)的情况下才有效。

关于java - 公钥验证始终返回 "Signature does not match",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12156734/

10-13 03:23