Comment puis-je utiliser les certificats SSL avec HttpWebRequest en C#?
Actuellement, je suis en train d'écrire une application utilitaire qui va se connecter à une adresse IP et le port et vérifier les informations contenues dans le certificat SSL à l'aide de HttpWebRequest. Lorsque je tente d'extraire le certificat, j'obtiens une erreur qu'une exception a été levée. L'exception semble être à cause de la loi d'adaptation du certificat SSL semble déclencher encore une autre vérification de la validation.
Voici le code, et peut-être quelqu'un pouvez me montrer une meilleure façon de le faire ou si je suis en manque de quelque chose. Je ne m'inquiète pas si le Certificat SSL est expiré ou ne correspond pas à l'URL. Rien de tout cela est pertinent pour ce que je suis en train de faire.
Quand j'assigne le X509Certificate dans le déléguer à une nouvelle variable, et de regarder la variable dans le débogueur, toutes les propriétés de montrer SSLCert.L'émetteur a déclenché une exception de type 'System.De sécurité.La cryptographie.CyrptographicException'
Lorsque j'essaie d'accéder à une propriété de SSLCert, j'ai le Exception levée: m_safeCertContext est un handle non valide
Je be recherché pour cette exception, mais tout porte à un certificat non valide, ce qui pourrait être vrai si le certificat est expiré, et peut-être vrai pour l'IP et le port de combinaison que je me connecte. Mais depuis que je me connecte à l'adresse IP à l'aide de l'IP et pas tout ce qui pourrait correspondre au nom commun, j'attends que et ne s'intéressent pas tant que j'ai encore besoin de l'information.
Le code est ci-dessous, j'ai mis quelques commentaires aussi bien pour ce qui ne fonctionne pas et ce qui ne fonctionne pas.
//To get around the SSL validation in the HttpWebRequest
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
//The below works but isn't what I want. CertName and ExpireDate are both Strings
this.CertName = ProcessSubject(certificate.Subject);
this.ExpireDate = certificate.GetExpirationDateString();
//The below works but the X509Certificate SSLCert shows exceptions in the debugger for most of the properties.
this.SSLCert = certificate;
return true; //**** Always accept
};
HttpWebRequest myRequest = (HttpWebRequest)System.Net.WebRequest.Create("https://" + this.IP + ":" + this.Port + "/SSLCheck.html");
myRequest.KeepAlive = false;
myRequest.Method = "GET";
try
{
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
}
catch (Exception e)
{
if (e.Message != "The remote server returned an error: (404) Not Found.")
{
throw Exception("Error");
}
}
//THE BELOW FAILS
this.CertName = this.SSLCert.Subject;
HttpWebRequest
. Avez-vous regardé le "Liées" questions sur la droite, ou faites une recherche [certificat ssl httpwebrequest]?Oui, à peu près tout le monde se demande comment utiliser les certificats clients, dont je ne suis pas à l'aide, ou une erreur dans HttpWebRequest en raison d'un certificat non valide, que je suis déjà en cours de traitement.
Je dois ajouter, le gros problème est que je veux copier le X509Certificate à l'autre X509Certificate variable de type et .NET semble être de la validation du certificat à nouveau quand je fais ".SSLCert = certificat;"
Qu'est-ce que détaillées de l'exception levée lorsque votre exemple échoue? Veuillez ajouter à votre OP si vous pouvez...
J'ai ajouté plus d'informations avec l'exception et d'erreurs levée.
OriginalL'auteur omniplex | 2011-03-11
Vous devez vous connecter pour publier un commentaire.
(Édition de nos commentaires ci-dessous)
Je suppose que ce que vous devez faire est de créer une classe personnalisée et de stocker les données dont vous avez besoin à l'intérieur de la délégué de code, plutôt que de passer sur le certificat de référence.
Peut-être essayer de faire un memberwise clone à la place?
C'est une bonne tentative, mais bizarrement, je vois la méthode comme étant une méthode protégée sur le site MSDN, mais pourtant, il ne semble pas être disponible pour une raison quelconque. VS est mise en évidence comme une erreur et il ne compile pas. Aussi intellisense ne le montre pas comme une méthode valable.
Voici quelque chose d'intéressant. Quand je suis dans la délégué et de le refaire, il montre amende pour SSLCert, cependant, il ne semble pas à l'interne de lancer des exceptions jusqu'à ce que après que j'ai quitter le délégué.
La surveillance de ma part (que MemberwiseClone est protégé). Je suppose que ce que vous devez faire est de créer une classe personnalisée et de stocker les données dont vous avez besoin à l'intérieur de la délégué, plutôt que de passer sur le certificat de référence.
OriginalL'auteur Mike Atlas
C'est juste une supposition de ma part. Ce que je pense qui se passe est que le certificat d'info à venir par le biais de la négociation SSL est utilisé par .NET pour créer un cert objet qui est transmis au délégué. Le délégué ne doit être utilisé que pour les fins de validation. Après l'appel se termine, .NET ferme le coffre de la poignée du certificat. C'est pourquoi, l'appel échoue lorsque vous essayez d'accéder au certificat en dehors de la fonction de rappel.
POUR contourner ce problème, vous pouvez sérialiser le certificat à l'intérieur du délégué, et désérialiser l'extérieur du délégué.
OriginalL'auteur feroze