Как сказал Расмус, вам следует использовать CSP от вашего производителя HSM. Проверьте эту ссылку:
http://forums.asp.net/t/1531893.aspx
Я успешно использовал немного другой подход на клиенте для аутентифицированного клиента HTTPS с HttpWebRequest
, ClientCertificates
и смарт-картой. В моем случае закрытый ключ хранится на смарт-карте (аналогично HSM). Затем CSP смарт-карты использует PKCS # 11 для подписи, шифрования / дешифрования и т. Д., Но это не важно. Свойство X509Certificate.Handle
используется при установлении SSL для подписания запроса на клиенте, и этот дескриптор содержит информацию о секретном ключе сертификата.
В моем случае я хотел установить программный пин-код для смарт-карты, чтобы избежать диалога «Ввод PIN-кода» со смарт-карты в процессе создания SSL, и я сделал это с помощью этой функции:
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
);