带有两个证书文件和 "Could not connect to host" 的 SOAP
SOAP with two certificates file and "Could not connect to host"
我在将 PHP 与 API 连接时遇到问题,需要使用 SSL 证书。问题是当我 运行 我的 PHP 代码得到 "Could not connect to host".
我能够像这样使用 CURL 连接到服务提供商:
$wsdl = 'https://example.com/Case.svc';
$certFile = getcwd() . '/certificate.crt';
$keyFile = getcwd() . '/key.pem';
$password = 'password';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wsdl);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
但是,我无法使用 SOAP 执行此操作:
$options=array(
'soap_version' => SOAP_1_2,
'trace' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'exceptions' => 1,
'encoding' => 'UTF-8',
'stream_context'=>stream_context_create(
array(
'ssl'=>array(
'verify_peer'=>true
,'allow_self_signed'=>false
,'cafile'=>'certificate.crt'
,'verify_depth'=>5
)
)
),
'local_cert' => 'key.pem',
'passphrase' => 'password',
);
$client = new SoapClient("Case.wsdl", $options);
结果为 "Could not connect to host"。
问题可能出在证书本身,也许我需要将两个证书合并到一个文件中。我看到很多人有同样的问题,大多数人都没有得到答案。
为什么 SOAP 代码返回 "Could not connect to host",我该如何解决?
您可以从一些地方开始:
1) certificate.crt 到底是什么?它是客户端证书还是 CA 证书?您正在使用 CURLOPT_SSLCERT(设置客户端证书),但在 SoapClient 中使用 'cafile' 文件指令(设置 CA 证书文件)。
2) 您使用的是 CURLOPT_SSL_VERIFYPEER = false,但在另一个片段中您使用的是 verify_peer.
因此,尝试使用相同类型的环境对这些更改进行更多调试。
如果您的证书是自签名的,则无需设置 cafile。
cafile 仅适用于 CA 链。
local_cert 需要同时拥有:证书(叶)和私钥连接例如:
-----BEGIN CERTIFICATE-----
MIIDsDCCApgCAWUwDQ....
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsMGypi...
-----END RSA PRIVATE KEY-----
出于某种原因,自签名证书在 ubuntu 上对我不起作用,但在 mac os.
上工作正常
我在将 PHP 与 API 连接时遇到问题,需要使用 SSL 证书。问题是当我 运行 我的 PHP 代码得到 "Could not connect to host".
我能够像这样使用 CURL 连接到服务提供商:
$wsdl = 'https://example.com/Case.svc';
$certFile = getcwd() . '/certificate.crt';
$keyFile = getcwd() . '/key.pem';
$password = 'password';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wsdl);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$output = curl_exec($ch);
var_dump(curl_errno($ch));
var_dump(curl_error($ch));
但是,我无法使用 SOAP 执行此操作:
$options=array(
'soap_version' => SOAP_1_2,
'trace' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'exceptions' => 1,
'encoding' => 'UTF-8',
'stream_context'=>stream_context_create(
array(
'ssl'=>array(
'verify_peer'=>true
,'allow_self_signed'=>false
,'cafile'=>'certificate.crt'
,'verify_depth'=>5
)
)
),
'local_cert' => 'key.pem',
'passphrase' => 'password',
);
$client = new SoapClient("Case.wsdl", $options);
结果为 "Could not connect to host"。
问题可能出在证书本身,也许我需要将两个证书合并到一个文件中。我看到很多人有同样的问题,大多数人都没有得到答案。
为什么 SOAP 代码返回 "Could not connect to host",我该如何解决?
您可以从一些地方开始:
1) certificate.crt 到底是什么?它是客户端证书还是 CA 证书?您正在使用 CURLOPT_SSLCERT(设置客户端证书),但在 SoapClient 中使用 'cafile' 文件指令(设置 CA 证书文件)。
2) 您使用的是 CURLOPT_SSL_VERIFYPEER = false,但在另一个片段中您使用的是 verify_peer.
因此,尝试使用相同类型的环境对这些更改进行更多调试。
如果您的证书是自签名的,则无需设置 cafile。 cafile 仅适用于 CA 链。 local_cert 需要同时拥有:证书(叶)和私钥连接例如:
-----BEGIN CERTIFICATE-----
MIIDsDCCApgCAWUwDQ....
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsMGypi...
-----END RSA PRIVATE KEY-----
出于某种原因,自签名证书在 ubuntu 上对我不起作用,但在 mac os.
上工作正常