Существует сервер с разорванной цепочкой SSL, о чем сообщает эта проверка SSL :
Я знаю, что это проблема, которая должна решаться на самом сервере, но иногда это трудно исправить (я не администратор сервера).
Дело в том, что Chrome / Mozilla / Edge в Windows все равно доверяют сертификату сайта :
Однако в развертывании Gnu / Linux (Ubuntu 18.04 в Docker) сертификат не является доверенным:
curl: (60) SSL certificate problem: unable to get local issuer certificate
Я попробовал update-ca-certificates
и даже импортировал корневой сертификат Globalsign. update-ca-certificates
сообщили дубликат сертификата в этом случае. Во всяком случае, ничего не работает.
Как воспроизвести
Используя Docker:
docker run -it ubuntu:18.04
# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it # <---- "unable to get local issuer certificate"
Как я могу заставить Gnu / Linux доверять этому сертификату?
PS: тот же сертификат правильно развернут на другом сервере .
curl
openssl
ssl
certificates
Удо Г
источник
источник
Ответы:
Реальное исправление для этого - убедиться, что ваш сервер представляет все сертификаты в цепочке, а не только сертификат конечного объекта (сервера).
Укажите вашему администратору сервера раздел 7.4.2 RFC 5246, в котором четко указано, что это сообщение передает клиенту цепочку сертификатов сервера .
Если ваш администратор отказывается / не может сделать это по какой-то причине, альтернативный вариант - попытаться приступить
curl
к работе с неправильно сформированным рукопожатием.Согласно сообщению в списке рассылки Curl:
Вы должны быть в состоянии добавить Root CA и все промежуточные сертификаты в пакет и указать
curl
на него, используя--cacert <file>
опцию.Поскольку ваши браузеры работают, вы можете получить доступ к правильным сертификатам CA оттуда. На вкладке сертификаты (разные для каждого браузера, но я уверен, что вы это выясните), просмотрите цепочку сертификатов. Дважды щелкните Root CA первого Globalsign Root CA - G1 и на Подробнее вкладке, щелкните Копировать в файл ... . Сохранить как
root.cer
. Сделайте то же самое с AlphaSSL CA - SHA256 - G2 и сохраните его какissuing.cer
. Соедините их вместе в один файл (напримерchain.cer
) и используйте это в качестве аргумента-cacert
.Как любезно указано @AB, недостающий сертификат также можно найти здесь .
Ваши браузеры работают, потому что они кэшируют сертификаты CA. Если вы когда-то переходили на правильно настроенный веб-сайт, сертификат которого был выдан тем же центром сертификации, что и сертификат вашего сервера, он будет кэшироваться браузером. При последующем посещении неправильно настроенного сайта ваш браузер будет использовать сертификаты CA в своем кэше для построения цепочки. Вам кажется, что все в порядке, хотя за кадром сервер неправильно настроен.
Обратите внимание, что в Windows IE / Edge и Chrome используют один и тот же кеш, а Firefox использует свой собственный.
В дополнение к вышесказанному IE / Edge и Chrome (поскольку они совместно используют один и тот же стек шифрования) будут использовать расширение в сертификатах, которое называется AuthorityInformationAccess . У этого есть опция caIssuer, которая предоставляет URL, с которого можно загрузить сертификат CA сертификата конечного объекта. Поэтому, даже если один из этих браузеров не кэшировал отсутствующие сертификаты из предыдущего просмотра, он может извлечь их при необходимости. Обратите внимание, что Firefox этого не делает, поэтому иногда Firefox может показывать ошибки сертификатов, когда IE / Edge и Chrome работают.
источник
--cacert cacert.pem
но CURL по-прежнему не принимает сертификат.echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443
и вы увидите только один сертификат, представленный вашим сервером. Должно быть два - сертификат конечного объекта (который представлен) и выдающий CA - сертификат Alpha SSL - SHA256 - G2. Последний не отправляется сервером, но должен.