Мне нужно загрузить файл на безопасный хост, используя POST
метод. Это код, который я пробовал (файл может иметь либо текстовое содержимое, либо это может быть изображение. В случае изображения, как я вижу Вот, Я могу установить ContentTypeHeader
в QVariant("image/jpeg")
, Поэтому я попробую это позже. Сейчас я пытаюсь загрузить простой текстовый файл):
QUrl url(urlString); //typical secure host url - myhost.com/logs?key=<filename>&dsn=<some_dsn>&id=<id>&format=<format>
QNetworkRequest request(url);
QSslConfiguration config = request.sslConfiguration();
config.setPeerVerifyMode(QSslSocket::VerifyNone);
config.setProtocol(QSsl::TlsV1_0);
request.setSslConfiguration(config);
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/xml"));
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));
QFile *file = new QFile(QString::fromStdString(fPathToFile));
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
multiPart->append(imagePart);
QNetworkAccessManager manager;
QNetworkReply *reply = manager.post(request, multiPart);
connect(reply, SIGNAL(finished()), this, SLOT(onGetReply()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(onError(QNetworkReply::NetworkError)), Qt::QueuedConnection);
multiPart->setParent(reply);
У меня простой qDebug
в прикрепленных слотах код никогда не появляется (и, конечно, файл загружается неправильно). Я не могу понять почему, это должен быть либо успех, либо провал, поэтому он должен прийти хотя бы в один из слотов. Я подозреваю, что я должен правильно установить сертификаты. Но я не могу узнать, как. Я пошел, хотя решения размещены Вот, он запрашивает пароль, и здесь ничего не нужно, поэтому я не знаю, что там предоставить. Я запустил эту команду:
openssl s_client -showcerts -connect <myhost>:443 </dev/null
Это вывод, который я получаю:
CONNECTED(00000003)
depth=1 /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=<state>/L=<city>/O=<company>, Inc./CN=<host>
i:/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
-----BEGIN CERTIFICATE-----
<random text>
-----END CERTIFICATE-----
1 s:/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
-----BEGIN CERTIFICATE-----
<more text>
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=<state>/L=<city>/O=<company>, Inc./CN=<host>
issuer=/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
---
No client certificate CA names sent
---
SSL handshake has read <some number> bytes and written <some number> bytes
---
New, TLSv1/SSLv3, Cipher is <some cipher>
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : <some cipher>
Session-ID: <some id>
Session-ID-ctx:
Master-Key: <some key>
Key-Arg : None
Start Time: 1452063522
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
DONE
Я не могу понять, как установить сертификаты из этого вывода. Как правильно загрузить файл на мой хост?
У меня тоже есть .pem
файл, соответствующий моему хосту, полученный в браузере нажатием htts://myhost.com
а затем щелкните значок замка и загрузите файл из показанного всплывающего окна. Это отличается от того, что получено выше.
Задача ещё не решена.
Других решений пока нет …