команда curl-невозможно загрузить сертификат клиента -8018

Я пытаюсь подключиться к защищенному веб-сервису через прокси-сервер с помощью команды curl, но я получаю следующую ошибку:

не удалось загрузить сертификат клиента -8018.

полный лог:

[e-ballo@myserver]#   curl  -v -x proxy01.net:8080 https://endPointURL.com/SOAP --key ./cert.crt --cert ./cert.crt -capath=/etc/pki/tls/certs
* About to connect() to proxy proxy01.net port 8080 (#0)
*   Trying 10.0.3.64... connected
* Connected to proxy01.net (10.0.3.64) port 8080 (#0)
* Establish HTTP proxy tunnel to endPointURL.com:443
> CONNECT endPointURL.com:443 HTTP/1.1
> Host: endPointURL.com:443
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.3.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Proxy-Connection: Keep-Alive
>
< HTTP/1.0 200 Connection established
<
* Proxy replied OK to CONNECT request
* Initializing NSS with certpath: sql:/home/e-ballo/
* Unable to initialize NSS database
* Initializing NSS with certpath: none
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* Unable to load client cert -8018.
* NSS error -8018
* Closing connection #0
curl: (58) Unable to load client cert -8018.

есть идеи, что означает эта ошибка ? и как я могу это исправить ?

заранее спасибо,

2 ответов


Я также испытал эту проблему на RHEL 6. curl был скомпилирован с NSS, который вы можете увидеть, проверив версию:

$ curl -V
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.3.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

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

создать сертификат

я начинал с хранилища ключей Java, которое было создано с помощью этой команды (значение псевдонима будет использоваться для ссылки на сертификат позже):

keytool -genkeypair -alias myclient -keyalg RSA -keystore client_keystore.jks

теперь это хранилище ключей JKS должно быть преобразовано в формат pkcs12:

keytool -importkeystore -srckeystore client_keystore.jks \
    -destkeystore client_keystore.p12 -srcstoretype jks \
    -deststoretype pkcs12

импорт сертификата в базу данных NSS

затем создайте базу данных NSS в каталоге по вашему выбору:

mkdir /home/user/nss
certutil -N -d /home/user/nss

эта команда certutil создает 3 .файлы БД, включая cert8.децибел. Это" старый " формат БД, но он все равно должен работать. Просмотрите документацию certutil, если вам нужно создать cert9.вместо этого файл db.

использовать pk12util для импорта client_keystore.p12 в базу данных NSS

pk12util -i client_keystore.p12 -d /home/user/nss

при необходимости просмотрите сохраненный сертификат в базе данных:

certutil -L -d /home/user/nss -n myclient

используйте сертификат от curl

сертификат теперь готов к использованию curl, но нам нужно сообщить curl, где его найти. Как указано в руководстве curl, создайте переменную среды SSL_DIR:

export SSL_DIR=/home/user/nss

наконец, команда curl:

curl -vk --cert myclient https://localhost:8443/my/url

Примечание: опция-k указано здесь, поскольку сервер использует самозаверяющий сертификат. См. руководство curl для указания cacert.

Не забудьте добавить сертификат клиента в хранилище доверия сервера, если это необходимо.

ссылка


Я уже исправил эту проблему, поэтому я опубликую решение. Может, поможет кому-нибудь.

моя версия curl была скомпилирована с библиотеками Netscape Security System (NSS) вместо библиотек openSSL. Версии curl, скомпилированные с помощью этих двух библиотек, используют разные методы доступа к сертификатам. Я вызывал плоский файл, который является методом openSSL. Другим решением будет установка NSS (уже на большинстве производных Red Hat) и создание cert9.файл db , импортируйте свой сертификат и ключ (после преобразования в P12 с openssl-не забудьте добавить "freindlyName" или псевдоним) в эту БД с помощью pk12util. Затем вы вызываете сертификат по его нику и даете пароль для БД.

другой вариант-получить или скомпилировать версию curl с помощью библиотек openssl. RedHat 5, ubuntu или Windows версии curl часто уже скомпилированы таким образом. Red Hat 6 поставляется с завитком, скомпилированным для NSS.