Ich habe eine Web-API, die mit ein paar verschiedenen Diensten kommunizieren muss. Derzeit habe ich die Web-API so eingerichtet, dass sie das folgende Sicherheitsprotokoll verwendet:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Wenn die API über HttpClient
(etwa wie Twitter) zu einem anderen Dienst aufruft, wird sie dieses Protokoll verwenden. Gleichzeitig kann jedoch eine weitere Anfrage eingehen, um auf etwas aus der Cloud zuzugreifen, das aus welchem Grund auch immer TLS (nicht TLS 1.2) benötigt. Die Anforderung an die Cloud, bevor sie ausgelöst wird, setzt das Sicherheitsprotokoll erneut:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
Das Problem, auf das ich stoße, ist, wenn zwei getrennte und eindeutige Anfragen eingehen, eine für Twitter und eine für die Cloud, könnte das Sicherheitsprotokoll auf die "falsche" umschalten, bevor es gesendet wird, was die Anfrage verursacht Scheitern.
Gibt es eine Möglichkeit, das Sicherheitsprotokoll für die HttpClient
pro Anfrage festzulegen, damit ich nicht irgendwo in einem Singleton eine Einstellung vertauschen kann?
Es scheint keinen Weg zu geben, dies zu tun. Die Eigenschaft SecurityProtocol
wird nur in der internen Klasse TlsStream
an einer Stelle verwendet:
TlsStream
scheint alle internen TLS-Verbindungen wie HTTP, FTP und SMTP zu unterstützen.
Ich hatte gehofft, dass ServicePoint
Ihnen erlaubt, dies zu konfigurieren. Für viele Einstellungen bietet ServicePointManager
nur den Standardwert. Diese Hoffnung war unbegründet.
Das ist also ein ziemlich starker Beweis dafür, dass dies nicht möglich ist. Es ist jedoch kein Beweis.
Was sollten Sie tun? Ich würde die HTTP-Client-Bibliothek für den ungeraden Server ausschalten, mit dem Sie sprechen. HTTP ist kein besonders kompliziertes Protokoll. Ich bin mir sicher, dass eine andere Implementierung verfügbar ist.
Verwenden Sie alternativ einen Proxy, der die HTTPS-Verbindung auf Ihrem eigenen Server beendet. .NET befasst sich dann nur mit HTTP.
Tags und Links asp.net-web-api c# ssl http