Как работать с сертификатми? |
Здравствуйте, гость ( Вход | Регистрация )
Как работать с сертификатми? |
Rocky |
24.12.2010, 15:28
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Все привет! Если кто знает, подскажите пожалуйста, как работать с certificates? Вот например. Я сделал запрос через QNetworkAccessManager. Соединил сигнал sslErrors со своим слотом. Захожу на какой-то сайт через https. А дальше как? Если у этого домена есть сертификат, я должен вывалиться в слот, соединенный с сигналом sslErrors, у QNetworkReply взять сертификат и проверить его? А как проверять... и главное с чем сравнивать? В программе должна быть база данных сертификатов? Просто дали задание, а как тут быть неясно....
Огромное спасибо за любую информацию! |
|
|
PAFOS |
27.12.2010, 19:53
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
Самая распространенная ошибка при работе с сертификатом - когда сертификат подписан локально (т.е. НЕ через службу подписи
В этом случае браузеры выдают предупреждение мол так и так - сертификат неизвестно откуда и неизвестно кем подписан. В Qt - выполнение попадет в слот, с ошибкой QSslError::HostNameMismatch Как поступить - решать Вам, если вызовете слот ignoreSslError() тогда соединение продолжится. Получить сертификат можно с помощью метода QSslCertificate QSslError::certificate () const Его безусловно можно сравнить с любым другим ( bool QSslCertificate::operator== ( const QSslCertificate & other ) const ). Вот) З.Ы. повторю - это лишь одна из множества ошибок) |
|
|
Rocky |
27.12.2010, 22:23
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Круто, большое спасибо за ответ!!!
А как Большие Браузеры поступают?) Вот попался непонятный сертификат с какого-то сайта (просроченный, реально выданный другому хосту, untrusted и пр.). Они (Большие Браузеры) предупреждают об этом этом понятно. Если пользователь не хочет продолжать - то просто ничего не делаем... Если хочет, то я должен занести этот сертификат в локальную базу и потом когда снова вхожу на этот сайт - ищу в этой локальной базе его сертификат, и если нахожу, то вызываю ignoreSslErrors и радуюсь жизни? При этом как я понимаю, работать нужно примерно так (псевдокод):
И 2-й вариант... А если я например создаю базу доверенных хостов (вообще не заморачиваясь на сертификатах)... Зашел на сайт черз https, получил ошибки, увидел что сертификат левый - и по согласию пользователя добавил доменное имя хоста в список доверенных... И как бы все. Как на ваш взгляд наиболее правильно поступать? |
|
|
PAFOS |
27.12.2010, 22:30
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
slotSslErrors(QList<QSslError>& err....)
{ QList<QsslCertificate> certificates = err.certificates();//в цикле все сертификаты берем... defConf = QSslConfiguration::defaultConfiguration(); defConf->setCaCertificates(certificates); QSslConfiguration::setDefaultConfiguration(defConf); } нет, надо примерно так: slotSslErrors(QList<QSslError>& err) { foreach( const QSslError &e, err ) { } } |
|
|
Rocky |
27.12.2010, 22:35
Сообщение
#5
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Ну да, я коммент насчет цикла написал... ) Сам foreach опустил чтоб не загромождать... Я имею ввиду идею правильно понимаю? Просто я так делал, а при заходе на этот же сайт еще раз (не выходя из программы), снова вываливался в слот sslErrors с теми же ошибками касаемо сертификатов, что и в первый раз.... Или стоп... так и должно быть? При reload-e какбы новый handshake у сокетов происходит? А можно как-то сделать чтобы вот принял я этот (пускай невалидный) сертификат, и больше для этого сайта в слот sslErrors не попадаю... Или так никак не сделать?)
Сообщение отредактировал Rocky - 27.12.2010, 22:36 |
|
|
PAFOS |
27.12.2010, 22:45
Сообщение
#6
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
я бы сделал как-то так... )
Цитата А если я например создаю базу доверенных хостов (вообще не заморачиваясь на сертификатах) А что если коннект будет идти через прокси? тогда злоумышленник может предоставить свой сертификат и весь трафик будет как на ладони. |
|
|
Rocky |
28.12.2010, 9:30
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
А в случае, если у хоста все нормально (например, https://google.com) с сертификатами (т.е. я не попадаю в слот ошибок ssl), как эти сертификаты тогда можно достать? Ведь если я правильно понимаю, тогда в БД должны быть все сертификаты, с которыми работает браузер... И нормальные, и те, с которыми что-то не так....
И такой вопрос.... Qt (через механизмы openSSL) сам (на "низком" - не пользовательском уровне) при https-запросе отправляет информацию о сертификате хоста в центры CA? Т.е. вот этот механизм меня, как конечного пользователя Qt, не должен интересовать вообще, так? И, наверное, последний вопрос... Почему именно QSslError::HostNameMismatch? Почему не CertificateExpired или не CertificateUntrusted? Можно где-то подробнее об этих ошибках почитать? А то в Qt Assistant только идентификаторы указаны этих ошибок и больше ничего на найти.... и не нагуглить( |
|
|
PAFOS |
28.12.2010, 14:24
Сообщение
#8
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
Цитата при заходе на этот же сайт еще раз (не выходя из программы), снова вываливался в слот sslErrors с теми же ошибками касаемо сертификатов, что и в первый раз.... Или стоп... так и должно быть? При reload-e какбы новый handshake у сокетов происходит? Да, конечно - создается новые подключение же )) Цитата А можно как-то сделать чтобы вот принял я этот (пускай невалидный) сертификат, и больше для этого сайта в слот sslErrors не попадаю... Или так никак не сделать?) Вроде можно. Поиграйся с QSslConfiguration - там можно тонко настроить поведение QNetworkReply с ssl. Цитата А в случае, если у хоста все нормально (например, https://google.com) с сертификатами (т.е. я не попадаю в слот ошибок ssl), как эти сертификаты тогда можно достать? После того как QNetworkReply установит соединение его sslConfiguration изменится. Оттуда можно получить peerCertificate(). Цитата И такой вопрос.... Qt (через механизмы openSSL) сам (на "низком" - не пользовательском уровне) при https-запросе отправляет информацию о сертификате хоста в центры CA? Т.е. вот этот механизм меня, как конечного пользователя Qt, не должен интересовать вообще, так? Насчет этого я точно не знаю( Тоже интересно было бы узнать этот момент. Цитата И, наверное, последний вопрос... Почему именно QSslError::HostNameMismatch? Почему не CertificateExpired или не CertificateUntrusted? Можно где-то подробнее об этих ошибках почитать? А то в Qt Assistant только идентификаторы указаны этих ошибок и больше ничего на найти.... и не нагуглить( Про HostNameMismatc это я из личного опыта взял). CertificateExpired - у каждого сертификата же есть срок годности) эта ошибка видать вываливается когда он уже истек. CertificateUntrusted - ненадежный сертификат. Я так подозреваю, что это ошибка вывалится, когда в sslConfiguration не нашлось такого сертификата, хотя он и подписан доверенным лицом. Этот момент надо проверить ) В любом случае отпишись как че узнаешь, меня эта тема тоже интересует) |
|
|
Rocky |
28.12.2010, 18:10
Сообщение
#9
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Ок, узнаю что-то новое, напишу тут) Еще раз спасибо!
|
|
|
Текстовая версия | Сейчас: 1.12.2024, 23:34 |