1

私は何日もこれを理解しようとしてきました。私は断念しました。CA の証明書と秘密鍵の PEM ファイルから pfx を作成しようとしています。証明書とキーを作成できましたが、OpenSSL.X509.PKCS12 の最後のパラメーターがわかりません。ここに私が持っているものがあります:

    private void btnCreatePFX_Click(object sender, EventArgs e)
    {
        string password = "p@ssw0rd";
        string key_path = @"certs\ca_key.key";
        string cert_path = @"certs\ca_cert.crt";
        string k = File.ReadAllText(key_path);
        string c = File.ReadAllText(cert_path);

        OpenSSL.Core.BIO key_bio = new OpenSSL.Core.BIO(k);
        OpenSSL.Core.BIO cert_bio = new OpenSSL.Core.BIO(c);

        OpenSSL.Crypto.CryptoKey key = OpenSSL.Crypto.CryptoKey.FromPrivateKey(k, "");
        OpenSSL.X509.X509Certificate cert = new OpenSSL.X509.X509Certificate(cert_bio);
        //OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate> hmm = new OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate>();

        var pfx = new OpenSSL.X509.PKCS12(password, key, cert, null); // <-- Problem with 4th parameter (I think)
    }

4 番目のパラメーターが OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate> である必要があることはわかっていますが、設定方法がわかりません。ソース コードからのテストは、pfx を読み取り、同じ pfx オブジェクトのプロパティを使用して新しいオブジェクトを作成します。そのため、OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate> を返すアクセサ OpenSSL.X509.PKCS12.CACertificates を簡単に取得できます。また、単純に pfx を読み取ると、CACertificates が空白で、Count と IsReadOnly の 2 つのメンバーがあることがわかります。そのオブジェクトを作成しようとすると、読み取り専用であるため、Count と IsReadOnly を設定できません。4 番目のパラメーターを null と "" に設定しても機能しません。私は困惑しています。

例はこちら: https://github.com/flaub/openssl-net/tree/master/test

どんな助けでも大歓迎です。私はプログラミングに関しては非常に初心者なので、お手柔らかにお願いします。:-)

4

1 に答える 1

1

の新しいインスタンスが必要ですOpenSSL.Core.Stack<OpenSSL.X509Certificate>。あなたの例では、あなたはすでにこれらの1つを行に持っています:

//OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate> hmm = new OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate>();

hmmしたがって、その行のコメントを解除し、4番目のパラメーターとしてそのまま渡すことで、PKCS12インスタンスを作成できるはずです。

このStack<X509Certificate>パラメーターは、複数の証明書(およびキー)を1つのファイルに含めるために使用されます。通常、パラメータで指定した証明書の中間証明書やCA証明書など、検証チェーンの一部である証明書のみを含めX509Certificate certます。

PKCS12インスタンスのCACertificatesプロパティは、pfxファイルに追加された証明書のスタックです。スタックに証明書が追加されていないため、プロパティは空白です。インスタンスの.Add(X509Certificate)メソッドを使用して、証明書を追加できます。Stack<X509Certificate>

インスタンスがスコープ外になる前にDispose()、インスタンスを呼び出すStack<X509Certificate>(またはブロックでラップする)必要があります。using(...)

于 2012-12-13T06:38:28.640 に答える