Команда 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.
Не забудьте добавить сертификат клиента в доверительный сервер сервера, если это необходимо.
Ссылка
Ответ 3
Это решило это для меня - просто немного другой способ кодирования ключа. (cURL с сертификатами SSL завершается неудачно: ошибка 58 не может установить файл закрытого ключа)