4

サーバーの 1 つに HTTPS 接続を行う C++ アプリケーションがあります。私の理想の世界では、次のことが起こることを望みます。

  1. アプリの起動
  2. アプリは、Windows がサーバーのルート CA を信頼するようにします (GUI は使用せず、システム コールのみを使用してください)。
  3. アプリはサーバーと通信し、その作業を行います。
  4. アプリは Windows にサーバーのルート CA を忘れさせます
  5. 終わり

このルート 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(...)

いくつかのメモ:

ありがとう!

4

1 に答える 1

3

他のアプリケーションがこの証明書を信頼しないようにするため、証明書の検証の一部を自分で行う必要があります。オプション SECURITY_FLAG_IGNORE_UNKNOWN_CA で CA チェックを無効にしてから、サーバー WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER に接続するためのコールバックを取得します。そのコールバックで、WINHTTP_OPTION_SERVER_CERT_CONTEXT を使用して証明書を取得し、検証を行います。希望する人でない場合はリクエストをキャンセル/クローズし、正しい場合はリクエストを続行します。

于 2009-11-05T16:39:10.420 に答える