У нас есть веб-приложение 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
Кто-нибудь когда-нибудь видел это раньше?Изначально мы думали, что это проблема с доступом к файлу, поскольку наш закрытый ключ хранится в сетевом хранилище высокой доступности.