我们有一个PHP Web应用程序,用于定期将数据发送到第三方API。通讯自然是通过SSL进行的,并且受密码保护的密钥保存在我们服务器的本地位置,并被卷入卷曲。这是curl设置代码:
Applications / Xcode.app
Web应用程序可能尝试使用上述代码提出10个单独的同步请求。我们看到间歇性问题,其中curl vebose日志记录返回以下错误(为安全起见屏蔽了主机名和IP):
Contents / Developer / Applications / Simulator.app
当我们成功建立连接时,日志输出中会包含一行额外的内容:
/**
* @return Http
*/
public function post($url, $content, array $headers = array(), $ssl = true) {
$h = curl_init($this->getUrl($url));
$opts = array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $content,
CURLOPT_HTTPHEADER => $headers,
);
if ($ssl) {
$opts[CURLOPT_SSL_VERIFYHOST] = 2;
$opts[CURLOPT_SSL_VERIFYPEER] = true;
}
if ($this->certFile && $ssl) {
$opts[CURLOPT_SSLCERTTYPE] = $this->certType;
$opts[CURLOPT_SSLCERT] = $this->certFile;
if ($this->certKey) {
$opts[CURLOPT_SSLCERTPASSWD] = $this->certKey;
}
if ($this->sslKeyFile) {
$opts[CURLOPT_SSLKEY] = $this->sslKeyFile;
}
else if ($this->certCA) {
$opts[CURLOPT_CAINFO] = $this->certCA;
}
}
curl_setopt_array($h, $opts);
$this->handle = $h;
return $this;
}
在所有失败的连接中都缺少此行,似乎可以找到一个线索。在处理请求的服务器上,该路径可用且可访问。
提供给curl的密码是正确的,并且确实打开了密钥,而命令行上没有问题。
我们的服务器正在运行带有PHP 7.0.33和CURL版本7.29.0(x86_64-redhat-linux-gnu)的CentOS Linux版本7.6.1810(核心)libcurl / 7.29.0 NSS / 3.36 zlib / 1.2.7 libidn /1.28 libssh2 / 1.4.3
有人曾见过吗?我们最初认为这是文件访问问题,因为我们的私钥存储在高可用性网络存储中。
答案 0 :(得分:0)
我们有完全相同的问题。
一个特殊的时刻-问题出在运行php-fastcgi
的服务器上。
我们有fastcgi
的12个线程。
其中2个稍后开始,然后其他10个开始。
这两个线程在每个请求上始终具有SEC_ERROR_BAD_PASSWORD
-。
另外10个线程总是很好。
如果您也使用fastcgi,则可以通过添加以下内容来记录线程pid:
$pid = getmypid();
找到脚本,找出哪个线程坏了。
在我们的例子中,杀死了这两个断开的线程之后,每个请求都没问题。
不知道为什么这两个线程中断了-也许它们是在配置错误的那一刻开始的。