it-swarm.com.de

"Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten." Mit SSL-Zertifikat

Problem: In meinen Protokollen wird die folgende Ausnahme angezeigt: "Die zugrunde liegende Verbindung wurde geschlossen: Ein unerwarteter Fehler ist beim Senden aufgetreten." Die OEM-Integration mit unserem E-Mail-Marketing-System wird zu zufälligen Zeiten unterbrochen, die zwischen [1 Stunde - 4 Stunden] variieren.

Meine Website wird auf einem Windows Server 2008 R2 mit IIS 7.5.7600) gehostet. Diese Website verfügt über eine große Anzahl von OEM-Komponenten und ein umfassendes Dashboard. Mit Ausnahme der anderen Elemente der Website funktioniert alles einwandfrei Mit einer unserer E-Mail-Marketing-Komponenten, die wir als Iframe-Lösung in unserem Dashboard verwenden, sende ich ein httpWebRequest-Objekt mit allen Anmeldeinformationen und erhalte eine URL zurück, die ich in einen Iframe eingebe Es funktioniert nur für einige Zeit [1 Stunde - 4 Stunden] und dann erhalte ich die folgende Ausnahme: "Die zugrunde liegende Verbindung wurde geschlossen: Ein unerwarteter Fehler ist beim Senden aufgetreten" und selbst wenn das System versucht, die URL von httpWebRequest abzurufen, schlägt dies fehl Mit der gleichen Ausnahme. Die einzige Möglichkeit, es wieder zum Laufen zu bringen, besteht darin, den Anwendungspool zu recyceln oder irgendetwas in web.config zu bearbeiten. Ich bin wirklich erschöpft, was ich mir vorstellen kann.

Option versucht

Explizit hinzugefügt, keep-alive = false

keep-alive = true

Timeout erhöht: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />

Ich habe diese Seite auf eine Nicht-SSL-Website hochgeladen, um zu überprüfen, ob das SSL-Zertifikat auf unserem Produktionsserver die Verbindung herstellt, um auf irgendeine Weise die Verbindung zu trennen.

Jede Richtung zur Auflösung wird sehr geschätzt.

Code:

Public Function CreateHttpRequestJson(ByVal url) As String
    Try
        Dim result As String = String.Empty
        Dim httpWebRequest = DirectCast(WebRequest.Create("https://api.xxxxxxxxxxx.com/api/v3/externalsession.json"), HttpWebRequest)
        httpWebRequest.ContentType = "text/json"
        httpWebRequest.Method = "PUT"
        httpWebRequest.ContentType = "application/x-www-form-urlencoded"
        httpWebRequest.KeepAlive = False
        'ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

        'TODO change the integratorID to the serviceproviders account Id, useremail 
        Using streamWriter = New StreamWriter(httpWebRequest.GetRequestStream())
            Dim json As String = New JavaScriptSerializer().Serialize(New With { _
            Key .Email = useremail, _
            Key .Chrome = "None", _
            Key .Url = url, _
            Key .IntegratorID = userIntegratorID, _
            Key .ClientID = clientIdGlobal _
            })

            'TODO move it to the web.config, Following API Key is holonis accounts API Key
            SetBasicAuthHeader(httpWebRequest, holonisApiKey, "")
            streamWriter.Write(json)
            streamWriter.Flush()
            streamWriter.Close()

            Dim httpResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse)
            Using streamReader = New StreamReader(httpResponse.GetResponseStream())
                result = streamReader.ReadToEnd()
                result = result.Split(New [Char]() {":"})(2)
                result = "https:" & result.Substring(0, result.Length - 2)
            End Using
        End Using
        Me.midFrame.Attributes("src") = result
    Catch ex As Exception
        objLog.WriteLog("Error:" & ex.Message)
        If (ex.Message.ToString().Contains("Invalid Email")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Email Taken")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Invalid Access Level")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Unsafe Password")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Invalid Password")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Empty Person Name")) Then
            'TODO Show message on UI
        End If
    End Try
End Function


Public Sub SetBasicAuthHeader(ByVal request As WebRequest, ByVal userName As [String], ByVal userPassword As [String])
    Dim authInfo As String = Convert.ToString(userName) & ":" & Convert.ToString(userPassword)
    authInfo = Convert.ToBase64String(Encoding.[Default].GetBytes(authInfo))
    request.Headers("Authorization") = "Basic " & authInfo
