Используйте самоподписанный сертификат без установки в магазине сертификатов - PullRequest
2 голосов
/ 07 июня 2011

У меня есть файл самозаверяющего сертификата (.cer) от третьей стороны. Я хотел бы использовать этот сертификат в коде для подключения к их веб-сервису (через HTTPS), не устанавливая его в моем хранилище сертификатов в Windows. В частности, это так, что всем остальным разработчикам в команде не придется устанавливать этот сертификат локально, чтобы соединение работало на них.

Есть ли способ сделать это в коде? Он может использовать либо устаревший код клиента webservice (с помощью wsdl.exe или Add Web Reference VS), либо код клиента WCF (с помощью svcutil.exe или Add Service Reference VS) - мы не определили, каким путем мы хотим идти еще.

Я пробовал:

proxy.ClientCertificates.Add(X509Certificate.CreateFromCertFile(@"d:\temp\mycert.cer"));

со старым школьным кодом веб-сервиса, не повезло - он все еще не работает с Could not establish trust relationship for the SSL/TLS secure channel., пока я не установлю сертификат в хранилище сертификатов. То же самое для:

<identity>
  <certificate encodedValue="the base64 encoded contents of the file" />
</identity>

в конечной точке в app.config с использованием технологии клиента WCF.

Спасибо

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

Причина, по которой вам нужен сертификат, - HTTPS. Веб-служба защищена транспортной безопасностью (HTTPS) с сертификатом, которому ваша система не доверяет. Чтобы доверять сертификату, общий подход заключается в установке сертификата в хранилище сертификатов. Это не функция .NET, а функция Windows вне ответственности .NET.

Чтобы доверять произвольному сертификату SSL. NET предлагает метод обратного вызова, где вы можете создать свой собственный код, используемый для проверки сертификата: ServicePointManager.ServerCertificateValidationCallback. Если вы просто вернете true из обратного вызова, вы будете доверять каждому сертификату, но это только для разработки и тестирования! После развертывания в производственном приложении следует использовать сертификат из хранилища сертификатов или использовать специальную проверку, определенную в обратном вызове (не рекомендуется).

1 голос
/ 07 июня 2011

.NET не может / не будет обрабатывать комбинацию «сертификат + ключ» (которая вам нужна в данном случае) из открытого текста. Я не нашел способ построить один; он не будет читать открытый текст для сертификата.

Однако он будет работать с контейнером P12 / PFX, даже если контейнер не имеет пароля. Вы даже можете сохранить это как закодированную строку и восстановить ее с помощью этого конструктора: http://msdn.microsoft.com/en-us/library/ms148418.aspx

...