Mono, WebClient и недействительные SSL-сертификаты - PullRequest
2 голосов
/ 09 сентября 2010

Я пытаюсь портировать существующее приложение на Mono 2.6.7 / Linux.Одной из задач является получение данных с помощью метода WebClient с серверов с недействительным SSL-сертификатом.

Наш код .Net 3.5 под Windows для принятия всех сертификатов работает нормально:

ServicePointManager.ServerCertificateValidationCallback = TrustCertificate;
StreamReader webReader = new StreamReader(webClient.OpenRead(url));
...
private static bool TrustCertificate(object sender, X509Certificate x509Certificate, X509Chain x509Chain, SslPolicyErrors sslPolicyErrors)
{
   // all Certificates are accepted
   return true;
}

Я пробовал разное.чего добиться в Mono без с использованием определенных Mono dll, но всегда с одной и той же ошибкой:

Ошибка при получении потока ответа (запись: аутентификация или дешифрование не удалось.)

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 03 октября 2010

Основная причина в том, что Mono, в отличие от реализации Microsoft .NET, не включает доверенные корневые сертификаты, поэтому проверка всех сертификатов по умолчанию завершится неудачей.

Эта страница отлично объясняет, как работает проверка сертификата в Mono. Также описывается, как ответственно реализовать собственную политику, включая пример кода.

http://www.mono -project.com / UsingTrustedRootsRespectfully

Сайт несколько устарел и предоставляет код для .NET 2.0 с использованием свойства ServicePointManager.CertificatePolicy. Вместо этого следует использовать более новое, не устаревшее свойство ServicePointManager.ServerCertificateValidationCallback.

2 голосов
/ 20 сентября 2010

Попробуйте использовать это вместо этого (свойство обратного вызова было реализовано только недавно, я думаю):

ServicePointManager.CertificatePolicy = new NoCheckCertificatePolicy ();

, где NoCertificatePolicy:

using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;

namespace MyNameSpace
{
 class NoCheckCertificatePolicy : ICertificatePolicy
 {
  public bool CheckValidationResult (ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
   return true;
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...