在PHP SoapClient中禁用证书validation
概要:
有没有办法强制PHP中的内置SoapClient类通过HTTPS连接到服务器与一个无效的证书?
我为什么要这样做?
我已经在没有DNS入口或证书的服务器上部署了一个新的应用程序。 我想在设置DNS条目和修复证书之前尝试使用SoapClient 进行连接,最合理的方法似乎是在testing期间让客户端忽略证书。
我不知道这是一个巨大的安全风险吗?
这只是为了testing。 当服务投入生产时,会有一个有效的证书到位,客户端将被强制validation。
SoapClient
在其参数中创build一个stream上下文 ,您可以创build自己的参数。 这样你就可以控制传输层的几乎每一个方面:
$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 ]);
文档:
- stream_context_create() 文档
- HTTP上下文选项文档
- SSL上下文选项文档
接受的答案只能在非WSDL模式下工作。 如果你试图在WSDL模式下使用它(即你传递一个WSDL文件url作为第一个参数),你将面临下载WSDL文件时忽略stream上下文的事实。 因此,如果WSDL文件也位于具有破损证书的服务器上,则它将失败,最有可能引发消息failed to load external entity
。 看更多这里和这里 。
正如所build议的,最简单的方法是手动下载WSDL文件并将本地副本传递给SoapClient。 您可以使用file_get_contents
使用与接受的答案相同的stream上下文来下载它。
请注意,您在创buildSoapServer时也必须执行此操作。
PHP 5.6.8正确的列表是
'ssl'=> array('verify_peer_name'=> false,'allow_self_signed'=> true),