サーバーへの安全な接続を確立しようとする .NET サービスを開発しています。サービスは、サーバーが安全な接続をサポートしているかどうかを事前に知りません。そのため、私は単に安全な接続を確立しようとし、それが失敗した場合は安全でない接続にフォールバックします.
私はTcpClient
一緒に使用していSslStream
ます:
tcpClient.BeginConnect(hostname, port, Start, null);
private void Start(IAsyncResult asyncResult)
{
X509CertificateCollection certCollection = new X509CertificateCollection();
certCollection.Add(new X509Certificate2("cert.p12", "pw"));
SslStream sslStream = new SslStream(tcpClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateCertificate));
sslStream.ReadTimeout = 2000;
sslStream.BeginAuthenticateAsClient("name", certCollection, SslProtocols.Tls, false, AuthenticateCallback, sslStream);
}
private void AuthenticateCallback(IAsyncResult asyncResult)
{
stream.ReadTimeout = -1;
// secure connection has been established
}
サーバーが要求された暗号化をサポートしていない場合、コールバック メソッドが呼び出されるまでに 2 分かかります。代わりに同期メソッドを使用するとAuthenticateAsClient()
、予想される 2 秒しかかかりません ( を設定することで要求されますReadTimeout
)。
sslStream.AuthenticateAsClient("ESLD Server", certCollection, SslProtocols.Tls, false);
タイムアウトが同期メソッドにのみ適用されるのはなぜですか? 非同期メソッドのコールバック時間を短縮するにはどうすればよいですか? または、サーバーが安全な接続をサポートしているかどうかを確認するためのより良い方法はありますか?