HTTPS 要求の相互認証にクライアント証明書を使用する必要がある特定のアプリケーションがあります。サーバーには、サーバーの証明書ストアに存在しない自己署名クライアント証明書を受け入れることができる柔軟な証明書検証ポリシーがあります。これは、curl をクライアントとして使用すると問題なく動作することが知られています。
テストとパケット スニッフィングを通じて私が判断したことは、Microsoft の ASP.NETHttpClient
が SSL ハンドシェイク中に過度にスマートになろうとしているということです。WebRequestHandler.ClientCertificates
この特定のクライアントは、サーバーの信頼されたルートの 1 つへの信頼チェーンがある場合にのみ、(コレクションからの) クライアント証明書を使用します。私が観察したことは、信頼チェーンを持つ証明書がない場合、クライアントはハンドシェイク中に証明書をまったく送信しないということです。
これは理解できるデフォルトの動作ですが、過度に制限的であり、無効にする方法がないようです。WebRequestHandler
を含む他のさまざまなプロパティAuthenticationLevel
を試しましClientCertificateOptions
たが、役に立ちませんでした。
サーバー側で検証されないように見えてもHttpClient
、コレクションで利用可能なクライアント証明書を強制的に送信する方法はありますか? ClientCertificates
このクライアントが機能することが本当に必要なので、私は単純なソリューションと汚い(リフレクションハック)ソリューションの両方にオープンです。