
Краткое содержание
Мне нужно загрузить самоподписанный сертификат с сервера, чтобы создать .JKS-файл для использования в качестве truststore в приложении. Как это сделать с сервера Red Hat?
Что я пробовал
Я попробовал использовать openssl для получения сертификата:
echo -n | openssl s_client -connect hostname.example.com:20000 -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > downloadedcerts.cert
Это приводит к сбою со следующим сообщением:
verify error:num=19:self signed certificate in certificate chain
Действительно, корневой сертификат этого сервераявляетсясамоподписанный, а не от CA. Меня это устраивает — корневой сертификат принадлежит правительственному агентству в моей стране — но openssl не подключается для загрузки сертификата.
Было бы легко загрузить URL-адрес в Firefox, вручную проигнорировать ошибку сертификата и загрузить сертификат, но я не могу подключиться к серверу со своего настольного компьютера из-за брандмауэров.
Любая помощь приветствуется :)
решение1
проверить ошибку:num=19:самозаверяющий сертификат в цепочке сертификатов
Действительно, корневой сертификат этого сервера является самоподписанным, а не выданным центром сертификации.
Это центр сертификации, просто ему не доверяют ;)
В отличие от браузеров (которые доверяют почти всему), OpenSSL не доверяет ничему (вам нужно указать, чему доверять).
Загрузите сертификат CA вашей страны (обычно этонетотправлено по цепочке). Егонетотправляется в цепочку, потому что это точка доверия; она у вас уже должна быть и вы должны ей доверять.
Сертификат CA обычно можно найти в сети. Например,здесьэто DigiCert,здесьVerisign и т. д. Проверьте сертификат, который вы загружаете. Проверка — это сложная часть, браузеры решают ее, используя собственный набор уже проверенных сертификатов.
Поместите сертификат CA вашей страны в отдельный файл. Затем используйте openssl s_client -connect hostname.example.com:20000 -CAfile my-country-ca.pem
. s_client
будет завершено с помощью Verify OK (0)
или аналогично.
решение2
Я бы рекомендовал создать свой собственный центр сертификации [ПРАВКА - не то, что хотелось. см. следующий абзац]. Это своего рода PITA, и когда вы исследуете, как это сделать, это кажется сложнее, чем есть на самом деле. Вы просто создаете фиктивную компанию, сертификат которой вы помещаете в свой Trusted Root клиентов, и она сможет подписывать сертификат(ы) вместо использования самоподписанных сертификатов.
Я нашел объяснение в ответе Бруно на этот вопрос здесь: https://stackoverflow.com/questions/4103472/ssl-handshake-fails-with-a-verisign-chain-certificate-that-contains-two-ca-s
Я не думал, что корневой сертификат является самоподписанным, но это имеет смысл. Так что, если я правильно понимаю, вы получаете нужный вам сертификат (первый), но также и все остальное в цепочке сертификатов. Корневой сертификат — это тот, кто вызывает сообщение.