Я должен использовать службу, которая использует самоподписанный сертификат (из Ubuntu). Я добавил центр сертификации компании в список доверенных (Ubuntu). После этого ошибка «Самоподписанный сертификат в цепочке» исчезла, но теперь я получаю ошибку «Слишком слабый сертификат CA». Например,
curl -vvv https://someservicehost.net
* Trying 93.184.216.34:443...
* TCP_NODELAY set
* Connected to someservicehost.net (93.184.216.34) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, bad certificate (554):
* SSL certificate problem: CA certificate key too weak
* Closing connection 0
curl: (60) SSL certificate problem: CA certificate key too weak
Я попытался найти его, но информации об этом на удивление мало. Итак, у меня есть 2 вопроса
На момент написания этой статьи example.net
использовал сертификат, подписанный промежуточным ЦС DigiCert SHA2 Secure Server CA
, который, в свою очередь, подписан DigiCert. Глобальный корневой ЦС
корневой ЦС. Оба сертификата ЦС используют 2048-битный ключ RSA. Однако, если вы находитесь за корпоративным прокси-сервером TLS, фактический ЦС может использовать только 1024-битный ключ (вы не предоставили никаких подробностей о нем), поэтому адаптируйте остальную часть ответа в соответствии с размером ключа этого сертификата ЦС. . Если вы не можете избежать прокси-сервера, лучшим подходом, чем тот, который описан ниже, было бы узнать, можно ли использовать на нем сертификат ЦС с более надежным ключом.
Когда OpenSSL проверяет цепочку сертификатов, он сравнивает размер ключа с настроенным уровнем безопасности. Согласно документации, уровень 1 соответствует как минимум 80 битам безопасности, уровень 2 — 112 битам, уровень 3 — 128 битам, уровень 4 — 192 битам и уровень 5 — 256 битам.
В настоящее время считается, что 2048-битные ключи RSA имеют 112-битную защиту, поэтому, если вышеуказанный уровень равен 3 или выше, ключ отклоняется как слишком слабый. Поэтому, чтобы принять такой сертификат, вам придется снизить уровень безопасности до 2 или ниже.
Уровень можно настроить во время компиляции или через конфигурацию (он также может быть изменен программой, связывающей libssl/libcrypto, но похоже, что curl этого не делает). Уровень по умолчанию — 1 в соответствии с документацией, указанной выше.
Поэтому сначала проверьте параметры компиляции (openssl version -f
), а затем значение по умолчанию openssl.cnf
в вашей системе (каталог, в котором он находится, можно определить с помощью openssl version -d
). Может существовать параметр с именем CipherSuites
, который устанавливает SECLEVEL
(например, CipherString = DEFAULT@SECLEVEL=3
установит для него уровень 3).
Чтобы переопределить уровень, либо измените файл конфигурации по умолчанию, либо используйте пользовательский файл через переменную среды OPENSSL_CONF
. Например, следующий файл устанавливает уровень безопасности по умолчанию равным 2 (подробности см. в документации):
openssl_conf = openssl_conf_sect
[openssl_conf_sect]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = DEFAULT@SECLEVEL=2
Его можно использовать, например. с OPENSSL_CONF=/path/to/this.cnf curl -vvv https://example.net
.
Как указано в комментариях @dave_thompson_085, curl
позволяет настраивать комплекты шифров в командной строке. Таким образом, вместо того, чтобы возиться с конфигурацией, вы можете просто изменить уровень безопасности с помощью опции --ciphers
:
curl -vvv --ciphers DEFAULT@SECLEVEL=2 https://example.net