Ich entwickle einen .NET-Dienst, der zu versuchen, eine sichere Verbindung zu einem Server herzustellen. Der Dienst weiß im Voraus nicht, ob der Server sichere Verbindungen unterstützt. Deshalb versuche ich einfach, eine sichere Verbindung herzustellen und falls das scheitert, falle ich auf die unsichere Verbindung zurück.
Ich verwende TcpClient
zusammen mit 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;
// Sichere Verbindung wurde hergestellt
}
Falls der Server die angeforderte Verschlüsselung nicht unterstützt, dauert es 2 Minuten, bevor die Rückruffunktion aufgerufen wird. Wenn stattdessen die synchrone Methode AuthenticateAsClient()
verwendet wird, dauert es nur die erwarteten 2 Sekunden (wie durch das Setzen des ReadTimeout
angefordert):
sslStream.AuthenticateAsClient("ESLD Server", certCollection, SslProtocols.Tls, false);
Warum gilt das Timeout nur für die synchrone Methode? Wie kann ich die Rückrufzeit für die asynchrone Methode reduzieren? Oder gibt es einen besseren Ansatz, um zu überprüfen, ob der Server sichere Verbindungen unterstützt?