crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Как работать с сертификатми?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
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
  я бы сделал как-то так... )

slotSslErrors(QList<QSslError>& err)
{
    foreach( const QSslError &e, err )
    {
        switch( e.error() )
        {
            case QSslError::HostNameMismatch:
                 {
                        if( localDatabase.contains( e.certificate() )
                        {
                              // Игнорируем ошибку, т.к. сертификат есть у нас в БД
                              ((QNetworkReply*)sender())->ignoreSslErrors( QList<QSslError>() << e ))
                              return;
                        }
                        else if( askUser( e.certificate() )
                        {
                               // Спрашиваем юзера, хочет ли он добавить сертификат в локальную БД, если да
                               localDatabase << e.certificate();
                              
                               // Игнорируем ошибку
                              ((QNetworkReply*)sender())->ignoreSslErrors( QList<QSslError>() << e ))
                              return;
                         }
                         return; // соединение будет закрыто, т.к. сертификат не в бд и т.к. пользователь не захотел добавить его в бд
                 }

        // Обработка других ошибок
        }
    }
}


Цитата
А если я например создаю базу доверенных хостов (вообще не заморачиваясь на сертификатах)


А что если коннект будет идти через прокси? тогда злоумышленник может предоставить свой сертификат и весь трафик будет как на ладони.
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 и радуюсь жизни? При этом как я понимаю, работать нужно примерно так (псевдокод):
slotSslErrors(QList<QSslError>& err....)
{
QList<QsslCertificate> certificates = err.certificates();//в цикле все сертификаты берем...

defConf = QSslConfiguration::defaultConfiguration();
defConf->setCaCertificates(certificates);
QSslConfiguration::setDefaultConfiguration(defConf);
}


И 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 взять сертификат и проверить его? А как проверять... и главное с чем сравнивать? В программе должна быть база данных сертификатов? Просто дали задание, а как тут быть неясно....

Огромное спасибо за любую информацию!
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 12:20