Résumé:
Existe-t-il un moyen de forcer la classe SoapClient intégrée dans PHP pour se connecter via HTTPS à un serveur avec un certificat non valide?
Pourquoi voudrais-je faire ça?
J'ai déployé une nouvelle application sur un serveur qui n'a pas encore d'entrée DNS ou de certificat. Je veux essayer de me connecter avec un SoapClient avant de configurer l'entrée DNS et de réparer le certificat, et la façon la plus raisonnable de le faire semble être pour que le client ignore simplement le certificat pendant le test.
Je ne me rends pas compte que c'est un énorme risque pour la sécurité?
Ceci est uniquement pour les tests. Lorsque le service entrera en production, un certificat valide sera en place et le client sera obligé de le valider.
SoapClient
prend un contexte de flux dans ses paramètres, que vous pouvez créer vous-même. De cette façon, vous pouvez contrôler presque tous les aspects de la couche de transport:
$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
]);
Documentation:
La réponse acceptée fonctionne mais uniquement en mode non WSDL . Si vous essayez de l'utiliser en mode [~ # ~] wsdl [~ # ~] (c'est-à-dire que vous passez une URL de fichier WSDL comme premier argument ), vous serez confronté au fait que le contexte de flux est ignoré lors du téléchargement de fichiers WSDL. Donc, si le fichier WSDL se trouve également sur un serveur avec un certificat cassé, il échouera, ce qui lancera probablement le message failed to load external entity
. Voir plus ici et ici .
Comme suggéré, le moyen le plus simple consiste à télécharger le fichier WSDL manuellement et à transmettre la copie locale au SoapClient. Vous pouvez le télécharger par exemple avec file_get_contents
en utilisant le même contexte de flux que la réponse acceptée.
Notez que vous devrez également le faire lors de la création d'un SoapServer.
La liste correcte pour PHP 5.6.8 est
'ssl' => array('verify_peer_name'=>false, 'allow_self_signed' => true),