私の会社は、同じSWの2つのインスタンス間でTLS1.2相互認証を実行することを目的とした.netベースのアプリケーション(SChannelに依存)を開発しました。1つはTLS1.2相互認証セッションでクライアントとして機能し、もう1つはサーバーとして機能します。
クライアントとサーバーの両方のSWインスタンスが異なるWindows OSサーバー(2008R2および2012R2)にデプロイされました。
Windows Server 2008 R2 OS(WIN 2008R2 OSで実行される「クライアント」と「サーバー」の両方のSWインスタンス)でアプリケーションを正常にテストしました。その場合、サーバーは、「証明書要求」セクションの下のTLS1.2ハンドシェイクの最初の「サーバーHello」メッセージ内に、信頼されたルートCA証明書ストア(ローカル)のコンテンツと一致する「識別名」のリストを提供します。コンピューター)TLS1.2 RFC標準に従って、同じサーバー上で実行されます。
ただし、Win2012 R2 OS環境で同じアプリケーションを(同じ証明書のセットを使用して)実行している場合、Server Helloメッセージの間に、証明書要求パートは空のDNリスト(つまり、リストされている0の証明書)を返し続けます。同じセットの信頼されたルートCAが、信頼されたルートCAストア(ローカルコンピューター)で入手できます。
SWがTLS1.2ハンドシェイクでクライアントとして機能し、2008R2または2012R2のいずれかで実行されている場合、SWは、ローカルコンピューター->個人->証明書で利用可能/インストールされたクライアント認証証明書を正常に使用できます。
私はプログラム暗号化機能のコード開発に関与していませんでしたが、ソフトウェアの問題ではなく、2008R2から2012R2に移行するときにOSレベルで導入された追加の設定が不足している可能性があると感じています。だれでも、適応する必要がある可能性のあるOS設定を提案できます。
ありがとうございました
IIS=でクライアント証明書認証を構成したことがありませんが、ここで何が問題になっているのかわかったと思います。Win2012では "SendTrustedIssuerList"のデフォルトはOFFです。
相互TLS認証のサーバー側の動作は、Win2012では異なります。つまり: デフォルトで信頼できる発行者リストを送信する動作はオフです:SendTrustedIssuerListレジストリキーのデフォルト値は0(デフォルトではオフ)です (アーカイブ ここ 。)以前のバージョンのWindowsサーバーでは手動で実行できたようですが、現在はデフォルトになっています。
さらに、Win2012が現在実行しているように見えるのは 許容可能なクライアント証明書CAの3つの証明書ストア全体の検索プロセス (アーカイブ ここ 。)です。 (つまり、「CTL」/「証明書信頼リスト」を介して受け入れ可能なCAのリストを生成する面倒なプロセスが不要になり、代わりに受け入れ可能なCAを新しい証明書ストアに移動/コピーするだけです。)
ただし、このような「信頼できる発行者リスト」は内部的に生成する必要がありますが、外部的にはクライアントに送信されません。これは、SendTrustedIssuerList
がデフォルトで0
になっているためです。
したがって、解決策は次のようになるようです:
インタラクティブアプリケーションの場合:
受け入れ可能なCAをクライアントに送信するように主張する場合は、SendTrustedIssuerList
を1
に強制します。しかし、その後 expect client Apple Safari to fail。 。(これは問題ではないことを期待しています。これは、Win2008r2セットアップですでに発生しているため、これについては触れないでください。)
受け入れ可能なCAをクライアントに送信する必要がない場合は、そのままにしておきます。ただし、許容できるクライアント証明書に関するヒントを提供しなくなったため、 クライアントの[ここでクライアント証明書をここで選択]ダイアログボックスが大きくなることを期待してください 。 (ただし、クライアントブラウザーは通常、実際にはそれほど多くのクライアント証明書を選択することはできません。そのため、リストは短い可能性があります。)
そして、あなたの場合のように、非インタラクティブなアプリケーションの場合:
ヒントを取得せずにクライアント側に適切なクライアント証明書を提供するように強制する。
または、サーバーにヒントを送信させ、クライアント側にヒントを取得させることもできます。