我正在尝试使用 CURL 对服务器进行 SOAP 调用,如下所示。
要求是
我们需要通过 ssl 证书并通过用户名和密码
$ssl = "ssl_file_relative_address.pem";
$pub_ssl_password = 'mynameiskhan';
//Get the data
$data = the_data_xml.xml;
//Get the WSDL Address
$wsdl = "address/to/wsdl?parameter=value";
$soapUser = "Username"; // username
$soapPassword = "password"; // password
$options = [
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_SSL_VERIFYPEER => FALSE,
CURLOPT_URL => $wsdl,
CURLOPT_SSLCERT => $ssl,
//CURLOPT_SSLCERTPASSWD => $pub_ssl_password,
CURLOPT_USERPWD => $soapUser.":".$soapPassword,
CURLOPT_HTTPAUTH => CURLAUTH_BASIC
];
$ch = curl_init();
curl_setopt_array($ch , $options);
$response = curl_exec($ch);
//curl_close($ch);
if (curl_errno($ch)) {
print curl_error($ch);
}
我从 CURL 收到以下错误:无法使用客户端证书(找不到密钥或密码短语错误?
我做错了什么...
找到了解决方案。它需要一个中间 CA 证书.
解决方案是
$options = [
CURLOPT_HTTPHEADER => ['Content-type: application/json'],
CURLOPT_URL => 'https://address/to/service?param=value',
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_CAINFO => getcwd()."cacert.pem",
URLOPT_SSLCERT => getcwd().'cert.pem',
CURLOPT_SSLCERTPASSWD => 'ssl_password',
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_USERPWD => $soapUser.":".$soapPassword,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $data
];
$ch = curl_init();
curl_setopt_array($ch , $options);
$response = curl_exec($ch);
if (curl_errno($ch)) {
print curl_error($ch);
}else{
print_r($response);
}
curl_close($ch);
不要忘记提及其内容类型的CURLOPT_HTTPHEADER,这很重要.
同时从 https://curl.haxx.se/ca/cacert.pem 下载中间证书。它包含所有有效的 CA。
感谢@drew010的帮助。
使用 CURLOPT_SSLCERT
指定客户端身份验证证书时,PEM 文件应包含一个后跟证书的-----BEGIN CERTIFICATE-----
行。
您还需要使用 CURLOPT_SSLKEY
向证书提供 cURL 和相应的私钥,这是一个以 -----BEGIN PRIVATE KEY-----
开头的文件。
如果私钥在 ssl_file_relative_address.pem
中,请尝试将私钥复制到单独的文件中。
如果私钥已加密,则可以使用 CURLOPT_SSLKEYPASSWD
指定密码。