1

クライアントへの安全な 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や外部ツールを使用せずにプログラムで理想的に?

4

2 に答える 2

1

読み取りおよび書き込みとしてストアにアクセスする権限がないため、このエラーが発生しています。読み取りとしてのみアクセスできます。したがって、CERT_STORE_READONLY_FLAG を追加する必要があるため、次のようになります。

HCERTSTORE systemStore = CertOpenStore(
            CERT_STORE_PROV_SYSTEM,
            0,
            0,
            CERT_STORE_OPEN_EXISTING_FLAG |
                CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_READONLY_FLAG ,
            L"ROOT");

ストアに変更を加え、読み取り専用にしない場合、C++ アプリケーションを実行するときに管理者の昇格が必要になることを意味します。

于 2013-01-24T22:01:01.690 に答える