Вызов веб-службы сертификата клиента
У меня есть требование для вызова веб-службы сервера с сертификатом клиента. Они предоставили мне один файл.crt. Я размещаю свой проект в WindowsServer2008 IIS7.
Я устанавливаю.crt из свойств правой кнопки мыши, так как не могу добавить сертификат в Сертификаты сервера по Полному запросу сертификата. Я получил ошибку:
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 asyncRes.Sec.CheckCompletionBeforeNextReceive(сообщение ProtocolToken, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartSendBlob(Byte[] входящий, счетчик Int32, AsyncProtocolRequest asyncRequest) в System.Net.Security.yncRelaySecateSectele asyncRequest) в System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) в System.Net.TlsStream.CallProcessAuthentication(состояние объекта) в System.Threading.ExecutionContext.RunInternal (состояние объекта Conject, обратный_брос вызова объекта) System.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение preserveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Net.TlsStream.ProcessAuthentication(результат LazyAsyncResult) в System.Net.TlsStream.Write(байт [], смещение Int32, 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, используя вместо этого EXPLICIT 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 готов <1896.697170952@dbc.mtview.ca.us>
Поэтому вам нужно прочитать эту строку перед отправкой команды STLS. Вы можете видеть в 5068, что SslStream получает ответ +OK B[egin SSL...] вместо ответа SSL.
Позже: теперь я вижу, что происходит. В остальных трех запусках операция stream.Read читает обе строки ответа! Так что это просто удача, работает это или нет.
Например, я не печатал обе строки в моем предыдущем примере, а вывод обеих:
D: \ Temp> SslStartTest.exe -client2 localhost 110 или соответственно: +OK <67051906.3308@alanjmcf.example.com>, сервер POP3 готов. resp: +OK Начать согласование SSL/TLS... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors: RemoteCertificateNameMismatch, RemoteCertificateChainErrors TLS-сеанс подключен.:-) Шифр: TripleDes сила 168 Хеш: Sha1 сила 160 Обмен ключами: RsaSign сила 1024 Протокол: Tls Аутентифицируется: True как сервер? False IsSigned: True Is Encrypted: True Проверен список отзыва сертификатов: False Локальный сертификат имеет значение null. Удаленный сертификат был выдан CN=alanjmcf.example.com и действителен с 03.04.2009 1 0:47:40 до 29.03.2029 10:47:40. Может читать: True, писать True Тайм-аут Can: True ^C