У меня есть веб-сервис, который я зарегистрировал через "добавить ссылку на службу", для которой требуется HTTPS и сертификат. Ниже приведен мой код для создания экземпляра моего сервиса:
service = new MyReferencedWebService();
X509Certificate2 cert = new X509Certificate2();
var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Mycert.cer");
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
cert.Import(bytes, MYPASSWORD, X509KeyStorageFlags.DefaultKeySet);
service.ClientCredentials.ClientCertificate.Certificate = cert;
и моя конфигурация выглядит так:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="RecordGeneratorWebServiceSoapHttp">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://mywebserviceurl"
binding="basicHttpBinding" bindingConfiguration="RecordGeneratorWebServiceSoapHttp"
contract="MyService.RecordGeneratorWebServiceInterface"
name="RecordGeneratorWebServicePort" />
</client>
</system.serviceModel>
Если я создаю простой winforms.exe и использую вышеуказанный код, я получаю ответ от своего веб-сервиса. Однако, если я ставлю этот же код в ASP.NET, я получаю следующее:
Запрос был прерван: не удалось создать безопасный канал SSL/TLS.
Как это сделать в ASP.NET?
EDIT: Я должен добавить. Клиентский сертификат, который я использую, привязан к смарт-карте и требует ввода PIN-кода для использования. Не уверен, что это имеет значение или нет.
Когда клиент входит в приложение, он запрашивает у них свой PIN-код сертификата. В этом случае у них есть карточка CAC, вставленная в считыватель CAC. Может быть, я могу каким-то образом использовать Request.ClientCertificate?