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

HAProxy - сертификат, подписанный CA, не является доверенным, несмотря на то, что он находится в хранилище доверенных сертификатов

Репост из Stack Overflow. Было предложено опубликовать здесь вместо этого, поскольку Stack Overflow предназначен для программирования, и этот вопрос сосредоточен на SSL и HAProxy.

Я пытаюсь завершить настройку SSL с помощью HAProxy. Для этого я составил CSR, отправил его в свою организацию и получил обратно доверенные сертификаты. Я создал необходимый файл pem из хранилища jks и установил его в файле haproxy.cfg. Однако браузер по-прежнему сообщает, что сайт не является доверенным и корневой сертификат не находится в доверенном хранилище:

This CA Root certificate is not trusted because it is not in the Trusted Root Certification Authorities store.

Однако другой промежуточный сертификат под ним в порядке. Я уже пробовал установить сертификат на своей стороне в качестве клиента, но он сообщает, что ему все еще не доверяют. Кроме того, когда я обратился к коллеге, чтобы перейти на эту страницу, у него была такая же проблема, несмотря на то, что я не импортировал ни одного сертификата на стороне клиента. Это заставляет меня думать, что проблема связана с настройкой файла pem.

Для создания сертификата я использовал следующее:

  1. Создать хранилище ключей
keytool -keystore test.jks -alias localhost -validity 365 -genkeypair -storepass changeit -keypass changeit -dname "CN=<FQDN for server>, OU=***** O=*****, L=*****, S=*****, C=*****" -ext SAN=DNS:$(hostname) -sigalg SHA256withRSA -keysize 2048 -keyalg RSA
  1. Создать CSR
keytool -keystore test.jks -alias localhost -certreq -file cert-file -storepass changeit -sigalg SHA256withRSA -keysize 2048 -keyalg RSA
  1. Загрузка корневых, промежуточных и служебных сертификатов на сервер

  2. Импортировать сертификаты в файл jks

keytool -importcert -file $CERT -alias $ALIAS -keystore test.jks
  1. Конвертировать jks в файл p12
keytool -importkeystore -srckeystore test.jks -destkeystore test.p12 -srcstoretype jks -deststoretype pkcs12
  1. Извлечь закрытый ключ без ключевой фразы:
openssl pkcs12 -in test.p12  -nodes -nocerts -out key.pem
  1. Преобразование закрытого ключа в ключ rsa:
openssl rsa -in key.pem -check -out rsa.pem
  1. Извлечь сертификаты без парольной фразы:
openssl pkcs12 -in test.p12 -nokeys -out cert.pem
  1. Объедините файлы rsa и cert в один файл pem.
cat rsa.pem cert.pem > certrsa.pem
  1. Правильный формат для части rsa для файла. Это:
RSA key ok
-----BEGIN RSA PRIVATE KEY-----

должно стать примерно таким (пожалуйста, покажите мне, как это правильно сделать:

Bag Attributes
    friendlyName: *****
    localKeyID: *****
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
  1. Проверьте полученный файл pem, чтобы убедиться, что промежуточный сертификат указан после ключа RSA. В противном случае HAProxy, похоже, выдает ошибку.

Конечным результатом является файл pem следующего формата:

Bag Attributes
    friendlyName: <private key>
    localKeyID: ****
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
<Hash goes here>
-----END RSA PRIVATE KEY-----
Bag Attributes
    friendlyName: <bottom certificate>
    2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
subject=/C=****/ST=****/L=****/O=**** PLC/OU=****/CN=****
issuer=/O=****/OU=<Intermediate CA>/CN=<Intermediate CA>
-----BEGIN CERTIFICATE-----
<Hash goes here>
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: intermediate
    2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
subject=/O=****/OU=<Intermediate CA>/CN=<Intermediate CA>
issuer=/O=****/OU=<Root CA>/CN=<Root CA>
-----BEGIN CERTIFICATE-----
<Hash goes here>
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: root
    2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
subject=/O=****/OU=<Root CA>/CN=<Root CA>
issuer=/O=****/OU=<Root CA>/CN=<Root CA>
-----BEGIN CERTIFICATE-----
<Hash goes here>
-----END CERTIFICATE-----

Несмотря на то, что в конечном PEM-файле есть все сертификаты, я все равно получаю недоверенный корневой сертификат. Прохожу ли я что-то, что я упускаю или делаю неправильно?

Обновление: мне удалось извлечь корневой сертификат с помощью Chrome и добавить его в свое локальное хранилище сертификатов. Когда я ранее устанавливал его, установка была настроена на автоматический поиск магазина, поэтому, вероятно, не был выбран правильный билет. Информация о сертификате теперь говорит, что сертификат в порядке. Однако вкладка безопасности по-прежнему сообщает, что:

Certificate - missing
This site is missing a valid, trusted certificate (net::ERR_CERT_AUTHORITY_INVALID).

Обновление 2: в конце файла удален самоподписанный сертификат. Не знаю, как это попало в запрос.

Обновление 3: после удаления самозаверяющего сертификата в конце файла pem я больше не получаю предупреждения от Chrome о том, что сертификат недействителен. Однако, когда я протестировал со своими коллегами, мы обнаружили, что они все еще получают ошибку. Моя основная теория сейчас заключается в том, что им необходимо загрузить и установить сертификаты в локальном хранилище доверенных сертификатов. Сейчас я смотрю, как новые веб-сайты справляются с этим, когда ни у кого еще нет сертификатов.

Пожалуйста, удалите «атрибуты сумки», потому что они взяты из файла pfx, который является атрибутом для Windows. Должно получиться вот так.

-----BEGIN RSA PRIVATE KEY-----
ENCRYPTED TEXT
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
ENCRYPTED TEXT
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
ENCRYPTED TEXT
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
ENCRYPTED TEXT
-----END CERTIFICATE-----

Последовательность должна быть такой, как показано ниже

  1. закрытый ключ
  2. сертификат сервера
  3. промежуточный сертификат
  4. корневой сертификат (необязательно)