
Tengo el requisito de llamar al servicio web del servidor con el certificado de cliente. Me han proporcionado un archivo .crt. Estoy alojando mi proyecto en WindowsServer2008 IIS7.
Instalo .crt desde las propiedades del botón derecho, ya que no puedo agregar certificados a los Certificados del servidor mediante la Solicitud de certificado completa. Recibí el error:
CertEnroll::CX509Enrollment::p_InstallResponse: ANSI bad tag value met.
Busqué en Google y no encontré nada sobre cómo instalar el certificado de cliente .crt. También intenté instalar como se explica.aquíen el paso 4
Y cuando llamé así
string certPath = Server.MapPath("../certificate/iot01.servername.crt");
X509Certificate2 cert = new X509Certificate2(certPath);
ws.ClientCertificates.Add(cert);
res = ws.methodName(params);
Recibí el error: System.IO.IOException: el protocolo de enlace falló debido a un formato de paquete inesperado. en System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) en System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) en System.Net.Security.SslState. CheckCompletionBeforEnextReceive (Mensaje de Protocolteken, asyncProtocolRequest asyncRequest) en system.net.security.sslstate.startsendblob (byte [] entrante, int32 er, asyncprotocolrequest asyncRequest) en System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) en System.Net.TlsStream.CallProcessAuthentication(estado del objeto) en System.Threading.ExecutionContext.RunInternal(ExecutionContext programmingContext, devolución de llamada ContextCallback, estado del objeto, booleano preserveSyncCtx) en System.Threading.ExecutionContext.Run (ExecutionContext ejecuciónContext, devolución de llamada ContextCallback, estado del objeto, booleano preserveSyncCtx) en System.Threading.ExecutionContext.Run (ExecutionContext ejecuciónContext, devolución de llamada ContextCallback, estado del objeto) en System.Net.TlsStream.ProcessAuthentication (resultado de LazyAsyncResult) en System.Net.TlsStream.Write(búfer Byte[], desplazamiento Int32, tamaño Int32) en System.Net.PooledStream.Write(búfer Byte[], desplazamiento Int32, tamaño Int32) en System.Net.ConnectStream.WriteHeaders(Boolean async) en System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(solicitud WebRequest) en System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(solicitud WebRequest) en System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String métodoName, Parámetros del objeto []) en .....
¿Esto está relacionado con la instalación y llamada de mi certificado? ¿Alguien puede indicarme dónde me equivoqué?
Respuesta1
Creo que tiene que ver con tu vocación: los pasos que debes seguir.
Como método de fuerza bruta para llegar al meollo de su problema, haga lo siguiente:
Utilice un proyecto nuevo completamente diferente para crear código solo para probar la parte sobre la autenticación del servidor siguiendo los pasos del enlace al que se refiere como "aquí". Esto le permitirá no enfrentarse a otros problemas que puedan obstaculizar sus capacidades de depuración.
Sin embargo, como comprobación rápida,
Primer intento Asegúrese de ver si no necesita TLS en lugar de SSL utilizando una conexión TLS EXPLÍCITA:
Verifique cualquier método en el objeto de conexión que inicie TLS http://www.limilabs.com/blog/the-handshake-failed-due-to-an-unexpected-packet-format
client.Connect("mail.example.com");
client.StartTLS();
¿En su registro parece haber cuatro ejecuciones (procesos 5068, 3984, 1628 y 7124)? ¿Están funcionando los últimos tres? ¿Cambiaste algo?
Por 5068 al menos, ustedsonleyendo una respuesta después de enviar el comando STLS, pero estásnoleyendo la línea inicial "estoy vivo" del servidor. Ver, por ejemplo, en wikipedia:
S: C: S: +OK Servidor POP3 listo <[correo electrónico protegido]>
Entonces necesitas leer esa línea,antesenvías el comando STLS. Puede ver en 5068 que SslStream obtiene la respuesta +OK B[egin SSL...] en lugar de la respuesta SSL.
Más tarde: ahora veo lo que está ocurriendo. En los otros tres se ejecuta la operación stream.Read que lee ambas líneas de respuesta. Así que es cuestión de suerte si funciona o no.
Por ejemplo, no estaba imprimiendo ambas líneas en mi muestra anterior, imprimiendo ambas ahora veo:
D:\Temp>SslStartTest.exe -client2 localhost 110 resp: +OK <[correo electrónico protegido]>, servidor POP3 listo. resp: +OK Iniciar negociación SSL/TLS... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors: RemoteCertificateNameMismatch, RemoteCertificateChainErrors Sesión TLS conectada. :-) Cifrado: Fuerza TripleDes 168 Hash: Fuerza Sha1 160 Intercambio de claves: Fuerza RsaSign 1024 Protocolo: Tls Está autenticado: ¿Verdadero como servidor? Falso IsSigned: Verdadero Está cifrado: Verdadero Lista de revocación de certificados marcada: Falso El certificado local es nulo. El certificado remoto se emitió a CN=alanjmcf.example.com y es válido desde el 04/03/2009 1 0:47:40 hasta el 29/03/2029 10:47:40. Puede leer: Verdadero, escribir Verdadero Puede exceder el tiempo de espera: Verdadero ^C