
У меня есть требование вызвать веб-сервис сервера с клиентским сертификатом. Они предоставили мне один файл .crt. Я размещаю свой проект в WindowsServer2008 IIS7.
Я устанавливаю .crt из свойств правой кнопки мыши, так как не могу добавить сертификат в Server Certificates с помощью Complete Certificate Request. Я получил ошибку:
CertEnroll::CX509Enrollment::p_InstallResponse: ANSI bad tag value met.
Я гуглил и ничего не нашел о том, как установить .crt клиентский сертификат. Также пробовал устанавливать как объясняютздесьна шаге4
И когда я позвонил вот так
string certPath = Server.MapPath("../certificate/iot01.servername.crt");
X509Certificate2 cert = new X509Certificate2(certPath);
ws.ClientCertificates.Add(cert);
res = ws.methodName(params);
Я получил ошибку: System.IO.IOException: рукопожатие не удалось из-за неожиданного формата пакета. в System.Net.Security.SslState.StartReadFrame(Byte[] буфер, Int32 readBytes, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartReceiveBlob(Byte[] буфер, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken сообщение, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartSendBlob(Byte[] входящий, Int32 счетчик, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] буфер, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) в System.Net.TlsStream.CallProcessAuthentication(Object state) в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) в System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) в System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) в System.Net.PooledStream.Write(буфер Byte[], смещение Int32, размер Int32) в System.Net.ConnectStream.WriteHeaders(логический асинхронный) в System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(запрос WebRequest) в System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(запрос WebRequest) в System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, параметры Object[]) в .....
Это связано с установкой и вызовом моего сертификата. Может кто-нибудь указать мне, где я ошибся.
решение1
Я считаю, что это связано с вашим призванием: с шагами, которым вам следует следовать.
Чтобы добраться до сути проблемы методом грубой силы, сделайте следующее:
Используйте совершенно другой новый проект для создания кода, чтобы просто протестировать часть об аутентификации сервера, используя шаги в вашей ссылке, которую вы называете "здесь". Это позволит вам не связываться с другими проблемами, которые могут помешать вашим возможностям отладки.
Однако, в качестве быстрой проверки,
Первая попытка Убедитесь, что вам не требуется TLS вместо SSL, используя ЯВНОЕ TLS-подключение:
Проверьте любой метод в объекте соединения, который запускает TLS. http://www.limilabs.com/blog/the-handshake-failed-due-to-an-unexpected-packet-format
client.Connect("mail.example.com");
client.StartTLS();
В вашем логе, похоже, четыре запуска (процессы 5068, 3984, 1628 и 7124)? Последние три работают? Вы что-то меняли?
По крайней мере, для 5068 выявляютсячтение ответа после отправки команды STLS, но вынетсчитывание начальной строки сервера "я жив". См. например в википедии:
S: C: S: +OK POP3-сервер готов <[email protected]>
Так что вам нужно прочитать эту строку,довы отправляете команду STLS. Вы можете видеть в 5068, что SslStream получает ответ +OK B[egin SSL...] вместо ответа SSL.
Позже: Теперь я вижу, что происходит. В трех других запусках операция stream.Read считывает обе строки ответа! Так что это просто удача, сработает это или нет.
Например, в предыдущем примере я не печатал обе строки, а сейчас вижу, что печатаю обе:
D:\Temp>SslStartTest.exe -client2 localhost 110 соответственно: +OK <[email protected]>, POP3-сервер готов. resp: +OK Начать согласование SSL/TLS... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors: RemoteCertificateNameMismatch, RemoteCertificateChainErrors Сеанс TLS подключен. :-) Шифр: сила TripleDes 168 Хэш: сила Sha1 160 Обмен ключами: сила RsaSign 1024 Протокол: Tls Аутентифицирован ли: True как сервер? False IsSigned: True Зашифрован ли: True Список отозванных сертификатов проверен: False Локальный сертификат является пустым. Удаленный сертификат был выдан для CN=alanjmcf.example.com и действителен с 03/04/2009 1 0:47:40 до 29/03/2029 10:47:40. Может читать: True, писать True Может тайм-аут: True ^C