10

PFX証明書が埋め込まれている単体テストがいくつかあります。これらの証明書は、テストの実行中に読み取られ、X509Certificate2オブジェクトに変換されます。残念ながら、非特権ユーザーとして実行すると、Access Denied例外が発生します。

using (var s = EmbeddedResourceUtilities.GetEmbeddedResourceAsStream(typeThatContainsEmbeddedResource, certFileName))
{
    if (s == null)
    {

        throw new ApplicationException(String.Format("Embedded certificate {0} for type {1} not found.", certFileName, typeThatContainsEmbeddedResource.FullName));
    }

    try
    {
        var bytes = new byte[s.Length];
        s.Read(bytes, 0, (int)s.Length);
        return new X509Certificate2(bytes);
    }
    catch (Exception ex)
    {
        throw new ApplicationException(String.Format("Error loading embedded certificate {0} for type {1}.", certFileName, typeThatContainsEmbeddedResource.FullName), ex);
    }
}

例外は次のとおりです。

System.Security.Cryptography.CryptographicException:アクセスが拒否されました。
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) at
System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte [] rawData、IntPtr password、UInt32 dwFlags、Boolean persistKeySet、SafeCertContextHandle&pCe​​rtCt
.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte [] rawData、Object password、X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte [] rawData)

空のパスワードと明示的なキーセットフラグを使用するようにコンストラクターを変更しようとしましたが、修正されません。

// this doesn't work, either
return new X509Certificate2(bytes, String.Empty, X509KeyStorageFlags.MachineKeySet);

特権のないユーザーにMachineKeysディレクトリに対するアクセス許可を増やす必要があることを他の場所で読んだことがありますが、テスト環境外のディレクトリでそれらのアクセス許可が使用可能であると本番コードが想定できるため、これを行うのは嫌です。

特権のないユーザーがファイルからX509Certificateをロードできるようにする方法はありますか?

4

4 に答える 4

26

X509Certificate2コンストラクターで「X509KeyStorageFlags.UserKeySet」フラグを使用すると役に立ちました。

于 2018-07-19T20:36:25.370 に答える
6

これは何が起こっているかについての私の最良の推測です。

X509Certificate2コンストラクターは、Machine Keysディレクトリに一時的な公開/秘密鍵オブジェクトを作成します(Windowsのローカルセキュリティ機関を介して信じています)。非特権ユーザーはこれらのキーまたはMachineKeysディレクトリにアクセスできないため、テストは失敗します。

私たちの解決策は、環境設定スクリプトを更新してこれらのテスト証明書を事前にインストールし、非特権ユーザーのアクセス許可を付与し、テストを書き直して適切な証明書ストアから証明書をロードすることでした。

于 2013-05-23T20:02:04.017 に答える
0

私が持っていた理由は他の2人でした。私が思う最新のWindowsバージョン2019とWindows10では、pfxでエンコードされた証明書をTripleDES-SHA1およびAES256-SHA256として暗号化することができます。古いバージョンのWindowsでは、パスワードが正しい場合でも、これは「アクセスが拒否されました」で失敗します。

もう1つの理由は、中間権限とルート権限が証明書ストアに存在しない可能性があることです。.p7bからローカルマシンへのインポートを介して、最初にそれらをインポートするようにしてください。これで、証明書はSSLを提供するために有効としてマークされ(例)、「アクセスが拒否されました」は発生しなくなります。

于 2020-11-19T12:24:59.113 に答える
0

私の解決策は、X509KeyStorageFlags.MachineKeySetフラグを指定することです

X509Certificate2 x509Certificate = new X509Certificate2( "YourKey.pfx"、 "yourPassword"、X509KeyStorageFlags.MachineKeySet);

于 2020-11-27T10:17:17.190 に答える