Репост из 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.
Для создания сертификата я использовал следующее:
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
keytool -keystore test.jks -alias localhost -certreq -file cert-file -storepass changeit -sigalg SHA256withRSA -keysize 2048 -keyalg RSA
Загрузка корневых, промежуточных и служебных сертификатов на сервер
Импортировать сертификаты в файл jks
keytool -importcert -file $CERT -alias $ALIAS -keystore test.jks
keytool -importkeystore -srckeystore test.jks -destkeystore test.p12 -srcstoretype jks -deststoretype pkcs12
openssl pkcs12 -in test.p12 -nodes -nocerts -out key.pem
openssl rsa -in key.pem -check -out rsa.pem
openssl pkcs12 -in test.p12 -nokeys -out cert.pem
cat rsa.pem cert.pem > certrsa.pem
RSA key ok
-----BEGIN RSA PRIVATE KEY-----
должно стать примерно таким (пожалуйста, покажите мне, как это правильно сделать:
Bag Attributes
friendlyName: *****
localKeyID: *****
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
Конечным результатом является файл 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-----
Последовательность должна быть такой, как показано ниже