Команда curl - Не удается загрузить клиент cert -8018

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

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

Завершить журнал:

[[email protected]]#   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.

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

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

Ответы

Ответ 1

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

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

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

Ответ 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

Решение состоит в том, чтобы предоставить завиток ссылку на базу данных 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 файла .db, включая cert8.db. Это "старый" формат db, но он все равно должен работать. Просмотрите документацию 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, создайте переменную среды SSL_DIR:

export SSL_DIR=/home/user/nss

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

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

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

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

Ссылка