10

証明書の公開鍵を検証しようとしています。次のコマンドを使用して、証明書がキ​​ーストアにインポートされました。

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)

証明書には公開鍵が含まれていますが、私は秘密鍵にアクセスできません。キーストアにインポートしたこの証明書に対して公開鍵を検証することはまったく可能ですか? 公開鍵は証明書自体から取得されるため、正しいはずです。

証明書について他に何を探す必要がありますか?

証明書に関する情報をさらに入手しました。証明書は秘密鍵からエクスポートされます。その過程で何か間違ったことはありますか?

4

2 に答える 2

10

証明書から抽出した公開鍵を渡すべきではありません。署名を検証するには、発行者の証明書の公開鍵を渡す必要があります。

したがって、Robert がコメントで指摘したように、上記のコードは自己署名証明書の場合にのみ機能します (証明書はそれ自体で署名されています)。

于 2012-08-28T14:40:45.677 に答える
-2

公開鍵の検証方法は、X509証明書の実装を内部的に使用します。

そのため、標準に従って生成された証明書のみを検証できX509ます。

詳細については、 http://en.wikipedia.org/wiki/X.509をご覧ください。

于 2012-08-28T15:05:29.767 に答える