2012-05-09 6 views
0

私自身のトラストアンカーで認識されたエンティティ証明書の有効な署名で特定のメッセージが署名されているかどうかを検証しようとしています。BouncyCastleライブラリのX509CertSelectorへのSignerIDキャスト

public static boolean isValid(CMSSignedData signedData, X509Certificate rootCert) throws Exception 
{ 
    CertStore certsAndCRLs = signedData.getCertificatesAndCRLs("Collection", "BC"); 
    SignerInformationStore signers = signedData.getSignerInfos(); 
    Iterator it = signers.getSigners().iterator(); 

    if (it.hasNext()){ 
     SignerInformation signer = (SignerInformation)it.next(); 

     X509CertSelector signerConstraints = signer.getSID(); 

     PKIXCertPathBuilderResult result = buildPath(rootCert, signerID, certsAndCRLs); 

     return signer.verify(result.getPublicKey(), "BC"); 
    } 
    return false; 
} 

をしかし、この行は私にコンパイルエラーを与えている:私はこれをやっている、X509CertSelectorのにSignerIdからキャストすることができません

X509CertSelector signerConstraints = signer.getSID(); 

ので。結果がないと

X509CertSelector signerConstraints = (X509CertSelector) signer.getSID(); 

X509CertSelector signerConstraints = (CertSelector) signer.getSID(); 

そして:私は明示的なキャストを使用してみました。これどうやってするの?ありがとう

PS:このコードはDavid Hookの "Beginning Cryptography with Java"から抜粋されていますが、コンパイルされません。

+0

あなたは私たちに弾む城のAPIバージョンを与えてもらえますか? BCのメーリングリストで彼のラウンドをしているとき、あなたは確かにDaveから得られる答えでしょうか? –

答えて

1

私は昨日私自身の問題を解決しました。私はそれが私のプロジェクトに外部アーカイブとして含まれている.jarに関連するものだと思う。今、私はこれらの を使用しています:

bcprov-jdk16-145.jar 
bcmail-jdk16-145.jar 

の代わりに:

bcprov-jdk15on-147.jar 
bcmail-jdk15on-147.jar 

を多分古いバージョンでは、暗黙的なキャストのこの種をサポートしていませんでした。

EDIThttp://bouncy-castle.1462172.n4.nabble.com/Problem-with-SignerID-and-X509CertSelector-td4620461.html

はBouncyCastleを使用して

Use org.bouncycastle.cert.selector.jcajce.JcaX509CertSelectorConverter - unfortunately the code in "Beginning Cryptography With Java" is now getting out of date. Guess I'll have to get the word processor out again.

Regards,

David

+1

フラン、-145のバージョンは実際には-147バージョンよりも低いバージョンです。 16と15は、Javaランタイムの非商用バージョン番号にのみ関連しています。したがって、この回答は正しいかもしれませんが、あなたがアップグレードすることはできません。代わりにDavidの答えを投稿してください。 –

+0

@owlsteadこれは実際に私の主人からの科目のためのいくつかの宿題をすることです、私は将来のメンテナンスの考えなくそれを行うことができます。とにかく、自分の答えを編集してDavidの答えを提供します。 –

0

でデビッド・フックの答えbcmail-jdk15on 1.52私が使用してこれを行うことに成功しました:

X509CertificateHolderSelector x509CertificateHolderSelector = new X509CertificateHolderSelector(info.getSID().getSubjectKeyIdentifier()); 
X509CertSelector certSelector = new JcaX509CertSelectorConverter().getCertSelector(x509CertificateHolderSelector); 
@SuppressWarnings("unchecked") 
Collection<X509Certificate> certCollection = (Collection<X509Certificate>) certs.getCertificates(certSelector); 
関連する問題