2

概要

で PKCS#10 CSR を作成しcertreq、オプションを設定しましたExportable=TRUE。これにより、 location の下にキーが正常に作成されますREQUEST。キーが の有効な証明書もありますMY。それらのいずれかにアクセスしようとすると、CryptoAPI はエラー コードを報告します0x80090016

異なるアクセス権で実行しても、これまでのところこの問題は解決できませんでした。

ゴール

私の目標は、 と の両方のキーを取得することMYですREQUEST。それらのいずれかを呼び出すとCryptAcquireContextA()、失敗します。

システム

ウィンドウズ 7 x64

サンプル ソース コード

私の完全なコードは次のようになります。

hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, "REQUEST");
pCert = CertFindCertificateInStore(hStore, X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, "CERTIFICATE_SUBJECT", NULL);

CertGetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, NULL, &len);
pinfo = (CRYPT_KEY_PROV_INFO *) malloc(len);
CertGetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, pinfo, &len);

provname = wide_to_asc(pinfo->pwszProvName);
contname = wide_to_asc(pinfo->pwszContainerName);

if(!CryptAcquireContextA(&hCryptProv, contname, provname, pinfo->dwProvType, 0)) {
    err = GetLastError();
    fprintf(stderr, "Error: 0x%x\n", err);
}
CryptGetUserKey(hCryptProv, pinfo->dwKeySpec, &hUserkey);

このコードは、ほとんどがOpenSSL capi エンジンからコピーされたものです。エンジンが故障したので、エラーを検索するために最小限のコードを作成しました。

エラー

これを実行すると、 output で失敗しますError: 0x80090016これは、 Microsoftによると、次の 3 つのことのいずれかを意味します。

  • キー コンテナが存在しません。
  • キー コンテナーへのアクセス権がありません。
  • Protected Storage サービスが実行されていません。

私はこれまでに何をしましたか?

  • サービス「Protected Storage」を開始
  • 検証済みのコンテナが MMC および証明書スナップインと共に存在します。Local Computer
  • ユーザーコンテキストのユーザーストアで同じコードを実行しました-うまくいきました

ファイル システムのアクセス許可

グーグルで調べた後、ファイルシステムのアクセス許可を変更しようとしました。contnameコードの変数を見てファイルを検索することで、ファイルを見つけました。それらのアクセス許可を変更しました (より正確には、親フォルダーのアクセス許可を変更しました)。これで の問題は修正されましたがMY、 では変更できないようですREQUEST

ここでの 1 つの注意点は、私のコンテナーMYがここにあるように見えることです。

%APPDATA%\Microsoft\Crypto\RSA\S-1-5-21-1650336054-1974872081-316617838-545102

私はそれREQUESTを別のアドレスで見つけました:

%ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys

ここでの仕組みがよくわからないので、それらを別の場所に配置する理由を説明できません (1 つはユーザー中心で、もう 1 つはシステム フォルダーです)。ストアは通常のMY管理者プロンプトとコマンドで作成されcertreq -new inf_file.inf cert-csr.csr、証明書を受け取った後、certreq -accept cert.pem. 次に、同じコマンドで新しい csr を作成しました。

さまざまな特権レベル

次の権限でプログラムを実行しようとしました。

  • 私のローカル ユーザー アカウント
  • 管理者プロンプト (cmd->管理者として開始)
  • nt 権限\システム (whoami出力)

サービスプロンプトを受け取るために、 MaaSters Centerpsexec.exe –ids cmd.exeからのヒントに従って実行しました

最後の言葉

この問題をさらに絞り込む方法についてのヘルプやガイダンスは大歓迎です。

4

2 に答える 2

1

私はついにこの問題を解決することができました、そしてそれは私が思っていたよりずっと簡単です。明確なコンテナ名を受け取ると確信しており、より具体的CryptAcquireContextにする必要はありませんが、実際にはフラグを渡す必要がありますCRYPT_MACHINE_KEYSET

したがって、私の関数呼び出しは次のようになります。

CryptAcquireContextA(&hCryptProv, contname, provname, pinfo->dwProvType, CRYPT_MACHINE_KEYSET)

残念ながら、これはOpenSSLエンジンではサポートされていないため、エンジンで自分で変更する必要があります。

于 2012-07-23T12:24:27.703 に答える
0

MSDN を参照してください: 「管理者ではないユーザーがこのフラグを使用せずに作成したキー コンテナーには、キー コンテナーを作成したユーザーとローカル システム アカウントのみがアクセスできます。」

詳細はこちら: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx

于 2016-07-19T20:48:44.720 に答える