データに署名して復号化するタスクがありますが、秘密鍵は HSM (Luna SA、/ Safenet ) にあります。すべてのクライアント ソフトウェアをインストールし、Luna SA CSP をテスト サーバーに接続しました。
提供されている PKCS#11 関数を使用して、HSM 上の公開鍵をPCCERT_CONTEXT
( CertCreateCertificateContext
) として一覧表示およびエクスポートできます。(CryptoAPI 関数を使用してCryptAcquireCertificatePrivateKey
) 秘密鍵を取得しようとすると、エラー コードが表示されますCRYPT_E_NO_KEY_PROPERTY
。
証明書データと CSP/HSM の間のリンクが欠落している可能性があります。誰かが似たようなことをして、何かヒントを与えることができますか?
編集
HSM にあるすべてのキーから CER ファイルを正常に作成しました。signtool.exe
使用方法( Microsoft Platform SDK に同梱されているもの) を知っていれば、HSM 上のキーを使用して dll に署名できます (ツール ウィザードを使用すると、キー コンテナー、キー仕様などを選択できます)。ツールが表示する情報を使用して、秘密鍵を設定しようとしました
bool LinkPrivateKey(PCCERT_CONTEXT cert)
{
CRYPT_KEY_PROV_INFO cryptKeyProvInfo;
memset(&cryptKeyProvInfo, 0, sizeof(cryptKeyProvInfo));
cryptKeyProvInfo.pwszContainerName = L"MSS";
cryptKeyProvInfo.pwszProvName = L"Luna Cryptographic Services for Microsoft Windows";
cryptKeyProvInfo.dwProvType = PROV_RSA_FULL;
cryptKeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET; // CERT_SET_KEY_CONTEXT_PROP_ID | CERT_SET_KEY_PROV_HANDLE_PROP_ID;
cryptKeyProvInfo.cProvParam = 0;
cryptKeyProvInfo.dwKeySpec = AT_SIGNATURE;
return CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &cryptKeyProvInfo) != FALSE;
}
しかし、CryptAcquirePrivateKey でも同じエラーが発生します。signtool は秘密鍵にアクセスできるため、ここではほんの少しだけ欠けていると思います
編集2
スクリーンショットには KEYEXCHANGE が表示されていますが、SIGNATURE を選択しました
編集3
LinkPrivateKey
機能を少し変更しましたが、動作するようになりました
bool LinkPrivateKey(PCCERT_CONTEXT cert)
{
CRYPT_KEY_PROV_INFO cryptKeyProvInfo;
memset(&cryptKeyProvInfo, 0, sizeof(cryptKeyProvInfo));
cryptKeyProvInfo.pwszContainerName = L"MSS";
cryptKeyProvInfo.pwszProvName = L"Luna Cryptographic Services for Microsoft Windows";
cryptKeyProvInfo.dwProvType = PROV_RSA_FULL;
cryptKeyProvInfo.dwFlags = 1; // CERT_SET_KEY_CONTEXT_PROP_ID | CERT_SET_KEY_PROV_HANDLE_PROP_ID;
cryptKeyProvInfo.dwKeySpec = AT_SIGNATURE;
return CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &cryptKeyProvInfo) != FALSE;
}