РЕШЕНИЕ, часть I:
Я в основном решил это (отсутствие связи), было 2 причины:
1-й - серверу apache действительно требуется закрытый ключ (по неизвестной причине нашел его [здесь] [1]), как добавить закрытый ключ:
QFile x(Preferences::certificateKeyPath());
x.open(QIODevice::ReadOnly);
pKey = QSslKey(x.readAll(),QSsl::Rsa);
QSslError error1(QSslError::SelfSignedCertificate, certs.first());
QSslError error2(QSslError::CertificateUntrusted, certs.first());
QList<QSslError> expectedSslErrors;
expectedSslErrors.append(error1);
expectedSslErrors.append(error2);
2d - сертификат, который у меня был, был не очень «хорошим». Я не знаю, что это на самом деле означает или почему он не работает, но когда я получил новый сертификат от администратора сервера и добавил закрытый ключ, рукопожатие прошло успешно.
Я до сих пор не знаю, как отлавливать sslErrors (например, чтобы показать пользователю, что его сертификат не работает), но это хорошее начало
РЕШЕНИЕ, часть II:
Решил последнюю часть вопроса (kina a woraround). Кажется, что QNetworkReply не генерирует SslErrors, является ошибкой (или, по крайней мере, она не работает постоянно или для всех веб-сайтов), обнаружил ее [в Qt bug tracker] [2]. И обходной путь также оттуда: поскольку мы не можем получить SslErrors, мы должны попытаться получить что-то еще - например, [error] [3]. Он не дает подробной информации о том, что на самом деле произошло, но лучше, чем ничего. Для меня код ошибки 6 - «рукопожатие SSL / TLS не удалось, и зашифрованный канал не может быть установлен. Сигнал sslErrors () должен был быть передан». идеально подходит (я не забочусь ни о чем другом):
QObject::connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleSslErrors(QNetworkReply::NetworkError)));
Важная часть: если у пользователя неверный сертификат и / или ключ - выдается сигнал. Но он также выдается, если сертификат и ключ верны. Кажется, аутентификация все еще не идеальна, но вы можете легко отключить ее с помощью
QObject::connect(m_reply, SIGNAL(sslErrors(QList<QSslError>)),
this, SLOT(printSslErrors(QList<QSslError>)));
Заключение похоже, они исправили много ошибок SSL в Qt 4.8, поэтому я надеюсь, что релиз будет в ближайшее время