“La connexion sous-jacente a été fermée: Une erreur inattendue s'est produite lors de l'envoi.” Avec un Certificat SSL
Question : je reçois cette exception "LA CONNEXION sous-jacente a ÉTÉ FERMÉE: UNE ERREUR INATTENDUE s'est PRODUITE lors de l'envoi" dans mes logs et c'est la rupture de notre intégration OEM avec notre système d'email marketing à des moments aléatoires variant de [1 heure à 4 heures]
Mon site web est hébergé sur un serveur windows 2008 R2 avec IIS 7.5.7600. Ce site web a un grand nombre de composants OEM et tableau de bord très complet. Tout fonctionne bien avec tous les autres éléments de ce site, sauf avec l'un de nos e-mail marketing qui nous utilisent comme une solution iframe au sein de notre tableau de bord. La façon dont cela fonctionne est, j'ai envoyer un httpWebRequestobject avec tous les pouvoirs et je reçois une url de retour que j'ai mis dans un iframe et il fonctionne. Mais elle ne fonctionne que pour un certain temps [1 heure à 4 heures ]puis-je obtenir le ci-dessous exception "LA CONNEXION sous-jacente a ÉTÉ FERMÉE: UNE ERREUR INATTENDUE s'est PRODUITE lors de l'envoi" et même si le système tente de récupérer l'URL de la httpWebRequest il ne fonctionne pas avec la même exception. La seule façon de le faire fonctionner à nouveau est de recycler l'application de la piscine ou tout est édité dans le web.config. Je suis vraiment épuisé toutes les option que je pouvais imaginer.
Option essayé
Explicitement ajouté, keep-alive = false
keep-alive = true
Augmenté le temps : <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
J'ai téléchargé cette page non SSL site web pour vérifier si le certificat SSL sur notre serveur de production est de rendre la connexion à supprimer certains comment.
N'importe quelle direction vers la résolution est grandement apprécié.
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`
- Avez-vous jamais comprendre cela?
- oui, j'ai été en mesure de le faire fonctionner avec ce code ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Ou SecurityProtocolType.Ssl3
- J'étais sur le point de mourir pour la même question. M'a fallu plusieurs heures aux prises avec le même problème. Merci pour vous commentaires, il a sauvé ma journée.
- vous devez ajouter votre commentaire en guise de réponse
- Dans mon cas, l'exécution du site web dans Visual Studio 15 tout va bien, mais à la fin, parce que je ne peut pas mettre à niveau cadre dans le serveur, et de les forcer TLS 1.2 et la désactivation keep-alive ne fonctionnent pas, j'ai eu à l'installation d'un intermédiaire de du serveur web de proxy le serveur web cible que les gouttes de la connexion.
Vous devez vous connecter pour publier un commentaire.
Pour moi, c'était tls12:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls
Si vous êtes coincé avec .Net 4.0 et le site cible à l'aide de TLS 1.2, vous avez besoin de la ligne suivante à la place.
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
source: TLS 1.2 et .NET Support: Comment faire pour Éviter les Erreurs de Connexion
(SecurityProtocolType)768
peut être utilisé pour "Tls11" (c'est à dire TLS 1.1).Le code ci-dessous résolu le problème
ServicePointManager.SecurityProtocol
est un objet statique qui signifie que la modification de cette valeur affecte tous les sous-séquenceWebRequest
ouWebClient
appels. Vous pourriez créer différentsAppDomain
si vous voulezServicePointManager
d'avoir des paramètres différents. Voir stackoverflow.com/questions/3791629/... pour plus de détails.Dans mon cas, le site que je suis connecte a mis à niveau vers TLS 1.2. Par conséquent, j'ai dû l'installer .net 4.5.2 sur mon serveur web, afin de le soutenir.
J'ai eu le même problème depuis plusieurs jours, avec une intégration qui viens aussi de "l'habitude de travailler avant".
De volume de dépression, j'ai juste essayé
Cela a résolu pour moi..même si l'intégration strictement ne fait que l'utilisation de SSLv3.
Je suis venu à la réalisation que quelque chose de si de depuis Fiddler a rapporté en disant qu'il y a un "vide de négociation TLS chiffre" ou quelque chose de semblable.
Espérons que cela fonctionne!
Aller à votre site web.config/App.config pour vérifier .net vous utilisez
Voici la solution:
.NET de 4,6 et au-dessus. Vous n'avez pas besoin de faire un travail supplémentaire pour prendre en charge TLS 1.2, il est pris en charge par défaut.
.NET 4.5. TLS 1.2 est pris en charge, mais ce n'est pas un protocole par défaut. Vous avez besoin de décider de les utiliser. Le code suivant va faire TLS 1.2 par défaut, assurez-vous de l'exécuter avant de faire une connexion à une ressource sécurisée:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
J'ai trouvé que c'est un signe que le serveur sur lequel vous êtes le déploiement de code a un vieux .NET framework est installé, qui ne prend pas en charge TLS 1.1 ou TLS 1.2. Étapes de correction:
Vous pouvez obtenir la dernière .NET Developer Pack et d'Exécution à partir de cette URL: http://getdotnet.azurewebsites.net/target-dotnet-platforms.html
Nous avons eu ce problème selon lequel un site web qui a été d'accéder à nos API a été l'obtention de la “La connexion sous-jacente a été fermée: Une erreur inattendue s'est produite lors de l'envoi.” message.
Leur code était un mélange de .NET 3.x et 2.2, qui, comme je comprends, cela signifie qu'ils sont à l'aide de TLS 1.0.
La réponse ci-dessous peuvent vous aider à diagnostiquer le problème en permettant d'TLS 1.0, SSL, 2 et SSL3, mais pour être très clair, vous ne voulez pas le faire à long terme, comme tous les trois de ces protocoles sont considérés comme risqués et ne doit plus être utilisé:
Pour obtenir notre IIS pour répondre à leurs appels de l'API, nous avons dû ajouter des paramètres du registre sur le IIS du serveur pour activer explicitement les versions de TLS - REMARQUE: Vous devez redémarrer le serveur Windows (et pas seulement le service IIS) après avoir fait ces changements:
Si ce n'est pas cela, vous pouvez également expérimenter avec l'ajout de l'entrée de SSL 2.0:
Pour être clair, ce n'est pas une solution sympa, et que la bonne solution est d'obtenir de l'appelant pour utiliser le protocole TLS 1.2, mais le ci-dessus peut aider à diagnostiquer que c'est le problème.
Vous pouvez accélérer l'ajout de ceux reg entrées avec ce script powershell:
C'est une version modifiée du script à partir de la page d'aide de Microsoft pour Configurer le protocole TLS pour VMM. Cette basics.net l'article est la page qui à l'origine, m'a donné l'idée de regarder ces paramètres.
Juste ajouter:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
À l'aide d'un HTTP proxy de débogage peuvent être en cause - comme Fiddler.
J'ai été chargement d'un fichier PFX certificat à partir d'un fichier local (authentification Apple.com) et il a échoué parce que le Violoneux, n'était pas en mesure de passer ce certificat sur.
Essayer de désactiver le violon pour vérifier et si c'est la solution, alors vous devrez probablement installer le certificat sur votre machine ou d'une certaine façon que Fiddler peut l'utiliser.
Le code ci-dessous résolu mon problème :
Il si l'aide à quelqu'un, le nôtre était un problème de certificat manquant. L'environnement est Windows Server 2016 Standard avec .Net 4.6.
Il y a une auto hébergé service WCF https URI, pour qui le Service.Open() exécute sans erreur. Un autre thread permettrait de maintenir l'accès https://OurIp:443/OurService?wsdl pour s'assurer que le service n'était disponible. Accéder au WSDL utilisé pour échouer avec:
La connexion sous-jacente a été fermée: Une erreur inattendue s'est produite lors de l'envoi.
À L'Aide De ServicePointManager.SecurityProtocol avec les paramètres applicables n'ont pas de travail. Jouer avec les rôles et fonctionnalités de serveur n'a pas aidé non plus. Est alors intervenu dans Jaise George, le SOI, la résolution de la question dans un couple de minutes. Jaise installé un certificat auto-signé dans IIS, poofing la question. C'est ce qu'il a fait pour résoudre le problème:
(1) Ouvrez le gestionnaire des services IIS (inetmgr)
(2) Cliquez sur le nœud du serveur dans le panneau de gauche, double-cliquez sur "certificats de Serveur".
(3) Cliquez sur "Créer un Certificat Auto-Signé" sur la droite de l'écran et tapez ce que vous voulez pour le nom convivial.
(4) Cliquez sur “site Web par Défaut” dans le panneau de gauche, cliquez sur "Liaisons" sur le panneau de droite, cliquez sur "Ajouter", sélectionnez "https", sélectionnez le certificat que vous venez de créer, puis cliquez sur "OK"
(5) l'Accès à l'URL https, il doit être accessible.
Il suffit de changer la version de votre application comme 4.0 4.6 et la publication de ces code.
Également ajouter ci-dessous les lignes de code: