Срок и имя — две проверки из трёх. Третья — кто подписал сертификат.
Сертификат подписывает центр сертификации, CA, своим ключом — его имя стоит в issuer. Клиент верит подписи, если сертификат этого CA лежит в его хранилище доверия. В Ubuntu хранилище — файл /etc/ssl/certs/ca-certificates.crt: в нём корневые сертификаты публичных CA. Свой CA туда добавляют файлом в /usr/local/share/ca-certificates и командой update-ca-certificates — так на этой машине добавлен учебный Lab Root CA.
openssl verify проверяет файл сертификата так же, как curl: издателя по хранилищу и срок.
Корневой сертификат CA подписан сам собой: subject и issuer у него одинаковые. Такой сертификат называют самоподписанным. Корню верят, потому что он лежит в хранилище, а самоподписанному сертификату сайта — только там, где его добавили в хранилище вручную. curl --cacert ca.crt проверяет издателя по одному этому файлу вместо хранилища.
curl -k пропускает все три проверки и получит страницу у любого сервера. Чтобы узнать, отвечает ли nginx, он годится, но сайт не чинит: браузеры проверку не выключают.
Коллега для проверки выпустил сертификат test.lab.test сам себе — subject и issuer у него одинаковые, CN = test.lab.test. Срок и имя в порядке. Что напечатает curl https://test.lab.test/?
-
Срок в порядке по условию. Ошибка будет про издателя: test.lab.test нет в хранилище доверия.
-
Третья проверка не пройдёт: издателя test.lab.test нет в хранилище доверия.
openssl verifyтакого файла пишетself-signed certificate. -
Имя в порядке по условию. curl споткнётся о подпись: издателя нет в хранилище доверия.
Сертификат, подписанный сам собой, проверку издателя проходит, только если он сам лежит в хранилище доверия. Так устроены корневые сертификаты CA, а сертификату сайта место в хранилище нужно добавлять явно на каждом клиенте.
Главное в шаге
- Клиент проверяет три вещи: издатель есть в хранилище доверия, имя из адреса есть в SAN, сейчас — между notBefore и notAfter.
- Не прошла любая — curl завершается с кодом 60 и называет причину в тексте ошибки.
-
Свой CA добавляют в хранилище файлом в
/usr/local/share/ca-certificatesи командойupdate-ca-certificates.