2

データに署名して復号化するタスクがありますが、秘密鍵は 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;
}
4

2 に答える 2

1

Luna の経験はありませんが、nCiper HSM ではうまくいきました。

certutil -repairstore -csp "nCipher Enhanced Cryptographic Provider" My <serial number of certificate>

ここで、「nCipher Enhanced Cryptographic Provider」は、HSM に付属する CSP の名前です。

証明書のシリアル番号は、次のコマンドを使用して取得できます。

certutil -store My

Local_Machine\My store にあるすべての証明書を出力します。シリアル番号は ====== のような束の間になります================ Certificate 5 ================。また、シリアル番号、サブジェクトなどの証明書に関する情報を解析し、暗号化/復号化テストを実行して証明書の有用性を検証します。

バインディングを修復したら、この (2 番目の) コマンドを使用して、バインディングが正常に行われたことを確認できます。最初のコマンドの出力にだまされないでください。成功以外の結果が出力されるのを見たことがありません。

certutil の使用方法の詳細については、こちらを参照してください。

于 2014-09-08T12:21:35.870 に答える
1

私の投稿で述べたように、次を使用して秘密鍵をリンクできます

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;
}

L"MSS"サーバーで定義されているキー コンテナーに置き換える必要があります。keymap.exeLunSA は、コンテナー名を取得するために LunaCSP と共にインストールされるツールを提供します。

于 2014-09-08T15:43:20.877 に答える