crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 15.7.2025, 23:17