2016-05-28 2 views
0

Webサービスから受信したデータ文字列とそのRSA-SHA256署名を検証しようとしていますが、証明書の秘密/公開鍵のロードが完全に停止しています。RSA SHA256署名が証明書から秘密鍵を取得できないことを確認しました

私はCERファイルから情報を取得するために、次のコードを持って、私はそれはエンコード典型的なbase64でではないのでそれはDER形式であると思う:

InputStream in = new FileInputStream(path1); 
CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate) factory.generateCertificate(in); 
System.out.println(cert.toString()); 

それは、証明書の全情報を出力します。

Version: V3 
Subject: EMAILADDRESS=... 
... 
Algorithm: [SHA256withRSA] 
... 

が、試してみるには、ロードし、次のコードで、秘密鍵取得する場合:

KeyFactory kf = KeyFactory.getInstance("RSA");   
X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(encodedKey); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec); 
Signature sig = Signature.getInstance("SHA256withRSA"); 
sig.initVerify(bobPubKey); 
sig.update(data_received); 
sig.verify(signature_received); 

私は次の例外keyFactory.generatePublic方法で

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format 

を取得します。それがgeneratePrivateに変更された場合も同じ結果になります。

+2

まず、秘密鍵と公開鍵は2つの非常に異なるものです。公開鍵で確認します。証明書には公開鍵が含まれています。検証部分には秘密鍵は含まれていません。第2に、証明書の読み方を理解したので、X509Certificateオブジェクトの['getPublicKey()'を呼び出すだけです(http://stackoverflow.com/questions/6358555/obtaining-public-key-from-certificate)。 –

答えて

1

おかげでジェームズは、あなたのアドバイス、次の私は、次でそれを作った:

 InputStream in = new FileInputStream(System.getProperty("user.dir") + "\\" + certificateName); 
     CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
     X509Certificate cert = (X509Certificate) factory.generateCertificate(in); 
     PublicKey pubKey = cert.getPublicKey(); 


     Signature sig = Signature.getInstance("SHA256withRSA"); 
     sig.initVerify(pubKey); 
     sig.update(xmlContent); 

     return sig.verify(headerSignature); 
関連する問題