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