
Eu tenho um requisito para chamar o serviço web do servidor com certificado de cliente. Eles me forneceram um arquivo .crt. Estou hospedando meu projeto no WindowsServer2008 IIS7.
Eu instalo .crt a partir das propriedades do botão direito, pois não consigo adicionar certificado aos certificados do servidor por meio da solicitação completa de certificado. Eu recebi o erro:
CertEnroll::CX509Enrollment::p_InstallResponse: ANSI bad tag value met.
Pesquisei no Google e não encontrei nada sobre como instalar o certificado de cliente .crt. Também tentei instalar conforme explicandoaquina etapa 4
E quando eu liguei assim
string certPath = Server.MapPath("../certificate/iot01.servername.crt");
X509Certificate2 cert = new X509Certificate2(certPath);
ws.ClientCertificates.Add(cert);
res = ws.methodName(params);
Recebi o erro: System.IO.IOException: O handshake falhou devido a um formato de pacote inesperado. em System.Net.Security.SslState.StartReadFrame (buffer Byte [], Int32 readBytes, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.StartReceiveBlob (buffer Byte [], AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState. CheckCompletionBeforeNextReceive (mensagem ProtocolToken, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.StartSendBlob (Byte [] recebido, contagem Int32, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.ForceAuthentication (Boolean recebeFirst, Byte [] buffer, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) em System.Net.TlsStream.CallProcessAuthentication(estado do objeto) em System.Threading.ExecutionContext.RunInternal(ExecutionContext execuçãoContext, retorno de chamada ContextCallback, estado do objeto, booleano preserveSyncCtx) em System.Threading.ExecutionContext.Run (ExecutionContext execuçãoContext, retorno de chamada ContextCallback, estado do objeto, booleano preserveSyncCtx) em System.Threading.ExecutionContext.Run (ExecutionContext execuçãoContext, retorno de chamada ContextCallback, estado do objeto) em System.Net.TlsStream.ProcessAuthentication (resultado LazyAsyncResult) em System.Net.TlsStream.Write (buffer Byte [], deslocamento Int32, tamanho Int32) em System.Net.PooledStream.Write (buffer Byte [], deslocamento Int32, tamanho Int32) em System.Net.ConnectStream.WriteHeaders (Boolean async) em System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(solicitação WebRequest) em System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(solicitação WebRequest) em System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Parâmetros do objeto[]) em .....
Isso está relacionado à instalação e chamada do meu certificado. Alguém pode me indicar onde estou errado.
Responder1
Acredito que tenha a ver com a sua vocação: os passos que você deve seguir.
Como método de força bruta para chegar ao cerne do seu problema, faça o seguinte:
Use um novo projeto completamente diferente para criar código apenas para testar a parte sobre autenticação do servidor usando as etapas no seu link que você chama de "aqui". Isso permitirá que você não se acumule com outros problemas que possam prejudicar seus recursos de depuração.
No entanto, como uma verificação rápida,
Primeira tentativa Certifique-se de ver se você não precisa de TLS em vez de SSL usando a conexão EXPLICIT TLS:
Verifique qualquer método no objeto de conexão que inicia o TLS http://www.limilabs.com/blog/the-handshake-failed-due-to-an-unexpected-packet-format
client.Connect("mail.example.com");
client.StartTLS();
No seu registro parece haver quatro execuções (processos 5068, 3984, 1628 e 7124)? Os três últimos estão funcionando? Você mudou alguma coisa?
Pelo menos para 5068, vocêsãolendo uma resposta depois de enviar o comando STLS, mas você estánãolendo a linha inicial "estou vivo" do servidor. Veja, por exemplo, na Wikipedia:
S: C: S: +OK Servidor POP3 pronto <[e-mail protegido]>
Então você precisa ler essa linha,antesvocê envia o comando STLS. Você pode ver em 5068 que o SslStream obtém a resposta +OK B[egin SSL...] em vez da resposta SSL.
Mais tarde: vejo agora o que está acontecendo. Nas outras três execuções, a operação stream.Read está lendo ambas as linhas de resposta! Portanto, é apenas sorte, quer funcione ou não.
Por exemplo, eu não estava imprimindo ambas as linhas no meu exemplo anterior, imprimindo ambas agora vejo:
D:\Temp>SslStartTest.exe -client2 localhost 110 resp: +OK <[e-mail protegido]>, servidor POP3 pronto. resp: +OK Iniciar negociação SSL/TLS... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors: RemoteCertificateNameMismatch, RemoteCertificateChainErrors Sessão TLS conectada. :-) Cifra: Força TripleDes 168 Hash: Força Sha1 160 Troca de chaves: Força RsaSign 1024 Protocolo: Tls É autenticado: Verdadeiro como servidor? False IsSigned: True Is Encrypted: True Lista de revogação de certificados verificada: False O certificado local é nulo. O certificado remoto foi emitido para CN=alanjmcf.example.com e é válido de 03/04/2009 1 0:47:40 até 29/03/2029 10:47:40. Pode ler: Verdadeiro, escrever Verdadeiro Tempo limite: Verdadeiro ^C