0

特定のメッセージが、自分のトラスト アンカーによって認識されるエンティティ証明書からの有効な署名で署名されているかどうかを確認しようとしています。私はこれをやっています:

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 signerConstraints = signer.getSID();

SignerId から X509CertSelector にキャストできないためです。明示的なキャストを使用してみました:

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

と:

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

結果なし。これどうやってするの?ありがとう

PS: このコードは、David Hook による「Beginning Cryptography with Java」から抽出されたものですが、コンパイルされないことに注意してください。

4

2 に答える 2

1

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

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

それ以外の:

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

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

編集:http://bouncy-castle.1462172.n4.nabble.com/Problem-with-SignerID-and-X509CertSelector-td4620461.htmlのDavidHookの回答

org.bouncycastle.cert.selector.jcajce.JcaX509CertSelectorConverterを使用してください-残念ながら、「Javaで暗号化を開始する」のコードは古くなっています。ワープロをもう一度出さなければならないと思います。

よろしく、

デビッド

于 2012-05-10T08:44:29.677 に答える
0

BouncyCastle 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);
于 2016-11-03T13:06:21.793 に答える