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&pCertCt
.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をロードできるようにする方法はありますか?