【发布时间】:2014-06-20 10:39:21
【问题描述】:
我目前正在制作一个位于浏览器和网络之间的代理。一切正常,除了 https。我在理解它的某些段落时遇到了麻烦,并且在网络上没有找到很多资源。所以我被困住了。
我使用的代码是:
conn, addr = server.accept()
request = conn.recv(9999) #get a CONNECT request
conn.send(b'HTTP/1.1 200 Connection estabilished\n\n')
enc_req = conn.recv(9999) #this gets an encrypted request
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #plaintext client
client.connect((host, 443)) #connect to chosen host
client.send(enc_req)
resp1 = client.recv(9999) #this gets something unreadable (encrypted?)
#could it be the certificate?
#now what?
resp1 我得到证书了吗?在那之后我需要做什么? (或者,同理,https接下来通常会发生什么?)
附:我知道这个问题有点笼统,但请不要太严厉地评判我。我曾尝试在网上进行研究,但我一直在寻找的只是用于 ssl 的加密方法。我真的不知道该怎么做。
【问题讨论】:
-
HTTPS (SSL) 连接是端到端加密的,代理所能做的就是在客户端和服务器之间传递数据,仅此而已。
-
这正是我想要完成的,但我不确定如何。
-
@Martijn - SSL/TLS 不提供端到端加密(尽管我们经常希望如此)。 Trustwave 展示了如何没有兑现承诺。有一整类代理被用来打破预期,它们带来了自己的一系列问题,使得组织的攻击面经常增加。见SSL/TLS Interception Proxies and Transitive Trust。
-
@jww,该问题主要是由于 CA 管理不善。 SSL/TLS 配置正确时,确实提供端到端加密。拥有主流操作系统/浏览器证书的 CA 绝不应该这样做,但公司很可能拥有自己的 CA 来做到这一点。
-
@Bruno - SSL/TLS 在理论上是端到端的,而不是在实践中。理论上,我们应该通过机会加密(ADH 或自签名证书)实现端到端的安全性。但是我们不能丢弃威胁和漏洞以适应我们的定义:)