使用curl通过加密的私钥连接到第三方时,找出间歇性的“ Invalid Password”错误的原因

时间:2019-04-24 08:29:22

标签: php ssl curl openssl

我们有一个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

有人曾见过吗?我们最初认为这是文件访问问题,因为我们的私钥存储在高可用性网络存储中。

1 个答案:

答案 0 :(得分:0)

我们有完全相同的问题。

一个特殊的时刻-问题出在运行php-fastcgi的服务器上。

我们有fastcgi的12个线程。 其中2个稍后开始,然后其他10个开始。

这两个线程在每个请求上始终具有SEC_ERROR_BAD_PASSWORD-。

另外10个线程总是很好。

如果您也使用fastcgi,则可以通过添加以下内容来记录线程pid:

$pid = getmypid();

找到脚本,找出哪个线程坏了。

在我们的例子中,杀死了这两个断开的线程之后,每个请求都没问题。

不知道为什么这两个线程中断了-也许它们是在配置错误的那一刻开始的。