Question Utilisation de System.Net.WebClient avec certificat HTTPS


Dans mon client Windows C #, j'ai une soumission POST à ​​"le vaisseau mère". Je veux bien sûr que les données des soumissions soient sécurisées, alors j'ai payé pour que HostGator me délivre un certificat SSL.

J'ai sauvegardé le fichier .CER et je construis la demande en tant que telle:

//wrapper for WebClient object to use certificate file
class SecureWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
        string certPath = @"e:\mycertificate.cer";
        X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath);
        request.ClientCertificates.Add(myCert);
        return request;
    }
}

//request
private static SecureWebClient client = new SecureWebClient();
private static NameValueCollection = new NameValueCollection();
nvc.Add(POST_ACTION, ACTION_CODE_LOGIN);
nvc.Add(POST_EMAIL, email);
nvc.Add(POST_PASSWORD, password);

sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc));

Son jetant une System.Net.WebException:

La connexion sous-jacente a été fermée: une erreur inattendue s'est produite sur un envoi.

InnerException est une System.IO.IOException:

La poignée de main a échoué en raison d'un format de paquet inattendu.

Un aperçu de ce que je fais mal?


12
2017-09-13 13:33


origine


Réponses:


Si vous êtes ne pas en utilisant client certificats et vous pouvez accéder à votre serveur en utilisant https: // alors votre code devrait ressembler à ceci:

private static WebClient client = new WebClient();
private static NameValueCollection nvc= new NameValueCollection();

nvc.Add(POST_ACTION, ACTION_CODE_LOGIN);
nvc.Add(POST_EMAIL, email);
nvc.Add(POST_PASSWORD, password);

sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc));

Tant que ton BASE_URL les usages https: // alors toutes les données (vers et depuis le serveur) seront cryptées.

IOW utilisant SSL / TLS d'un client à un serveur n'exige pas que le client fasse quelque chose de spécial (avec le certificat), en plus d'utiliser https: // en tant que schéma, puisque le système d'exploitation fournit tout (par exemple, les racines de confiance), vous devez sécuriser la transmission des données.


11
2017-09-13 14:32



Client les certificats fonctionneront seulement si la clé privée est disponible. Ce n'est pas généralement le cas où vous utilisez des fichiers .cer depuis le certificat X.509 ne pas inclure la clé privée.

Le seul sûr Le moyen de s'assurer que la clé privée est disponible consiste à charger le certificat à partir d'un fichier PKCS # 12 où le ou les certificats et la clé privée sont disponibles (les deux ont été exportés dans le fichier). .pfx fichier).

Remarques:

  • J'ai dit généralement parce que Windows / CryptoAPI en fait parfois la magie (lorsqu'il est utilisé avec X509Certificate) et associe automatiquement un certificat à une clé privée à partir des magasins certificate.key.

  • J'ai dit sûr parce que cela fonctionnera aussi sur Mono, pas seulement sur MS .NET.


4
2017-09-13 14:06



On dirait que vous le faites en arrière. Le certificat SLL doit être installé sur l’hôte / serveur Web. Ensuite, vous créez une requête Web sur le serveur Web et vous devez utiliser le protocole HTTPS.


1
2017-09-13 13:44



Connectez-vous simplement à votre serveur avec RDP

Ouvrez IE et accédez aux Options Internet

Accédez à l'onglet Avancé et activez les deux Utiliser SSL 2.0 et SSL 3.0.

Maintenant, vos demandes de serveur seront authentifiées


0
2017-11-06 04:43