4

PKCS#12証明書を使用して一部のデータに署名しようとしていますが、PKCS#12(.p12)ファイルから秘密鍵を取得する際に問題が発生します。

    public byte[] sign(string text)
    {
        string password = "1111";
        X509Certificate2 cert = new X509Certificate2("c:\\certificate.p12",password);
        byte[] certData = cert.Export(X509ContentType.Pfx,password);

        X509Certificate2 newCert = new X509Certificate2(certData, password);
        RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)newCert.PrivateKey;

        SHA1Managed sha1 = new SHA1Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);
        return crypt.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    }

問題は、newCert.PrivateKeyがnullであるということですが、同様の方法で.pfxcerticitaeを使用している場合は機能します。

    public byte[] sign(string text)
    {
        string password = "1234";
        X509Certificate2 cert = new X509Certificate2("c:\\certificate.pfx", password);
        RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)cert.PrivateKey;
        SHA1Managed sha1 = new SHA1Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);
        return crypt.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    }

だから問題は、.p12ファイルからその秘密鍵を取得する方法ですか?

4

4 に答える 4

3

私はここに投稿した同様の問題を抱えていましたが、それはあなたにとって同じことではありませんが、問題は許可でもある可能性があります。
私の提案は、最初に、秘密鍵がエクスポート可能であり、ファイルへのアクセス許可を持っていることを確認する必要があります(すでに行っていると思います)。
次に、X509ContentType.Pkcs12代わりにコンテンツタイプをエクスポートしてみてくださいX509ContentType.Pfx
。最後に、可能であれば、証明書ストアにインポートしてみませんか。それがより安全だと思います。手順は上記のリンクにあります。

于 2011-09-27T18:18:23.493 に答える
0

この質問を見てください。よく似ています。

于 2011-03-29T11:46:05.713 に答える
0

ドキュメントでは、タイプはサポートされておらず、、、、およびのみ.export()がサポートされていると記載されています。PfxCertSerializedCertPkcs12

于 2011-09-26T03:50:49.277 に答える
-1

これはAndroidを使用するために行われたため、以下のR.raw.keyはAndroidRawフォルダー内の私のファイルでした。

key.p12を入力ストリームとして開きました。次に、例に示すように、ライブラリを使用して秘密鍵に変換しました。

http://www.flexiprovider.de/examples/ExampleSMIMEsign.html

私のコードは次のようになります

Security.addProvider(new de.flexiprovider.core.FlexiCoreProvider());
    // Next, we have to read the private PKCS #12 file, since the the
    // private key used for signing is contained in this file:
    DERDecoder dec = new DERDecoder(getResources().openRawResource(
            R.raw.key));
    PFX pfx = new PFX();
    try {
        pfx.decode(dec);
        SafeBag safeBag = pfx.getAuthSafe().getSafeContents(0)
                .getSafeBag(0);
        PKCS8ShroudedKeyBag kBag = (PKCS8ShroudedKeyBag) safeBag
                .getBagValue();
        char[] password = "my password for the p12".toCharArray();
        privKey = kBag.getPrivateKey(password);
        new AsyncLoadStorage(this).execute();
    } catch (ASN1Exception e) {
于 2012-08-28T10:04:39.317 に答える