crossplatform.ru

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

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

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


И 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  


я бы сделал как-то так... )

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
  опции профиля:
сообщение 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 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 18:21