5

我正在尝试将 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()
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 但我猜你必须在 socks 对象上调用 connect 而不是 ssl 对象。

于 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 回答