2011-12-09 14 views
46

Resumen:
¿Hay una manera de forzar el construido en SoapClient clase en PHP para conectar a través de HTTPS a un servidor con un certificado no válido?verificación de certificados Deshabilitar en PHP SoapClient

¿Por qué querría hacer eso?
Implementé una nueva aplicación en un servidor que todavía no tiene entrada ni certificado de DNS. Quiero intentar conectarlo con un SoapClient antes de configurar la entrada de DNS y corregir el certificado, y la forma más razonable de hacer esto parece ser simplemente hacer que el cliente ignore el certificado durante la prueba.

¿No me doy cuenta de que este es un gran riesgo de seguridad?
Esto es solo para pruebas. Cuando el servicio entre en producción, habrá un certificado válido y el cliente se verá obligado a validarlo.

+1

me interesa mucho si esa idea con stream_context_create() funcionó para usted. si tuvo que cambiar algo, infórmenos para que otros también puedan aprovecharlo. – Kaii

+0

también estoy interesado si la solución sugerida funcionó –

Respuesta

72

SoapClient toma corriente contexto en sus parámetros, que puede crear usted mismo. De esta manera se puede controlar casi todos los aspectos de la capa de transporte:

$context = stream_context_create([ 
    'ssl' => [ 
     // set some SSL/TLS specific options 
     'verify_peer' => false, 
     'verify_peer_name' => false, 
     'allow_self_signed' => true 
    ] 
]); 

$client = new SoapClient(null, [ 
    'location' => 'https://...', 
    'uri' => '...', 
    'stream_context' => $context 
]); 

Documentación:

+1

Desafortunadamente, esto no parece funcionar, y la opción verify_peer ya es falsa por defecto (http://php.net/manual/en/context.ssl.php). – zpon

+1

@zpon: Esto normalmente funciona. Checkout no está utilizando una subcapa SSL diferente que tenga diferentes opciones. También verifique que no se encuentre con un error de PHP, vea una pregunta relacionada: [Php SoapClient stream_context option] (http: // stackoverflow.com/questions/9909232/php-soapclient-stream-context-option) – hakre

+2

¿Qué pasa con 'allow_self_signed' establecido en' true'? Por defecto también a 'falso' –

2

La lista correcta para PHP 5.6. 8 es

'ssl' => array ('verify_peer_name' => false, 'allow_self_signed' => true),

10

Las obras respuesta aceptada pero sólo en el modo de no WSDL. Si intenta utilizar esto en el modo WSDL (es decir, pasa una url de archivo WSDL como primer argumento), se enfrentará al hecho de que el contexto de la secuencia se ignora al descargar archivos WSDL. Por lo tanto, si el archivo WSDL también está ubicado en un servidor con un certificado dañado, fallará, probablemente lanzando el mensaje failed to load external entity. Vea más here y here.

Como se ha sugerido, la forma más sencilla es descargar manualmente el archivo WSDL y pasar la copia local al SoapClient. Puede descargarlo, por ejemplo, con file_get_contents usando el mismo contexto de secuencia de la respuesta aceptada.

Tenga en cuenta que también tendrá que hacer esto al crear un SoapServer.

+3

He intentado con la respuesta aceptada en PHP7 y funcionó en modo WSDL. Entonces tal vez ese problema se solucionó ahora. –

Cuestiones relacionadas