1

Я создал свой собственный CA:

openssl genrsa -out private/rootCA.key 2048
openssl req -batch -new -x509 -nodes -key private/rootCA.key -sha256 -days 1024 -config ./openssl.conf -out certs/rootCA.pem

Я создал сертификат для своего сайта:

openssl genrsa -out private/$domain.key 2048
openssl req -batch -new -key private/$domain.key -config ./openssl.conf -subj "/commonName=$domain" -out csr/$domain.csr
openssl x509 -req -in csr/$domain.csr -CA certs/rootCA.pem -CAkey private/rootCA.key -CAcreateserial -out certs/$domain.crt -days 500 -sha256

Я присоединяюсь к сертификату сайта и корневому сертификату в связке:

cat certs/$domain.crt certs/rootCA.pem > bundles/$domain.bundle.crt

Я копирую сертификат / ключ в каталог конфигурации nginx:

cp bundles/$domain.bundle.crt private/$domain.key /etc/nginx/conf/certs

Я уверен, что nginx использует эти сертификаты для моего сайта:

    ssl_certificate /etc/nginx/certs/mysite.bundle.crt;
    ssl_certificate_key /etc/nginx/certs/mysite.key;

Я перезапускаю nginx.

Я устанавливаю корневой сертификат в моей системе:

sudo cp certs/rootCA.pem /usr/local/share/ca-certificates/myrootCA.crt
sudo update-ca-certificates

Я проверяю с httpie:

»Http https://mysite

http: error: SSLError: HTTPSConnectionPool(host='mysite', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",),))

Я проверяю с помощью openssl (говорит, что он использует каталог ca-Certificates, который, по-видимому, не используется по умолчанию):

openssl s_client -host mysite -port 443 -prexit -showcerts -CApath /usr/local/share/ca-certificates

Который дает:

Verify return code: 19 (self signed certificate in certificate chain)

И проверка не завершена.

Открытие сайта в Chrome дает мне стандартную ошибку:

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

У меня есть два вопроса:

  1. Почему сайт не является доверенным для всей системы после установки корневого сертификата? Chrome использует общесистемные сертификаты, верно?
  2. Почему open_ssl s_client не может завершить проверку сертификата?

РЕДАКТИРОВАТЬ

Curl работает с общесистемным сертификатом:

curl https://mysite

Почему работает curl, а chrome/httpie нет?

2 ответа2

1

Для OpenSSL Ubuntu update-ca-certificates как описано на его man-странице, читает из /usr/share/ca-certificates И /usr/local/share/ca-certificates но записывает символические ссылки с именами subjhash.num, необходимыми OpenSSL, в /etc/ssl/certs и объединенный файл в /etc/ssl/certs/ca-certificates.crt поэтому последние два должны использоваться с -CApath и / или -CAfile соответственно.

curl очевидно, использует OpenSSL по умолчанию, который в этой сборке является /etc/ssl/certs/ , но в зависимости от того, какая Ubuntu, OpenSSL может быть достаточно старой, чтобы иметь ошибку, заключающуюся в том, что s_client НЕ использует значение по умолчанию автоматически.

Для Chrome я не могу помочь; Я не использую Chrome в Ubuntu. Оставил CW на случай, если кто-то другой сможет.

Хотя я знаю, что как только вы получите доверие к CA, последний Chrome также требует, чтобы ваш сертификат сервера (в терминах PKI, End Entity = EE = not CA) имел расширение SAN (SubjectAlternateNames) с правильными именами, которые ни один из другие (на данный момент), и вы не указываете, если / как вы это сделали. (расширенный :) rfc 2818 для HTTPS и стандарты CABforum уже более десяти лет требуют, чтобы серверные сертификаты содержали действительную SAN, и в настоящее время все или почти все клиенты используют SAN, когда они присутствуют, но, насколько мне известно, Chrome - единственный клиент, который требует присутствия SAN.

0

Кажется, мой самогенерируемый корневой CA был неправильным. Не хватало

basicConstraints               = CA:TRUE

Решив это, httpie ведет себя правильно. Странно, что curl не жаловался на это.

Это еще не решает проблему в Chrome, хотя ... Я предполагаю, что Chrome не использует общесистемные CA.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .