我正在尝试验证证书的公钥。证书已使用以下命令导入到 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/