Bonjour,

Je dois faire un post de données en passant par HTTPS.
Je dois présenter un certificat client.
je dispose du certificat client et d'une CA fournie par le serveur.
j'utilise QNetworkAcessManager et QSslConfiguration.

Mon code de base ressemble à :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
    QFile sslCertificateFile("ssl/client_cert.pem");
    QFile caCertificateFile("ssl/CA.pem");
    QFile clientKeyFile("ssl/client.key");
    QSslCertificate  clientCertificate, caCertificate;
    QSslConfiguration sslConfiguration;
 
    QSslError error(QSslError::HostNameMismatch);
    QList<QSslError> expectedSslErrors;
    expectedSslErrors.append(error);
 
    if ((clientCertificateFile.open(QIODevice::ReadOnly)) && (clientKeyFile.open(QIODevice::ReadOnly)) && (caCertificateFile.open(QIODevice::ReadOnly))) {
 
        // Read certificates from file
        QList<QSslCertificate> clientCertificateList = QSslCertificate::fromData(clientCertificateFile.readAll(), QSsl::Pem);
        QList<QSslCertificate> caCertificateList = QSslCertificate::fromData(caCertificateFile.readAll(), QSsl::Pem);
 
        clientCertificate = clientCertificateList.takeAt(0);
 
        // Read key from file
        QSslKey privateKey(&sslKeyFile, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey , "passphrase");
 
        sslConfiguration.QSslConfiguration::defaultConfiguration();
        sslConfiguration.setLocalCertificate(sslCertificate);
        sslConfiguration.setCaCertificates(caCertificateList);
        sslConfiguration.setPrivateKey(privateKey);
        sslConfiguration.setProtocol(QSsl::TlsV1_0);
 
    } else {
        QMessageBox::information(this, tr("HTTPS"), tr("Cannot open ssl files !"));
    }
 
    QUrl url("https://url/srv");
    QNetworkRequest request(url);
    request.setRawHeader("Content-Type", "application/binary-stream");
    request.setSslConfiguration(sslConfiguration);
 
    QNetworkAccessManager *networkManager = new QNetworkAccessManager();
    QNetworkReply *reply = networkManager->post(request,post_data);
    reply->ignoreSslErrors(expectedSslErrors);
 
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreSslErrors(QList<QSslError>)));
J'ai un "SSL handshake failed" comme erreur du "reply" !

Et un "The host name did not match any of the valid hosts for this certificate" dans les erreurs ssl qui devraient être ignorées (ceci je le sais puisque le CN du certificat fourni ne correspond pas à l'url du serveur).


Je veux faire un truc équivalent à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
curl https://url_example/prog --cert ssl/cert.pem --key ssl/pkey.key --cacert ssl/CA.pem --data-binary @post_data.bin -H "Content-type: application/octet-stream"