Назад | Перейти на главную страницу

Добавить сертификат SSL после ошибки curl: «невозможно получить сертификат местного эмитента»

Я пытаюсь получить доступ к партнерскому SOAP API, для этой цели я сделал CSR и получил CRT. Я создал файл PEM со своим ключом и CRT:

cat mycert.crt mykey.key > mycertandkey.pem

Когда я пытаюсь попасть в сервис с помощью curl:

curl --verbose --cert mycertandkey.pem https://partner/service?wsdl
* Hostname was NOT found in DNS cache
*   Trying IP.IP.IP.IP...
* Connected to PARTNER (IP.IP.IP.IP) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

Теперь, когда я пытаюсь использовать параметр -k, все работает нормально, но я бы предпочел добавить их текущий сертификат SSL, чтобы я мог подключиться без параметра -k.

Я хотел бы попробовать второй вариант в следующем ответе, но пока не удалось: https://stackoverflow.com/a/24618403/2730032

Я получил разные сертификаты из моей партнерской службы с помощью openssl, например: https://stackoverflow.com/a/7886248/2730032

Впоследствии я попытался добавить эти сертификаты на свой сервер с помощью https://superuser.com/a/437377

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

РЕДАКТИРОВАТЬ 1: Вот что происходит, когда я пытаюсь получить сертификаты через SSL

openssl s_client -showcerts -connect PARTNER:443 </dev/null
CONNECTED(00000003)
depth=0 O = PARTNER_INFO, OU = PARTNER_INFO, CN = PARTNER_INFO
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = PARTNER_INFO, OU = PARTNER_INFO, CN = PARTNER_INFO
verify error:num=27:certificate not trusted
verify return:1
depth=0 O = PARTNER_INFO, OU = PARTNER_INFO, CN = PARTNER_INFO
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO
   i:/C=PARTNER_INFO/ST=PARTNER_INFO/L=PARTNER_INFO/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO CA/emailAddress=PARTNER_INFO
-----BEGIN CERTIFICATE-----
CERTIFICATE1
-----END CERTIFICATE-----
 1 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)10/CN=VeriSign Class 3 Secure Server CA - G3
   i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
-----BEGIN CERTIFICATE-----
CERTIFICATE2
-----END CERTIFICATE-----
 2 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
-----BEGIN CERTIFICATE-----
CERTIFICATE3
-----END CERTIFICATE-----
---
Server certificate
subject=/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO
issuer=/C=PARTNER_INFO/ST=PARTNER_INFO/L=PARTNER_INFO/O=PARTNER_INFO/OU=PARTNER_INFO/CN=PARTNER_INFO CA/emailAddress=PARTNER_INFO
---
No client certificate CA names sent
---
SSL handshake has read 3872 bytes and written 503 bytes
---
MORE INFO...

Я также пробовал openssl s_client -showcerts -key mycertandkey.pem -connect PARTNER:443 </dev/null но дает те же результаты (и сертификаты).

РЕДАКТИРОВАТЬ 2: Как я уже прокомментировал в единственном ответе: данный партнер добавил ЦС Gandi на свой сервер (по крайней мере, так они мне говорят), и теперь он работает. Кажется, поскольку их сертификат теперь подписан центром сертификации, который находится в моем пакете CA по умолчанию, теперь я могу заставить curl работать без флага -k. Однако было бы неплохо узнать, как я мог бы исправить проблему со своей стороны.

Предполагая, что ваша система с curl обновлена ​​и имеет последние сертификаты CA от вашего поставщика, вам не следует импортировать какие-либо сертификаты. Импорт сертификата для домена, который вам не принадлежит, всегда должен быть крайней мерой. В этом случае настройте задание cron, чтобы ежемесячно отправлять электронное письмо вам и партнеру, чтобы напомнить вам обоим, что необходимо исправить это. Импорт чужого сертификата воля вызовет проблемы для вас позже, когда истечет срок действия этого сертификата. Теперь вам нужно управлять сертификатами, которые вам не принадлежат. Обращайтесь к партнеру или поставщику, пока они не исправят установку сертификата.

Попросите их протестировать свой сайт:

Тестирование через веб-интерфейс

Qualys

SSL покупатель

Из командной строки

TestSSL Для этого требуются только openssl и bash. Это полезно для VIP / конечных точек, которые не открыты для всего Интернета, например для промежуточных сайтов.

Просто git clone https://github.com/drwetter/testssl.sh.git затем используйте testssh.sh для проверки службы https.

После того, как сайт SSL верен

Теперь вам нужно убедиться, что ваши сертификаты CA в вашей операционной системе серверов актуальны. Метод их обновления зависит от дистрибутива ОС и будет оставлен на усмотрение ваших системных администраторов.

Импорт сертификатов

После того, как вы убедились, что ваш партнерский сайт настроен правильно; это означает, что он правильно проверяется в Qualys, SSL Shopper и TestSSL.sh, затем

Скопируйте сертификат в /etc/pki/ca-trust/source/anchors/ импортировать и проверить его.

cp /path/to/bad_partner_cert.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust enable
update-ca-trust extract
openssl verify /etc/pki/ca-trust/source/anchors/bad_partner_cert.pem

Опять же, это должно быть последнее средство и очень временное, поскольку теперь вы управляете сертификатом, который вам не принадлежит.

В --cert опция предназначена для указания собственного сертификата (сертификата клиента). Но не удается проверить сертификат сервера. Чтобы указать этот сертификат, используйте либо --cacert или --capath, в зависимости от того, как у вас есть сертификат сервера / CA (см. документацию по curl). Обратите внимание, что у вас обычно нет закрытого ключа для сертификата сервера, поэтому следует указывать только сертификат без ключа.