J'essaie de tester un proxy qui attend immédiatement une poignée de main SSL, même si le client utilisera une méthode SSL Connect. Le problème est que mon code de test de Golang et de Python semble avoir la même faille. Ils se connectent au proxy dans le clair, puis émettent une connexion, mais le proxy le rejette, car il s'attend à une poignée de main SSL.
Est-ce que quelqu'un sait à forcer l'une des technologies à utiliser SSL vers le proxy en utilisant des bibliothèques standard disponibles? P>
Merci. P>
Le code exemple suit: p> et golang p>
3 Réponses :
Une résolution possible à ce numéro à l'aide des bibliothèques standard Python en plus du proxyhandler que vous avez:
import ssl, urllib2 # Set ciphers and ssl settings ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE ctx.set_ciphers('HIGH:!DH:!aNULL') # Set proxy settings proxy = urllib2.ProxyHandler({'https':'<https proxy host>:443', 'http':'<http proxy host>:8080'}) opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx), proxy) urllib2.install_opener(opener)
Semble afficher le même problème.
Pour cette ligne: proxy = urllib2.proxyhandler ({'https': '
Oui. Je vais vérifier avec une trace de paquets mais je pense que cela se connecte toujours dans le claire.
Oui, le serveur ne voit même pas une poignée de main SSL, elle tente immédiatement une SSL Connecter dans le claire.
Oui, réinitialisation de la connexion. En fin de compte, je devais utiliser des prises directement pour faire ce travail. Il semble que les bibliothèques HTTP n'établissent pas immédiatement une connexion proxy SSL.
En fin de compte, je devais faire mon propre client, essentiellement.
func http_fetch(req_host string) { buf := make([]byte, 1024) conf := &tls.Config { InsecureSkipVerify: true, } conn, err := tls.Dial("tcp", proxy_host, conf) if err != nil { //panic(err) failure() return } defer conn.Close() // SSL CONNECT if _, err = conn.Write([]byte("CONNECT " + req_host + " HTTP/1.0\r\n\r\n")); err != nil { // FIXME: need debug logger? //panic(err) failure() return } // Read response if _, err = conn.Read(buf); err != nil { //panic(err) failure() return } // Send http GET if _, err = conn.Write([]byte("GET / HTTP/1.0\r\n")); err != nil { //panic(err) failure() return } if _, err = conn.Write([]byte("User-Agent: golang\r\n\r\n")); err != nil { //panic(err) failure() return } // Read response if _, err = conn.Read(buf); err != nil { //panic(err) failure() return } success() }
Utilisation des proxy HTTPS n'est supporté que commencer par Go 1.10. De Projet de notes de version : P>
du côté du client, un proxy http (le plus communément configuré par Proxyfromenvironment) peut maintenant être spécifié comme https: // url, signification que le client se connecte au proxy sur HTTPS avant d'émettre un Demande http standard et proxée. (Auparavant, les URL proxy HTTP étaient nécessaire pour commencer avec http: // ou socks5: //.) p> blockQuote>
On dirait que la version Go alliera toujours "Connecter" pour https ( Voir la source ) - Je ne sais pas grand chose à propos de HTTPS, mais si ce n'est pas un comportement compatible de normes, votre pourrait Soumettez un rapport de bogue .
Je pense que cela était conforme aux normes mais nous sommes au milieu d'une transition vers Pure SSL sur les proxies pour HTTPS. Le soutien de navigateur il, mais je ne trouve rien que le très dernier libcurl qui le soutient.
Si ce n'est pas conforme aux normes, le soutien sera au mieux situé, malheureusement.