LINUX.ORG.RU

Как самостоятельно проверить ssl-сертификат?

 , ,


0

2

Предположим, что у нас есть контрол-сервер с доменом на https. Какие действия нам нужно совершить чтобы проверить, что это не evil twin с сертификатом от «Дядя Вася и Ко»?

К серверу подключаемся сокетом, потом работаем при помощи библиотеки openssl.

★★★★

На C++ как-то так:

boost::asio::io_context ioContext;
boost::asio::ssl::context tlsContext{boost::asio::ssl::context::tlsv12_client};
loadRootCertificates(tlsContext, boost::filesystem::current_path() / "localhost.crt");
tlsContext.set_verify_mode(boost::asio::ssl::verify_peer);
tlsContext.set_verify_callback(boost::asio::ssl::host_name_verification{"localhost"});
dvetutnev ()
Ответ на: комментарий от PPP328

что такое crt файл

Корневой сертификат(ы).

и где его взять?

Добываются из операционки, либо с собой носишь (так браузеры делают).

в тегах С

Этот момент я проморгал))

dvetutnev ()

Инициализируешь OpenSSL, делаешь SSL_CTX_new(). Через SSL_CTX_set_verify() в режиме SSL_VERIFY_PEER можешь добавить свой коллбек, который посмотрит на цепочку сертификатов после того, как на неё посмотрел OpenSSL.

Потом SSL_new() для нового подключения. Создаёшь и подключаешь сокет к серверу, отдаёшь сокет OpenSSL через SSL_set_fd(). Выполняешь хендшейк через SSL_connect(). В процессе вызовется твой коллбек, который может зарезать подключение, если ему не понравится сертификат, который показал сервер.

ilammy ★★★ ()
Ответ на: комментарий от PPP328

Да всё там доступно, мангли и дёргай методы вручную

mittorn ★★★★★ ()
Ответ на: комментарий от ilammy

Ты забыл про проверку того, что в сертификате указан тот домен, с которым мы соединяемся. Без этой проверки все сделанное ранее бесполезно. А самое печальное, что официальный пример с https://wiki.openssl.org/index.php/SSL/TLS_Client тоже ее не делает, только небольшой комментарий оставлен

/* Step 3: hostname verification */
/* An exercise left to the reader */

Процентов 90 программистов его просто проигнорируют.

Vovka-Korovka ★★★★★ ()
Ответ на: комментарий от PPP328

Начнем с того, что такое crt файл и где его взять?

У тебя сертификат на сервере кем подписан? Публичным Certificate Authority или нет? Если публичным, то никакой crt тебе не нужен, просто дернешь SSL_CTX_set_default_verify_paths(), который скажет OpenSSL, что нужно использовать набор CA из системы.

Vovka-Korovka ★★★★★ ()
Ответ на: комментарий от Vovka-Korovka

Так вот в коллбеке это всё и делается: хочешь — проверяй хостнейм, хочешь — проверяй, что сертификат на это имя выдан кем-то ожидаемым, хочешь — весь сертификат и его цепочку сверяй с ожидаемыми. Всё в зависимости от уровня доверия PKI.

ilammy ★★★ ()
Ответ на: комментарий от ilammy

Так вот в коллбеке это всё и делается: хочешь — проверяй хостнейм

Самому писать логику проверки хостнейма в callback-е то еще удовольствие - сомневаюсь, что ТС с таким справится. Лучше воспользоваться X509_VERIFY_PARAM_set1_host(), которую нужно вызвать до установления соединения.

Vovka-Korovka ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.