J'ai implémenté ma classe FTP personnalisée pour travailler avec un serveur hébergé pour lequel je paie. J'utilise le FTP pour la sauvegarde, la restauration et la mise à jour de mon application. Je suis maintenant au moment où je veux permettre au SSL de mettre cela en production. J'ai demandé à mon hébergeur s'ils soutenaient le protocole SSL et ils ont dit qu'ils le faisaient.FtpWebRequest avec EnableSSL
Je modifié mes méthodes après tutoriel Microsoft MSDN à quelque chose comme ceci:
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
X509Certificate cert = new X509Certificate(path to a certificate created with makecert.exe);
reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification;
reqFTP.EnableSsl = true;
Maintenant, le MSDN dit que si le serveur prend en charge le protocole ssl il ne sera pas jeter et exception quand on lui demande avec AUTH TLS. Cela peut être vu dans le journal de suivi. Donc je suppose que ce n'est pas un problème de serveur.
Après la phase d'authentification du serveur renvoie un
un messageSystem.Net Information: 0 : [0216] FtpControlStream#41622463 - Received response [227 Entering Passive Mode (the IP and port number).]
qui déclenche une erreur:
System.Net Error: 0 : [0216] Exception in the FtpWebRequest#12547953::GetResponse - The remote server returned an error: 227 Entering Passive Mode (the IP and port number).
J'ai essayé le réglage de la
reqFTP.UsePassive = true;
propriété sur false, puis je reçois cette erreur:
System.Net Information: 0 : [2692] FtpControlStream#4878312 - Received response [500 Illegal PORT command]
Bien sûr, sans que la propriété EnableSLL soit définie sur true, tout fonctionne sans problème.
Quelqu'un a-t-il une idée à ce sujet?
Edit: Je modifié le code placé comme suit:
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(m_ftpAddress.Trim()));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(m_ftpUsername, m_ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
ServicePointManager.ServerCertificateValidationCallback = new
System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
reqFTP.ClientCertificates.Add(cert);
reqFTP.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
reqFTP.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification
reqFTP.EnableSsl = true;
Le ValidateServerCertificate
retourne toujours vrai. Après ces modifications, l'effet est nul.
Et je ne comprends pas:
- En ce moment, l'application utilise le certificat de serveur, non?
- Et avant que les modifications utilisaient aussi le mien? Est-ce que quelqu'un peut expliquer comment cela fonctionne?
Editer: Après plusieurs échanges de courriels avec la société d'hébergement, il s'est avéré qu'ils avaient des problèmes avec leur logiciel FTP et qu'il n'y avait aucun problème avec le code.
Ensuite, postez votre modification comme réponse et acceptez-la. –