Здравствуйте, гость ( Вход | Регистрация )
Rocky | Дата 28.12.2010, 18:10 |
Ок, узнаю что-то новое, напишу тут) Еще раз спасибо! | |
PAFOS | Дата 28.12.2010, 14:24 |
Цитата при заходе на этот же сайт еще раз (не выходя из программы), снова вываливался в слот 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, 9:30 |
А в случае, если у хоста все нормально (например, https://google.com) с сертификатами (т.е. я не попадаю в слот ошибок ssl), как эти сертификаты тогда можно достать? Ведь если я правильно понимаю, тогда в БД должны быть все сертификаты, с которыми работает браузер... И нормальные, и те, с которыми что-то не так.... И такой вопрос.... Qt (через механизмы openSSL) сам (на "низком" - не пользовательском уровне) при https-запросе отправляет информацию о сертификате хоста в центры CA? Т.е. вот этот механизм меня, как конечного пользователя Qt, не должен интересовать вообще, так? И, наверное, последний вопрос... Почему именно QSslError::HostNameMismatch? Почему не CertificateExpired или не CertificateUntrusted? Можно где-то подробнее об этих ошибках почитать? А то в Qt Assistant только идентификаторы указаны этих ошибок и больше ничего на найти.... и не нагуглить( |
|
PAFOS | Дата 27.12.2010, 22:45 |
я бы сделал как-то так... )
Цитата А если я например создаю базу доверенных хостов (вообще не заморачиваясь на сертификатах) А что если коннект будет идти через прокси? тогда злоумышленник может предоставить свой сертификат и весь трафик будет как на ладони. |
|
Rocky | Дата 27.12.2010, 22:35 |
Ну да, я коммент насчет цикла написал... ) Сам foreach опустил чтоб не загромождать... Я имею ввиду идею правильно понимаю? Просто я так делал, а при заходе на этот же сайт еще раз (не выходя из программы), снова вываливался в слот sslErrors с теми же ошибками касаемо сертификатов, что и в первый раз.... Или стоп... так и должно быть? При reload-e какбы новый handshake у сокетов происходит? А можно как-то сделать чтобы вот принял я этот (пускай невалидный) сертификат, и больше для этого сайта в слот sslErrors не попадаю... Или так никак не сделать?) | |
PAFOS | Дата 27.12.2010, 22:30 |
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:23 |
Круто, большое спасибо за ответ!!! А как Большие Браузеры поступают?) Вот попался непонятный сертификат с какого-то сайта (просроченный, реально выданный другому хосту, untrusted и пр.). Они (Большие Браузеры) предупреждают об этом этом понятно. Если пользователь не хочет продолжать - то просто ничего не делаем... Если хочет, то я должен занести этот сертификат в локальную базу и потом когда снова вхожу на этот сайт - ищу в этой локальной базе его сертификат, и если нахожу, то вызываю ignoreSslErrors и радуюсь жизни? При этом как я понимаю, работать нужно примерно так (псевдокод):
И 2-й вариант... А если я например создаю базу доверенных хостов (вообще не заморачиваясь на сертификатах)... Зашел на сайт черз https, получил ошибки, увидел что сертификат левый - и по согласию пользователя добавил доменное имя хоста в список доверенных... И как бы все. Как на ваш взгляд наиболее правильно поступать? |
|
PAFOS | Дата 27.12.2010, 19:53 |
Самая распространенная ошибка при работе с сертификатом - когда сертификат подписан локально (т.е. НЕ через службу подписи В этом случае браузеры выдают предупреждение мол так и так - сертификат неизвестно откуда и неизвестно кем подписан. В Qt - выполнение попадет в слот, с ошибкой QSslError::HostNameMismatch Как поступить - решать Вам, если вызовете слот ignoreSslError() тогда соединение продолжится. Получить сертификат можно с помощью метода QSslCertificate QSslError::certificate () const Его безусловно можно сравнить с любым другим ( bool QSslCertificate::operator== ( const QSslCertificate & other ) const ). Вот) З.Ы. повторю - это лишь одна из множества ошибок) |
|
Rocky | Дата 24.12.2010, 15:28 |
Все привет! Если кто знает, подскажите пожалуйста, как работать с certificates? Вот например. Я сделал запрос через QNetworkAccessManager. Соединил сигнал sslErrors со своим слотом. Захожу на какой-то сайт через https. А дальше как? Если у этого домена есть сертификат, я должен вывалиться в слот, соединенный с сигналом sslErrors, у QNetworkReply взять сертификат и проверить его? А как проверять... и главное с чем сравнивать? В программе должна быть база данных сертификатов? Просто дали задание, а как тут быть неясно.... Огромное спасибо за любую информацию! |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.3.2024, 12:20 |