qt_https網頁的支持


一.添加openssl庫
configure相關命令:
-no-openssl ........ Do not compile support for OpenSSL.
-openssl ........... Enable run-time OpenSSL support.
-openssl-linked .... Enabled linked OpenSSL support.
這里采用動態編譯
./configure -openssl
如果采用靜態編譯
OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl-linked
二.QWebView添加ssl處理
1.添加網絡管理;

1 this->page()->setNetworkAccessManager(networkAccessManager);

2.繼承QNetworkAccessManager,重寫sslErrors()函數;
代碼參考arora瀏覽器:

 1 void myQNetworkAccessManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &error)
 2 {
 3     QSettings settings;
 4     QList<QSslCertificate> ca_merge = QSslCertificate::fromData(settings.value(QLatin1String("CaCertificates")).toByteArray());
 5 
 6     QList<QSslCertificate> ca_new;
 7     QStringList errorStrings;
 8     for (int i = 0; i < error.count(); ++i) {
 9         if (ca_merge.contains(error.at(i).certificate()))
10             continue;
11         errorStrings += error.at(i).errorString();
12         if (!error.at(i).certificate().isNull()) {
13             ca_new.append(error.at(i).certificate());
14         }
15     }
16     if (errorStrings.isEmpty()) {
17         reply->ignoreSslErrors();
18         return;
19     }
20 
21     QString errors = errorStrings.join(QLatin1String("</li><li>"));
22     if (true) {
23         if (ca_new.count() > 0) {
24             QStringList certinfos;
25             if (true) {
26                 ca_merge += ca_new;
27 
28                 QSslConfiguration sslCfg = QSslConfiguration::defaultConfiguration();
29                 QList<QSslCertificate> ca_list = sslCfg.caCertificates();
30                 ca_list += ca_new;
31                 sslCfg.setCaCertificates(ca_list);
32                 sslCfg.setProtocol(QSsl::AnyProtocol);
33                 QSslConfiguration::setDefaultConfiguration(sslCfg);
34                 reply->setSslConfiguration(sslCfg);
35 
36                 QByteArray pems;
37                 for (int i = 0; i < ca_merge.count(); ++i)
38                     pems += ca_merge.at(i).toPem() + '\n';
39                 settings.setValue(QLatin1String("CaCertificates"), pems);
40             }
41         }
42         reply->ignoreSslErrors();
43     }
44 }

3.sslErrors()中可以用QNetworkReply::ignoreSslErrors()忽略掉所有錯誤,但是這樣不安全;
還可以選擇為網頁注冊一個新的SSL認證(通過QSslConfiguration::setCaCertificates())。

參考資料:
1.http://www.qtcentre.org/threads/14398-Use-of-QWebView-to-browse-quot-https-quot-secure-sites
2.http://code.google.com/p/arora/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM