Найти причину периодических ошибок «Неверный пароль» при использовании curl для подключения к третьему лицу с использованием зашифрованного закрытого ключа - PullRequest
0 голосов
/ 24 апреля 2019

У нас есть веб-приложение PHP, которое используется для периодической отправки данных стороннему API.Естественно, связь осуществляется через SSL, а ключ, защищенный паролем, хранится локально на нашем сервере и подается в curl.Вот код настройки curl:

/**
     * @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;
    }

Веб-приложение может попытаться сделать 10 отдельных синхронных запросов, используя приведенный выше код.Мы наблюдаем периодически возникающие проблемы, когда логовое ведение журнала curl возвращает следующую ошибку (имена хостов и IP-адреса, замаскированные для безопасности):

* About to connect() to *** port 443 (#59)
*   Trying xxx.xxx.xxx.xxx...
* Connected to *** (xxx.xxx.xxx.xxx) port 443 (#59)
*   CAfile: /path/to/ca.pem
  CApath: none
* Unable to load client key: Incorrect password
* NSS error -8177 (SEC_ERROR_BAD_PASSWORD)
* The security password entered is incorrect.
* Closing connection 59

Когда нам удается установить успешное соединение, в вывод журнала включается дополнительная строка:

* Initializing NSS with certpath: sql:/etc/pki/nssdb

Эта строка отсутствует во всех неудачных соединениях и, похоже, может содержать подсказку.Этот путь доступен и доступен на серверах, обрабатывающих запросы.

Пароль, который указывается для curl, правильный и действительно открывает ключ без проблем в командной строке.

На наших серверах работает CentOS Linux версии 7.6.1810 (Core) с PHP 7.0.33 и CURL версии 7.29.0 (x86_64-redhat-linux-gnu) libcurl / 7.29.0 NSS / 3.36 zlib / 1.2.7 libidn / 1.28 libssh2 / 1.4.3

Кто-нибудь когда-нибудь видел это раньше?Изначально мы думали, что это проблема с доступом к файлу, поскольку наш закрытый ключ хранится в сетевом хранилище высокой доступности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...