2009-09-05 7 views
0

J'ai une application qui fonctionne comme un proxy en utilisant QTcpSocket pour intercepter les requêtes HTTP. J'essaie d'étendre cela à HTTPS, mais il semble que ça ne fonctionne pas comme je l'avais prévu. Utiliser QHttp n'est pas possible pour moi en raison de l'unicité de l'application.Qt4 QSslSocket triggers HTTP 406 responseq

Actuellement, j'ai quelque chose comme ce qui suit:

serverConnection = new QTcpSocket(); 
    serverConnection->setProxy(proxy); 
    serverConnection->connectToHost(url_hostname, url_port); 
    serverConnection->write(request.toAscii()); 
    connect(serverConnection, SIGNAL(readyRead()), this, SLOT(readServerData()), Qt::DirectConnection); 

J'ai essayé de faire quelque chose de tout à fait similaire en utilisant QSslSocket, mais malheureusement le résultat est pas ce que je pensais.

serverSConnection = new QSslSocket(); 
    serverSConnection->connectToHostEncrypted(url_hostname, url_port); 
    if (!serverSConnection->waitForEncrypted()) { 
     qDebug() << "waitForEncrypted failed"; 
    } 
    serverSConnection->write(request.toAscii()); 
    connect(serverSConnection, SIGNAL(readyRead()), this, SLOT(readSServerData()), Qt::DirectConnection); 

Utilisation du QSslSocket faire la demande semble déclencher: HTTP/1.1 406 Non acceptable

La demande que je vous envoie par ressemble à quelque chose le long des lignes des éléments suivants:

Received Request: "CONNECT www.somesslhost.com:443 HTTP/1.1 
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 
Proxy-Connection: keep-alive 
Host: www.somesslhost.com 

Y at-il quelque chose de spécial à propos de l'envoi d'une requête HTTPS via mon application à l'aide de QSslSocket qui me manque?

+0

Le dernier extrait est-il la demande que votre application envoie au serveur de destination OU celle que votre navigateur envoie à l'application? –

+0

Le dernier extrait est la demande que j'envoie au serveur de destination. – Michael

Répondre

1

Avec les informations actuelles, je peux seulement obtenir l'idée que vous le faites mal.

Votre méthode est correcte si votre client est supposé envoyer des requêtes HTTP simples à votre application et qu'il va les transférer au serveur HTTPS.

Si votre client est plutôt capable d'utiliser HTTPS et utilise votre application en tant que serveur proxy standard, vous n'êtes pas censé vous connecter au serveur comme cela. Vous obtenez 406 parce que vous essayez de convaincre le serveur de destination d'agir comme un proxy entre vous et lui-même.

Vous pouvez jeter un oeil à Tunneling SSL Through a WWW Proxy, je pense. Fondamentalement, vous devez analyser la requête entrante, établir une connexion "brute" au serveur, répondre au client avec la confirmation de l'établissement et simplement transférer les paquets en avant et en arrière.

La négociation SSL complète doit être effectuée entre votre client et le serveur de destination, le serveur proxy est seulement supposé transférer des paquets cryptés sans pouvoir les décrypter.

+0

A l'aide de QSslSocket, dois-je récupérer manuellement le certificat homologue ou est-ce géré automatiquement? – Michael

0

Je suis confus - vous dites:

J'ai une application qui fonctionne comme proxy à l'aide QTcpSocket à intercepter les requêtes HTTP.

Qu'entendez-vous par "intercepter"? Êtes-vous en train d'écrire une application de proxy HTTP? S'il vous plaît être plus clair & spécifique, et nous pouvons probablement vous aider.

+0

Je suis désolé, c'était vraiment mal formulé. Ignorer le proxy complètement. J'essaie simplement de créer une connexion de socket SSL standard qui fonctionne réellement. Lorsque je configure mon application pour qu'elle communique via SSL, l'établissement de liaison SSL ne semble pas fonctionner correctement. – Michael

Questions connexes