Ошибка Mono C# HTTPs (XMLRPC.NET): проблема с сертификатом клиента или сертификатом сервера?

После решения моей проблемы, связанной с XMLRPC.NET + HTTPs, я провел несколько успешных тестов в Windows с этим образцом решения клиент/сервер XMLRPC, но не смог заставить клиента (работающего в Mono Linux) подключиться к серверу (работающем в Windows 7). Конечно, я использую самогенерируемые сертификаты для тестирования (как на клиенте, так и на сервере), но это не работает для клиента в Linux.

Как видите, клиентский код генерирует сертификат X509 при запуске:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
IStateName proxy = XmlRpcProxyGen.Create<IStateName>();
XmlRpcClientProtocol cp = (XmlRpcClientProtocol)proxy;
cp.Url = "https://127.0.0.1:5678/";
cp.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(@"C:\path\to\your\certificate\file\my.cer"));
cp.KeepAlive = false;

и он предназначен для приема всех сертификатов, даже ненадежных. Но, несмотря на это, он все еще не работает.

Кроме того, некоторые тесты с использованием wget показывают, что wget https://www.google.com/ успешно связывается и загружает сертификат, но не в моем случае с wget https://192.168.1.3:5678/ и даже с --no-check-certificate.

У кого-нибудь есть идеи о том, что происходит? Большое спасибо.


person OlivierB    schedule 27.10.2011    source источник


Ответы (1)


Быстрый ответ. Ваш файл .cer не содержит закрытого ключа, поэтому его нельзя использовать для клиентских сертификатов.

Длинные ответы

Итак, как это работает в Windows? CryptoAPI запросит хранилище сертификатов, чтобы узнать, существует ли закрытый ключ, соответствующий сертификату. Если да, то он загрузится автоматически

Как это может работать на моно? Самое простое решение — создать экземпляр X509Certificate2, который загружает файл PKCS#12 (т. е. обычно с суффиксом .pfx или .p12). Этот файл (если он сгенерирован правильно) будет включать как сертификат X.509, так и закрытый ключ, что позволит Mono использовать сертификат в этом контексте.

person poupou    schedule 27.10.2011
comment
Привет и спасибо, поупоу. Итак, если я правильно понимаю, в Mono мне нужно создать файл PKCS (используя makecert?), а затем загрузить этот файл, используя класс X509Certificate2? - person OlivierB; 28.10.2011
comment
Makecert Mono может создавать файлы PKCS#12. Старые (не уверен, что новые) версии Microsoft makecert не могли. Но да как только вы получите файл PKCS#12, вы сможете использовать X509Certificate2 для его чтения (с необязательным паролем для защиты закрытого ключа) - person poupou; 28.10.2011