2011-01-14 9 views
2

私はデジタル署名されたXML文書を持っています。 XML Digital Signature APIを使用して署名を検証します。しかし、このドキュメントはSAML 2.0アサーションであり、Webアプリケーションへのシングルサインオンに使用されます。したがって、XML文書に署名するために使用されたX.509証明書の信頼を確立する必要があります。仲介者が発行したX.509証明書の信頼を確立するにはどうすればよいですか?

私がしようとすると、この信頼を確立するために使用していたコードは次のとおりです。

certPathValidator.validate()への呼び出しを実行し
String filename = System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar); 
FileInputStream is = new FileInputStream(filename); 
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
String password = "changeit"; 
keystore.load(is, password.toCharArray()); 

PKIXParameters params = new PKIXParameters(keystore); 
params.setRevocationEnabled(false); 

CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
CertPath certPath = certFactory.generateCertPath(Arrays.asList(signatureCertificate)); 

CertPathValidator certPathValidator = CertPathValidator.getInstance(CertPathValidator.getDefaultType()); 
CertPathValidatorResult result = certPathValidator.validate(certPath, params); 

PKIXCertPathValidatorResult pkixResult = (PKIXCertPathValidatorResult) result; 
TrustAnchor ta = pkixResult.getTrustAnchor(); 
X509Certificate cert = ta.getTrustedCert(); 

がメッセージPath does not chain with any of the trust anchorsCertPathValidatorExceptionをスローします。

証明書を調べると、OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign,OU=VeriSign International Server CA - Class 3,OU=VeriSign\, Inc.,O=VeriSign Trust Networkによって発行されたことが示されます。 これは、JDKのcacertsキーストアの信頼アンカーの1つではありません。

しかし、IEを使用して同様の証明書のトラストチェーンを調べると、は、VeriSign Class 3 Public Primary CAによって発行されました。これはJDKのcacertsキーストアの信頼アンカーの1つです。

私の質問:Javaでこの証明書を検証するにはどうすればよいですか?

答えて

4

発行CAの公開証明書をcacertキーストアに挿入します。

編集:keytoolまたは他のツールのいずれかを使用することができます。 JDKのキーストアに

OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign,OU=VeriSign International Server CA - Class 3,OU=VeriSign\, Inc.,O=VeriSign Trust Network 

:中間CAを追加 - keytool-Key and Certificate Management Tool

+0

感謝。これは愚かな質問かもしれませんが、発行者のX.509証明書を取得するにはどうすればよいですか? –

+0

http://www.verisign.com/support/roots.html - 登録フォームのすぐ下には、すべてのVerisignルート証明書をダウンロードするリンクがあります。 – xelco52

+0

優秀、ありがとうございます。必要な証明書はそのサイトにはありませんでしたが、私はGoogleを使ってその証明書を見つけることができました。再度、感謝します。 –

3

がxelcoが言ったまさに:記事は、keytoolの使用について説明します。あなたはそれを行うためにkeytoolを使うことができます。

理由:一般にXMLメッセージに署名する場合、署名には署名証明書のみが含まれます。 X509証明書は単独でリンクされたリストに似ています。エンドエンティティは発行者を指します。あなた自身を指し示す自己署名付きルートCAに達するまで、発行者は発行者を指します。 PKIXに従って証明書を検証するには、検証者がエンドエンティティから自己署名付きルートまでCAチェーン全体を構築できる必要があるため、チェーンのすべての部分(エンドエンティティを除く)が証明書ストアに存在する必要があります。

関連する問題