Mon client m'a informé de problèmes avec son SSL et Internet Explorer. Ils ont déclaré avoir des problèmes de confiance lorsqu'ils accédaient à l'URL.
J'accède au JSON via HTTPS. Le site Web repose sur un serveur et j'utilise l'application de console sur mon ordinateur local. J'essaie de contourner le certificat SSL, cependant, mon code échoue toujours.
Puis-je modifier HttpWebRequest pour résoudre ce problème?
Je reçois cette erreur en utilisant ce code:
// You must change the URL to point to your Web server.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
req.AllowAutoRedirect = true;
// allows for validation of SSL conversations
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
WebResponse respon = req.GetResponse();
Stream res = respon.GetResponseStream();
string ret = "";
byte[] buffer = new byte[1048];
int read = 0;
while ((read = res.Read(buffer, 0, buffer.Length)) > 0)
{
//Console.Write(Encoding.ASCII.GetString(buffer, 0, read));
ret += Encoding.ASCII.GetString(buffer, 0, read);
}
return ret;
J'ai activé la journalisation en utilisant ce code:
http://blogs.msdn.com/b/dgorti/archive/2005/09/18/471003.aspx
Le journal était dans le dossier bin/debug (j'étais en mode débogage pour mon application de console). Vous devez ajouter le type de protocole de sécurité SSL 3.
J'ai reçu une incompatibilité d'algorithme dans le journal. Voici mon nouveau code:
// You must change the URL to point to your Web server.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
// Skip validation of SSL/TLS certificate
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
WebResponse respon = req.GetResponse();
Stream res = respon.GetResponseStream();
string ret = "";
byte[] buffer = new byte[1048];
int read = 0;
while ((read = res.Read(buffer, 0, buffer.Length)) > 0)
{
Console.Write(Encoding.ASCII.GetString(buffer, 0, read));
ret += Encoding.ASCII.GetString(buffer, 0, read);
}
return ret;
Je devais activer d'autres versions du protocole de sécurité pour résoudre le problème:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
Semblable à une réponse existante mais dans PowerShell:
[System.Net.ServicePointManager]::SecurityProtocol = `
[System.Net.SecurityProtocolType]::Tls11 -bor
[System.Net.SecurityProtocolType]::Tls12 -bor `
[System.Net.SecurityProtocolType]::Tls -bor `
[System.Net.SecurityProtocolType]::Ssl3
Puis appeler Invoke-WebRequest devrait fonctionner.
Cela provient de commentaires anonymes, bonne suggestion: Une façon plus simple d’écrire ceci serait:
[System.Net.ServicePointManager]::SecurityProtocol = @("Tls12","Tls11","Tls","Ssl3")
J'ai trouvé cet article fantastique et connexe de Jaykul: Validation de certificats auto-signés de .Net et PowerShell
Cela peut être causé par plusieurs facteurs (du plus probable au moins probable):
Le certificat SSL du serveur n'est pas approuvé par le client. La vérification la plus simple consiste à pointer un navigateur sur l'URL et à voir si vous obtenez une icône de verrou SSL. Si vous obtenez un verrou cassé, icône, cliquez dessus pour voir quel est le problème:
Le serveur requiert un certificat SSL client. Dans ce cas, vous devez mettre à jour votre code pour signer la demande avec un certificat client.
S'il vous plaît voir le lien ci-dessous une fois. SecurityProtocolType.SsL3 est maintenant ancien.