5

サイトのリモート証明書を取得するために (stdlib から) ssl モジュールで SocksIPy を使用しようとしていますが、SocksIPy は ssl で再生されません。

以下のコードは check.torproject.org に接続し、Tor を使用していないことを示します (つまり、SocksIPy が機能していません) (悪い)。

SocksIPy がこれに最適なソリューションであるかどうかはわかりませんが、生のソケットをプロキシする他の方法を見つけることができませんでした (または、pycurl/urllib2 を取得して SOCKS プロキシを使用し、SSL 証明書を提供します!)。

明確にするために、私の問題は、ソケットがプロキシされていないことです。選択したプロキシを使用して SSL 証明書を取得したいのですが、それは実現していません。

今のところ、プロキシまたは SSL のいずれかを使用できますが、両方を使用することはできません。ヘルプ!

import socks
import ssl

s = socks.socksocket()
s.setproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)

ss = ssl.wrap_socket(s)
ss.connect(('check.torproject.org', 443))
ss.write("""GET / HTTP/1.0\r
Host: check.torproject.org\r\n\r\n""")

# print ss.getpeercert()
print ss.read(), ss.read(), ss.read()
ss.close()
4

2 に答える 2

6

tcpdump の実行中にこのコードをテストしたので、動作するはずです。

import socks
import ssl

s = socks.socksocket()
s.setproxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1",port=9050)
s.connect(('83.94.121.246', 443))
ss = ssl.wrap_socket(s)
print ss.send("hello")
ss.close()

ssl.py は確認しませんでしたが、ssl オブジェクトではなく、socks オブジェクトで connect を呼び出す必要があると思います。

于 2013-10-27T05:44:30.700 に答える
4

ssl.wrap_socket下に置くconnect。そうしないと正しく動作しません。

検証と CA certfile を使用する サーバーから証明書を取得するには、検証をオンにして SSL オブジェクトを作成し、CA 証明書ファイルを指定する必要があります。システムで見つからない場合は、Mozilla に基づく CURL プロジェクトが提供するものをローカル ファイルとしてダウンロードできます: http://curl.haxx.se/docs/caextract.html

注: SocksIPy プロジェクトはかなり長い間更新されておらず、Python 3 をサポートしていません。

元のコードの修正版:

import socks
import ssl

s = socks.socksocket()
s.setproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", port=9050)
s.connect(('check.torproject.org', 443))
ss = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs="cacert.pem")

print "Peer cert: ", ss.getpeercert()

ss.write("""GET / HTTP/1.0\r\nHost: check.torproject.org\r\n\r\n""")

content = []
while True:
    data = ss.read()
    if not data: break
    content.append(data)

ss.close()
content = "".join(content)

assert "This browser is configured to use Tor" in content
于 2014-08-07T23:20:48.030 に答える