クライアントへの安全な SSL 接続を設定するために CryptoAPI と Schannel を使用するサーバー アプリケーションを作成しています。サーバーは、検証のためにクライアントに証明書を送信するように要求します ( でASC_REQ_MUTUAL_AUTH
フラグを設定することによりAcceptSecurityContext
)。
私が抱えている問題は、一部のクライアント (つまり、 を使用しているクライアントjavax.net.ssl
) がクライアント証明書を渡さないことです (そうするように構成されていても)。これは、クライアント証明書の署名に使用された CA 証明書が、ハンドシェイク中にクライアントに渡された CA のリストに含まれていないためだと思われます。
このリストに CA 証明書を追加するために、次のバリエーションを実行しようとしました。
PCERT_CONTEXT caCertContext = ...; /* Imported from a DER formatted file */
HCERTSTORE systemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
0,
CERT_STORE_OPEN_EXISTING_FLAG |
CERT_SYSTEM_STORE_LOCAL_MACHINE,
L"ROOT");
bool ok = CertAddCertificateContextToStore(
systemStore,
caCertContext,
CERT_STORE_ADD_USE_EXISTING,
NULL);
if (!ok)
{
std::cerr << "Could not add certificate to system store!" << std::endl;
}
上記の例では、CertAddCertificateContextToStore
常に失敗します。に変更CERT_SYSTEM_STORE_LOCAL_MACHINE
するCERT_SYSTEM_STORE_CURRENT_USER
と、証明書の確認を求めるポップアップが表示されますが、CA 証明書を受け入れても、クライアントに送信されるリストに表示されません。
また、システム ストア コレクションを一時メモリ ストア (ここから拾ったもの) で拡張しようとしましたが、役に立ちませんでした。
これを解決する方法を知っている人はいますか?GUIや外部ツールを使用せずにプログラムで理想的に?