带有CURL PHP的SSL无法使用的两种方法

时间:2018-06-25 11:25:12

标签: php ssl curl

在SOAPUI中,我仅以SSL设置导入.pfx文件,然后测试API方法,并且该方法可以正常工作。现在,我想在SOAPUI中为我的PHP应用程序实现相同的工作示例。所以,我用CURL PHP来管理它。我所做的基本上是,将与SOAP UI中使用的证书相同的证书导入到PHP文件中。我想使用我的私钥使用我的公钥访问受保护的服务器。

更新:2018年6月29日

PFX文件:test-cert.pfx

 $url = 'https://domain.com.ph/api/id_num';

    $headers = array(
                    "Content-Type: application/json",
                    "token really_long_numbers",
                    );

    $curl = curl_init();

curl_setopt ($curl, CURLOPT_URL, $url );        
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_PORT , 443);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($curl, CURLOPT_SSLVERSION, 1);
curl_setopt($curl, CURLOPT_SSLCERT, "/Applications/XAMPP/xamppfiles/htdocs/d/client.pem");
curl_setopt($curl, CURLOPT_SSLKEY, "/Applications/XAMPP/xamppfiles/htdocs/d/key.pem");
curl_setopt($curl, CURLOPT_SSLKEYPASSWD, "******");
curl_setopt($curl, CURLOPT_CAINFO, "/Applications/XAMPP/xamppfiles/htdocs/d/cacert.pem");

我尝试使用以下命令从PFX生成CA

openssl pkcs12 -in test-cert.pfx -out test-cert.pem -clcerts

AND / OR

openssl pkcs12 -in test-cert.pfx -out test-cert.pem -clcerts -nodes

现在是新错误

  

cURL错误#:SSL证书问题:无法获取本地发行者   证书

更新:2018年7月2日

我已经在php.ini文件中添加了以下行,当然,还从http://curl.haxx.se/ca/cacert.pem

下载了cacert.pem文件。

[卷曲] ; CURLOPT_CAINFO选项的默认值。这必须是 ;绝对路径。

curl.cainfo="/Applications/XAMPP/xamppfiles/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/XAMPP/xamppfiles/etc/openssl/certs/cacert.pem"

我的php.ini配置文件位于

Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

并在curl中添加以下行

CURLOPT_CAINFO =>'/path/to/my/exported/cacert.pem'

CURLOPT_CAPATH =>'/path/to/my/exported/cacert.pem'

我还启用了Apache配置和php.ini中的以下行php_openssl.dllmod_ssl

最后,我也在cacert.pem位置下载了ca-bundle.crt。

仍然无法正常运行。

1 个答案:

答案 0 :(得分:1)

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_PORT , 443);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($curl, CURLOPT_SSLVERSION, 1);
curl_setopt($curl, CURLOPT_SSLCERT, getcwd() . "/my_cert.pem");
curl_setopt($curl, CURLOPT_SSLKEY, getcwd() . "/my_key.pem");
curl_setopt($curl, CURLOPT_CAINFO, getcwd() . "/cacert.pem");

您需要指定全部3个-私钥(SSLKEY),公共证书(SSLCERT)和证书颁发机构链(CAINFO),直至根CA。 密钥和证书应为纯文本PEM格式,而不是PFX

openssl pkcs12 -in test-cert.pfx -out test-cert.pem -nodes

更新:2018年6月29日

http://curl.haxx.se/ca/cacert.pem(或也包含RSA-1024证书的https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt)下载到/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem中 然后更新php.ini并重新启动Apache

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"