2010-12-16 366 views
9

Debo consumir un servicio web PHP que tenga un certificado SSL. Mi biblioteca de clases .net 3.5 hace referencia al servicio web con 'Agregar referencias de servicio' en Visualstudio 2010 (WCF ¿verdad?).No se pudo establecer un canal seguro para SSL/TLS con la autorización '*'

Al llamar al método principal del servicio web que recibo;

No se pudo establecer un canal seguro para SSL/TLS con la autorización '{base_url_of_WS}'.

traté mucho, como

System.Net.ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); 
public bool CheckValidationResult(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     return true; 
    } 

Pero no iba a funcionar. También tengo el certificado instalado en mi propia máquina.

* Información adicional; Cuando uso la ubicación wsdl en 'Agregar referencia de servicio' se produce el mismo error. Antes de probarlo, trabajé con un wsdl estático.

alt text

+0

¿Certificado que no es de confianza? – TomTom

+0

No, nada, acaba de ser emitido y firmado –

+1

¿Hay alguna forma de intentar conectarse al servicio web a través de un navegador (como ver los metadatos del servicio)? Esto ayudará a identificar si el problema es con los certificados o dentro de WCF. –

Respuesta

8

Si un certificado no es de confianza puede causar esto. Mire la ruta del certificado para el servicio web abriendo el websservice en un navegador y use las herramientas del navegador para ver la ruta del certificado. Es posible que deba instalar uno o más certificados intermedios en la computadora que llama al servicio web. En el navegador, puede ver "Errores de certificado" con una opción para "Instalar certificado" cuando investigue más: este podría ser el certificado que falta.

Mi problema particular era un certificado intermedio Geotrust SSL Geotrust DV CA desaparecidas tras una actualización a su servidor raíz en julio de 2010

https://knowledge.geotrust.com/support/knowledge-base/index?page=content&id=AR1422

14

Esto fue exactamente el problema que estaba enfrentando. En algún otro artículo, recibí una pista para cambiar la configuración. Para mí esto funciona:

<bindings> 
    <basicHttpBinding> 
    <binding name="xxxBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Certificate"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
+0

Gracias. ¡La parte del transporte era exactamente lo que necesitaba! Se corrigió después de horas de prueba. :) – KoalaBear

+0

La línea de transporte también lo arregló para mí. Aunque estaba agregando manualmente el certificado correcto y confiable en el código, no lo reconocería correctamente hasta que agregue esa línea en mi archivo .config. ¡Gracias! – jozolo

+0

Mismo problema, resuelto por esta configuración. Gracias, pasé 3 horas en eso –

2

Asegúrese de ejecutar Visual Studio como administrador.

2

Tuvimos este problema en un nuevo servidor web desde páginas .aspx llamando a un servicio web. No le habíamos dado permiso al usuario del grupo de aplicaciones para el certificado de la máquina. El problema se solucionó después de conceder permiso al usuario del grupo de aplicaciones.

0

Esto es lo fija para mí:

1) Asegúrese de que está ejecutando Visual Studio como administrador

2) instalar y ejecutar WinHttpCertCfg.exe para conceder acceso

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384088(v=vs.85).aspx

El comando es similar a continuación: (introduzca su asunto del certificado y el nombre del servicio)

winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "certificate subject" -a "NetworkService" 
winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "certificate subject" -a "LOCAL SERVICE" 
winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "certificate subject" -a "My Apps Service Account" 
+0

Debe mencionarse que winhttpcertcfg carece de soporte oficial para Win 2008 R2 y más reciente, http://serverfault.com/questions/620013/importing-a-certificate-and-granting-permissions-on- windows-server-2012-r2 –

0

Tenía mismo error con el código:

X509Certificate2 mycert = new X509Certificate2(@"C:\certificate.crt"); 

Resuelto agregando la contraseña:

X509Certificate2 mycert = new X509Certificate2(@"C:\certificate.crt", "password"); 
0

En caso de que ayuda a nadie más, utilizando el nuevo Microsoft Web Service Reference Provider tool, que es para .NET y .NET Standard Core, he tenido que añadir las siguientes líneas a la definición vinculante de la siguiente manera:

result.Security.Mode = BasicHttpSecurityMode.Transport; 
result.Security.Transport = new HttpTransportSecurity{ClientCredentialType = HttpClientCredentialType.Certificate}; 

Esto es efectivamente lo mismo que la respuesta de Micha, pero en el código, ya que no hay ningún archivo de configuración.

Cuestiones relacionadas