24

クライアントが証明書を介して認証する必要があるACSで保護されたAzureWCFサービスを構築しています。

クライアント(およびサーバー)に、ファイルシステムからではなく、X509Storeからそれぞれのパスワード証明書をロードしてもらいたいのですが。

私はこのコードを使用しています:

private static X509Certificate2 GetCertificate(string thumbprint)
{
    var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    certStore.Open(OpenFlags.ReadOnly);

    X509Certificate2Collection certCollection = certStore.Certificates.Find(
        X509FindType.FindByThumbprint,
        thumbprint, false);

    certStore.Close();

    if (certCollection.Count == 0)
    {
        throw new System.Security.SecurityException(string.Format(CultureInfo.InvariantCulture, "No certificate was found for thumbprint {0}", thumbprint));
    }

    return certCollection[0]; 
}

問題は、認証に必要な秘密鍵がロードされていないことです。私はreturnステートメントをこれに変更しようとしました:

return new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, "password"));

ただし、これはCryptographicException「指定されたネットワークパスワードが正しくありません」で失敗します。

編集: でパスワード引数を渡さない場合、.Export()メソッドは正しく機能します。

これについて何か助けはありますか?

4

3 に答える 3

9

エクスポートする場合、指定するパスワードは、エクスポートされたファイルに使用するパスワードであり、ソース証明書のパスワードではありません。

パスワードはX509Certificateコンストラクターに提供する必要があり、既にインスタンス化されたオブジェクトをストアから取得するため、X509Storeとパスワードで保護された証明書で何ができるかわかりません。

必要な証明書から生データを取得し、必要なパスワードを使用して新しいデータを作成できると思います。例えば:

X509Certificate2 cert = new X509Certificate2(certCollection[0].GetRawCertData, password);

SecureStringまた、パスワードを扱うときに使用することをお勧めします(ただし、これはワームの別のバッグです...)

于 2012-09-13T04:07:12.127 に答える
2

'password'パラメーターなしでエクスポートを使用しましたが、問題なく機能しました。

于 2012-09-18T00:46:43.773 に答える
0

証明書が証明書ストアにインポートされたとき、キーを「エクスポート可能」としてマークする必要があると思います。そうしないと、秘密キーをエクスポートできないと思います..

ここに画像の説明を入力

于 2021-12-16T13:00:39.743 に答える