概要
で 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
からのヒントに従って実行しました
最後の言葉
この問題をさらに絞り込む方法についてのヘルプやガイダンスは大歓迎です。