Rasmus が述べたように、HSM プロデューサーの CSP を使用する必要があります。このリンクを確認してください:
http://forums.asp.net/t/1531893.aspx
HttpWebRequest
、ClientCertificates
およびスマート カードを使用したクライアント認証 HTTPS に対して、クライアントで少し異なるアプローチを使用することに成功しました。私の場合、秘密鍵はスマート カードに保存されます (HSM と同様)。スマート カード CSP は、署名、暗号化/復号化などに PKCS#11 を使用しますが、これは重要ではありません。プロパティX509Certificate.Handle
は、クライアントでチャレンジに署名するために SSL 確立で使用され、このハンドルには証明書の秘密鍵に関する情報が含まれます。
私の場合、SSL作成の過程でスマートカードからの「PINの入力」ダイアログを避けるために、プログラムでスマートカードのピンを設定したかったので、この機能でそれを行いました:
public void SetContext(X509Certificate2 cert)
{
IntPtr p = IntPtr.Zero;
bool result = Win32.CryptAcquireContext(ref p, "keyContainer", "Siemens Card API CSP", 1, 0);
byte[] pin = new ASCIIEncoding().GetBytes("0000");
result = Win32.CryptSetProvParam(p, 32, pin, 0);
result = Win32.CertSetCertificateContextProperty(cert.Handle, 1, 0, p);
}
インストールされているすべての CSP の名前は、 にありHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider
ます。Win32
は C++/C# 相互運用のための私のクラスで、次のようになります。
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CryptAcquireContext(
ref IntPtr hProv,
string pszContainer,
string pszProvider,
uint dwProvType,
uint dwFlags
);
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool CryptSetProvParam(
IntPtr hProv,
uint dwParam,
[In] byte[] pbData,
uint dwFlags);
[DllImport("CRYPT32.DLL")]
internal static extern Boolean CertSetCertificateContextProperty(
IntPtr pCertContext,
uint dwPropId,
uint dwFlags,
IntPtr pvData
);