2015-12-21 213 views
1

我想在VS2010 C++環境中使用Qt框架(QNetworkRequest)獲取網站(json字符串)的內容。我從HTTP網站讀取數據沒有問題,但是當我嘗試閱讀HTTPS網站的內容時,我沒有運氣。另一方面,瀏覽器可以「查看」網站內容。我認爲這是一個證書問題,但我不完全確定。我只能從firefox訪問ca.pem(我輸出)。我用cert.pem和key.pem的虛擬pem文件,以便我不留空。不幸的是,我無法以其他方式獲取這些文件。使用C++獲取HTTPS網站內容QNetworkRequest

我得到一個帶有描述「私鑰不能證明公鑰,錯誤:140A80B1:SSL例程:SSL_CTX_check_private_key:未分配證書」的錯誤代碼。所以它應該是僞密鑰證書的錯誤。

但是我不禁想知道瀏覽器怎麼可能「看到」內容並通過代碼我不能?是否有可能找到解決辦法?

我的代碼如下:

{ 
    QNetworkAccessManager *manager = new QNetworkAccessManager(); 
    QNetworkRequest request; 
    QNetworkReply *reply = NULL; 

    QSslConfiguration config = QSslConfiguration::defaultConfiguration(); 
    config.setProtocol(QSsl::AnyProtocol); 
    request.setSslConfiguration(config); 
    request.setUrl(QUrl("https://....")); 
    addSSl(&request); 
    request.setHeader(QNetworkRequest::ServerHeader, "application/json"); 

    reply = manager->get(request); 

    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); 
} 

void addSSL(QNetworkRequest *request) 
{ 
    QString cacert_path="../certificates/cacert.pem"; 
    QString cert_path="../certificates/cert.pem"; 
    QString key_path="../certificates/key.pem"; 

    QFile cacert_file(cacert_path); 

    QSslConfiguration SslConfiguration(QSslConfiguration::defaultConfiguration()); 

    QList<QSslCertificate> caList = SslConfiguration.caCertificates(); 
    QSslCertificate cacert_cert=QSslCertificate::fromPath(cacert_path,QSsl::Pem)[0]; 

    QSslCertificate cert_cert=QSslCertificate::fromPath(cert_path,QSsl::Pem)[0]; 

    caList.append(cacert_cert); 
    SslConfiguration.setCaCertificates(caList); 
    SslConfiguration.setLocalCertificate(cert_cert); 
    SslConfiguration.setProtocol(QSsl::AnyProtocol); 

    QFile key_file(key_path); 
    bool exists=key_file.exists(); 
    QDir d = QFileInfo(key_file).absoluteDir();  
    QString absolutepath=d.absolutePath(); 

    QDir myDir("certificates"); 
    QStringList filesList = myDir.entryList(QDir::Files); 

    key_file.open(QIODevice::ReadOnly); 
    QSslKey sslkey(&key_file,QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey); 
    key_file.close(); 

    SslConfiguration.setPrivateKey(sslkey); 
    request->setSslConfiguration(SslConfiguration); 
} 
+0

replyFinished()中沒有報告錯誤? (檢查回覆 - >錯誤()和回覆 - > errorString()) –

+0

我得到一個錯誤99代碼與描述「私鑰不認證公鑰,錯誤:140A80B1:SSL例程:SSL_CTX_check_private_key:沒有分配證書」。所以它應該是僞密鑰證書的錯誤。 – roni

回答

-1

請這些.DLL文件複製到你的應用程序文件夾:

libeay32.dll ssleay32.dll

QT需要這些與SSL工作。

+0

我已經這樣做了,但仍然無法閱讀內容 – roni