certchain.ru

Порядок сертификатов в файле

Сервер отдаёт сертификаты списком. Порядок в этом списке не украшение: клиент идёт по нему сверху вниз и строит цепочку.

Как правильно

Первым в файле лежит листовой сертификат, за ним промежуточные, по порядку подписи. Корневой в файл не кладут: он есть у клиента, и лишнее звено только удлиняет рукопожатие.

fullchain.pem = листовой + промежуточный(е)

# nginx
ssl_certificate     /etc/nginx/ssl/example/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example/privkey.pem;

Если порядок перепутан

Клиенты, которые собирают цепочку сами, могут этого не заметить. Строгие замечают сразу. Частый симптом: в браузере сайт открывается, а в Java или в мобильном приложении падает проверка.

Бывает и наоборот: цепочка собирается не до конца, и клиент сообщает про самоподписанный сертификат. Хотя на самом деле промежуточный просто лежит ниже, чем нужно.

Проверка

Смотреть надо не на файл на диске, а на то, что уезжает наружу:

openssl s_client -connect example.com:443 -servername example.com -showcerts

Сервер должен отдать больше одного сертификата, и первый должен совпадать с именем, к которому вы подключились.

Откуда берётся путаница

У многих инструментов рядом лежат два файла: cert.pem только с листовым и fullchain.pem вместе с промежуточными. В конфиг сервера обычно нужен второй. Если после замены сертификата отвалились не все клиенты, а только часть, скорее всего в конфиг попал первый.

Проверял это на своём сайте: Nginx принимал fullchain, а один старый клиент всё равно ругался, потому что промежуточный в файле стоял после корневого. Переставил, заработало.