使用SocksiPy和SSL

时间:2013-04-21 22:32:39

标签: python ssl

我正在尝试使用SocksIPy和ssl模块(来自stdlib)获取网站的远程证书,但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()

2 个答案:

答案 0 :(得分: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,但我想你必须在socks对象而不是ssl对象上调用connect。

答案 1 :(得分:4)

ssl.wrap_socket置于connect 之下。否则它无法正常工作。

使用验证和CA证书文件从服务器获取证书需要在启用验证的情况下创建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