サーバーの 1 つに HTTPS 接続を行う C++ アプリケーションがあります。私の理想の世界では、次のことが起こることを望みます。
- アプリの起動
- アプリは、Windows がサーバーのルート CA を信頼するようにします (GUI は使用せず、システム コールのみを使用してください)。
- アプリはサーバーと通信し、その作業を行います。
- アプリは Windows にサーバーのルート CA を忘れさせます
- 終わり
このルート CA が他のアプリから信頼される必要はありません。したがって、証明書をシステム全体にインストールしたくありません。ユーザーが管理者権限を必要としない場合も希望します。
私の最初の計画は、インメモリ (CERT_STORE_PROV_MEMORY) ストアを作成し、そこに証明書を追加してから、CertAddStoreToCollection を使用してそのインメモリ ストアをシステム ストアに追加することでした。
すべての CryptoAPI 関数呼び出しは成功しますが、WinHttp はそれを好みません。
これが私がやっていることの骨子です - おそらく誰かがトリックを知っていますか? それとも、そもそもこれは頭がおかしいのでしょうか?
hMemStore = CertOpenStore(CERT_STORE_PROV_MEMORY, ...);
pCert = CertCreateCertificateContext(..., pCertBytes, ...);
CertAddCertificateContextToStore(hMemStore, pCert, ...);
hRootStore = CertOpenSystemStore(NULL, "ROOT");
CertAddStoreToCollection(hRootStore, hMemStore, ...);
// Then later on...
WinHttpSendRequest(...)
いくつかのメモ:
- WinHttp の SECURITY_FLAG_IGNORE_UNKNOWN_CA を使用するとすべてが機能するため、これが本当に問題であると確信しています。
- 私はすでにこのSOの質問を見てきました-それは近いですが、アプリの実行中に証明書を一時的にのみ信頼するという問題には対処していません。
ありがとう!