PHP curl降低SSL安全性(ca md太弱错误)



我正在尝试使用我的证书和私钥发送简单的GET请求:

$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://example.com',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_SSLCERT => '/path_to/cert.pem',
CURLOPT_SSLKEY => '/path_to/key.pem',
));
curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
var_dump($error);
die();

在终端中对应的命令是:

curl -GET --key key.pem --cert cert.pem https://example.com

运行这个curl我得到这个错误-could not load PEM client certificate, OpenSSL error error:140AB18E:SSL routines:SSL_CTX_use_certificate:ca md too weak, (no key found, wrong pass phrase, or wrong file format?)

根据我的理解,这是因为我使用的证书是用md5哈希签名的。(如何修复SSL问题SSL_CTX_use_certificate: ca md在Python Zeep上太弱)

我不能重新创建这些密钥,所以我发现的解决方案是降低ssl安全级别(https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level),要做到这一点,我需要编辑我的/etc/ssl/openssl.cnf文件,特别是这一部分-CipherString = DEFAULT@SECLEVEL=1(从SECLEVEL=2设置到SECLEVEL=1)。

编辑我的openssl.cnf后,如果我在终端运行curl命令-它工作。然而,如果我在PHP中运行它,问题仍然存在。

我尝试设置不同的curl选项,但似乎没有工作。以下是我尝试过的curl选项:

CURLOPT_SSL_VERIFYHOST => false
CURLOPT_SSL_VERIFYPEER => false
CURLOPT_SSL_CIPHER_LIST => 'TLSv1'
CURLOPT_SSL_CIPHER_LIST => 'DEFAULT@SECLEVEL=1'

是否有一种方法可以解决这个问题,而不需要编辑openssl.cnf文件,只需设置一些curl选项?

我发现您可以将自定义openssl配置传递给php cli,并提出了一个可能的(丑陋的)解决方案:

  1. 在项目的某个地方创建一个单独的openssl.cnf文件,降低安全设置:
openssl_conf = default_conf
[ default_conf ]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1
  1. 创建一个单独的php example.php文件来发出curl请求:
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://example.com',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_SSLCERT => 'cert.pem',
CURLOPT_SSLKEY => 'key.pem',
));
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
  1. 现在调用该文件,并通过shell_exec在主代码中使用php cli传递自定义openssl配置:

$cmd = shell_exec("OPENSSL_CONF=openssl.cnf php example.php";

这样你就不需要降低整个项目的openssl版本/安全性,相反,它只会在这个请求中被降低。Curl文件可以修改为更动态(自定义url,查询参数,键等)。

最新更新