1

VS2010 c++ 環境で Qt フレームワーク (QNetworkRequest) を使用して、サイトのコンテンツ (json 文字列) を取得しようとしています。HTTP サイトからのデータの読み取りに問題はありませんが、HTTPS サイトのコンテンツを読み取ろうとするとうまくいきません。一方、ブラウザはサイトのコンテンツを「見る」ことができます。証明書の問題だと思いますが、完全にはわかりません。firefox からは ca.pem (エクスポートしたもの) にしかアクセスできません。空のままにしないように、cert.pem と key.pem にダミーの pem ファイルを使用しました。残念ながら、これらのファイルを別の方法で取得することはできません。

「秘密鍵は公開鍵を認証しません。エラー:140A80B1:SSL ルーチン:SSL_CTX_check_private_key:証明書が割り当てられていません」という説明のエラー 99 コードが表示されます。したがって、ダミーの鍵証明書のエラーであるはずです。

しかし、ブラウザーがコンテンツを「見る」ことができ、コードを介して私ができないのはどうしてでしょうか? 回避策を見つけることは可能ですか?

私のコードは次のとおりです。

{
    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);
}
4

1 に答える 1

-1

これらの .DLL をアプリケーション フォルダにコピーしてください。

libeay32.dll ssleay32.dll

QT が SSL を使用するにはこれらが必要です。

于 2015-12-21T11:45:06.037 に答える