End Sub`
94
Arvind Morwal

Für mich war es tls12:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
159
Lanklaas

Wenn Sie mit .Net 4.0 nicht weiterkommen und der Zielstandort TLS 1.2 verwendet, benötigen Sie stattdessen die folgende Zeile. ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

source: TLS 1.2 und .NET Support: So vermeiden Sie Verbindungsfehler

52
Tochi

Der folgende Code hat das Problem behoben

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3
18
Arvind Morwal

In meinem Fall wurde die Site, zu der ich eine Verbindung herstelle, auf TLS 1.2 aktualisiert. Daher musste ich .net 4.5.2 auf meinem Webserver installieren, um dies zu unterstützen.

11
aboy021

Ich habe seit Tagen das gleiche Problem mit einer Integration, die auch "früher funktionierte".

Aus purer Depression habe ich es einfach versucht

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;

Dies hat es für mich gelöst ... obwohl die Integration ausschließlich SSLv3 verwendet.

Ich kam zu der Erkenntnis, dass etwas nicht in Ordnung ist, seit Fiddler berichtet hat, dass es eine "leere TLS-Verhandlungs-Chiffre" oder ähnliches gibt.

Hoffentlich klappt es!

9
Medismal

Wechseln Sie zu Ihrer web.config/App.config, um zu überprüfen, welche .net-Laufzeitumgebung Sie verwenden

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

Hier ist die Lösung:

  1. .NET 4.6 und höher. Sie müssen keine zusätzlichen Arbeiten ausführen, um TLS 1.2 zu unterstützen. Es wird standardmäßig unterstützt.

  2. .NET 4.5. TLS 1.2 wird unterstützt, ist jedoch kein Standardprotokoll. Sie müssen sich anmelden, um es zu verwenden. Mit dem folgenden Code wird TLS 1.2 als Standard festgelegt. Führen Sie TLS 1.2 aus, bevor Sie eine Verbindung zu einer gesicherten Ressource herstellen:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

  1. .NET 4.0. TLS 1.2 wird nicht unterstützt. Wenn jedoch .NET 4.5 (oder höher) auf dem System installiert ist, können Sie sich auch dann für TLS 1.2 entscheiden, wenn Ihr Anwendungsframework dies nicht unterstützt. Das einzige Problem ist, dass SecurityProtocolType in .NET 4.0 keinen Eintrag für TLS1.2 enthält. Daher müssen wir eine numerische Darstellung dieses Aufzählungswerts verwenden:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

  1. .NET 3.5 oder niedriger. TLS 1.2 wird nicht unterstützt (*) und es gibt keine Problemumgehung. Aktualisieren Sie Ihre Anwendung auf eine neuere Version des Frameworks.
8
Guo Huang

Ich habe festgestellt, dass dies ein Zeichen dafür ist, dass auf dem Server, auf dem Sie Code bereitstellen, ein altes .NET-Framework installiert ist, das TLS 1.1 oder TLS 1.2 nicht unterstützt. Zu behebende Schritte:

  1. Installation der neuesten .NET Runtime auf Ihren Produktionsservern (IIS & SQL)
  2. Installieren Sie das neueste .NET Developer Pack auf Ihren Entwicklungscomputern.
  3. Ändern Sie die Einstellungen für "Zielframework" in Ihren Visual Studio-Projekten auf das neueste .NET-Framework.

Sie können das neueste .NET Developer Pack und Runtime unter folgender URL herunterladen: http://getdotnet.azurewebsites.net/target-dotnet-platforms.html

6
Patrick

Wir hatten dieses Problem, bei dem eine Website, die auf unsere API zugegriffen hat, die Meldung "Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.".

Ihr Code war eine Mischung aus .NET 3.x und 2.2, was meines Wissens bedeutet, dass sie TLS 1.0 verwenden.

Die folgende Antwort kann Ihnen bei der Diagnose des Problems helfen, indem Sie TLS 1.0, SSL 2 und SSL3 aktivieren. Um jedoch ganz klar zu sein, möchten Sie dies langfristig nicht tun, da alle drei dieser Protokolle verwendet werden gelten als unsicher und sollte nicht mehr verwendet werden:

Um IIS auf ihre API-Aufrufe zu antworten, mussten wir Registrierungseinstellungen auf dem IIS-Server hinzufügen, um TLS-Versionen explizit zu aktivieren. HINWEIS: Sie müssen den Windows-Server neu starten (nicht nur = IIS Service) nach diesen Änderungen:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.0\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.0\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.1\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.1\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.2\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.2\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

Wenn dies nicht der Fall ist, können Sie auch experimentieren, indem Sie den Eintrag für SSL 2.0 hinzufügen:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

Um klar zu sein, ist dies keine gute Lösung , und die richtige Lösung besteht darin, den Anrufer zu veranlassen, TLS 1.2 zu verwenden, aber das oben Genannte kann helfen, dies zu diagnostizieren Das ist das Problem.

Mit diesem Powershell-Skript können Sie das Hinzufügen dieser Registrierungseinträge beschleunigen:

$ProtocolList       = @("SSL 2.0","SSL 3.0","TLS 1.0", "TLS 1.1", "TLS 1.2")
$ProtocolSubKeyList = @("Client", "Server")
$DisabledByDefault = "DisabledByDefault"
$Enabled = "Enabled"
$registryPath = "HKLM:\\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\"

foreach($Protocol in $ProtocolList)
{
    Write-Host " In 1st For loop"
        foreach($key in $ProtocolSubKeyList)
        {         
            $currentRegPath = $registryPath + $Protocol + "\" + $key
            Write-Host " Current Registry Path $currentRegPath"
            if(!(Test-Path $currentRegPath))
            {
                Write-Host "creating the registry"
                    New-Item -Path $currentRegPath -Force | out-Null             
            }
            Write-Host "Adding protocol"
                New-ItemProperty -Path $currentRegPath -Name $DisabledByDefault -Value "0" -PropertyType DWORD -Force | Out-Null
                New-ItemProperty -Path $currentRegPath -Name $Enabled -Value "1" -PropertyType DWORD -Force | Out-Null    
    }
}
 
Exit 0

Dies ist eine geänderte Version des Skripts von der Microsoft-Hilfeseite für TLS für VMM einrichten . Dieser basics.net-Artikel war die Seite, auf der ich ursprünglich auf die Idee gekommen bin, mir diese Einstellungen anzusehen.

3
tomRedox

Einfach hinzufügen:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

2
M.Qudah

Die Verwendung eines HTTP-Debugging-Proxys kann dazu führen, z. B. Fiddler.

Ich habe ein PFX-Zertifikat aus einer lokalen Datei geladen (Authentifizierung bei Apple.com) und es ist fehlgeschlagen, weil Fiddler dieses Zertifikat nicht weitergeben konnte.

Deaktivieren Sie Fiddler, um zu überprüfen, ob dies die Lösung ist. Möglicherweise müssen Sie das Zertifikat auf Ihrem Computer installieren oder auf eine Weise, die Fiddler verwenden kann.

1
Simon_Weaver

Der folgende Code hat mein Problem gelöst:

request.ProtocolVersion = HttpVersion.Version10; // THIS DOES THE TRICK
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
0

Sie ändern einfach Ihre Anwendungsversion wie 4.0 auf 4.6 und veröffentlichen diesen Code.

Fügen Sie auch folgende Codezeilen hinzu:

httpRequest.ProtocolVersion = HttpVersion.Version10; 
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
0
Viresh

Wenn jemand hilft, war unser Problem mit dem fehlenden Zertifikat. Die Umgebung ist Windows Server 2016 Standard mit .Net 4.6.

Es gibt einen selbst gehosteten WCF-Dienst (https URI), für den Service.Open () fehlerfrei ausgeführt wird. Ein anderer Thread greift weiterhin auf https: // OurIp: 443/OurService? Wsdl zu, um sicherzustellen, dass der Dienst verfügbar ist. Der Zugriff auf die WSDL schlug fehl mit:

Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.

Die Verwendung von ServicePointManager.SecurityProtocol mit entsprechenden Einstellungen funktionierte nicht. Das Spielen mit Serverrollen und Funktionen hat auch nicht geholfen. Dann trat Jaise George , die SE, ein und löste das Problem in ein paar Minuten. Jaise hat ein selbstsigniertes Zertifikat im IIS installiert, um das Problem zu beheben. Dies ist, was er getan hat, um das Problem zu beheben:

(1) Öffnen Sie IIS manager (inetmgr) (2) Klicken Sie im linken Fensterbereich auf den Serverknoten und doppelklicken Sie auf "Serverzertifikate". (3) Klicken Sie auf "Selbstsigniertes Zertifikat erstellen" "im rechten Bereich und geben Sie alles ein, was Sie für den Anzeigenamen wünschen. (4) Klicken Sie im linken Bereich auf" Standardwebsite ", klicken Sie im rechten Bereich auf" Bindungen ", klicken Sie auf" Hinzufügen ", wählen Sie" https ", Wählen Sie das soeben erstellte Zertifikat aus und klicken Sie auf "OK". (5) Greifen Sie auf die https-URL zu, auf die zugegriffen werden soll.

0
DiligentKarma