Как диагностировать ошибку «Слишком слабый сертификат CA», как в любом случае использовать сертификат CA?

Я должен использовать службу, которая использует самоподписанный сертификат (из 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 вопроса

  • Как мне определить, какие именно свойства этого сертификата делают его «слабым»? Это хеш, длина ключа или что-то еще? Я намеренно пропустил сведения о сертификате, так как хочу знать, как диагностировать проблему, а не проблему с этим конкретным сертификатом.
  • Как заставить клиентское программное обеспечение доверять ему? Думаю, у меня нет возможности обновить сертификат CA.
0
задан 10 September 2020 в 23:28
1 ответ

На момент написания этой статьи 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
6
ответ дан 10 September 2020 в 13:48

Теги

Похожие вопросы