Python TLS握手超时

Python TLS握手超时,python,ssl,python-requests,tls1.2,python-sockets,Python,Ssl,Python Requests,Tls1.2,Python Sockets,因此,我正试图通过我目前试图构建的代理连接到互联网上的不同站点 如果我尝试连接到端口80上的网站,一切都会正常工作。 但当我尝试连接到任何https链接时,它都不起作用 我尝试使用自签名证书,但不起作用 我现在正在使用certifi库,看起来我取得了很大的进步 我用于TLS握手的功能: def do_handshake(): ca_certificates=certifi.where() 打印(“ca证书mozilla”,ca_证书) 密码='ECDHE-RSA-AES256-GCM-SHA38

因此,我正试图通过我目前试图构建的代理连接到互联网上的不同站点

如果我尝试连接到端口80上的网站,一切都会正常工作。 但当我尝试连接到任何https链接时,它都不起作用

我尝试使用自签名证书,但不起作用

我现在正在使用certifi库,看起来我取得了很大的进步

我用于TLS握手的功能:

def do_handshake():
ca_certificates=certifi.where()
打印(“ca证书mozilla”,ca_证书)
密码='ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA'
conn\u s=ssl.wrap\u套接字(conn,ssl\u版本=ssl.PROTOCOL\u TLSv1\u 2,证书需求=ssl.cert\u可选,证书=ca\u证书,连接时握手=False)
打印(“启动握手!”)
指挥部握手
打印(“握手完成!”)
我接受连接并启动一个新线程来处理请求

为True时:
conn,addr=s.accept()
请求=conn.recv(4704)
打印(请求)
thread=threading.thread(target=url\u string,args=(conn,addr))
setDaemon(True)
thread.start()
套接字服务器在端口9000上运行

现在,如果我发送一个curl请求,我会在终端中看到一些奇怪的文本,它会永远卡在
conn.do\u handshake()
上,最终超时

我通过套接字服务器发送回客户端的头:

HTTP/1.1 200 Connection established
< Content-Type: text/plain
< Connection: close
< Set-Cookie: cookie=verified, Expires=Saturday, 8 May 2021 03:10:29
我使用请求库首先将get或post请求发送到url,然后将其返回到
conn

如何成功握手并将请求发送回
conn

更新:

因此,通过发送
HTTP/1.1200connectionbuilded
头,解决了握手问题。我检查过了,邮件头在发送之前没有被发送 TLS握手完成

但我还是犯了同样的错误:

curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
守则:

导入套接字,ssl
导入操作系统、系统、线程
导入请求
导入日期时间
导入日历
HOST=“0.0.0.0”
端口=os.environ.get(“端口”)或9000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s、 setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
s、 绑定((主机、端口))
s、 听(9)
打印(“服务器侦听端口{}”。格式(端口))
def url_字符串(连接,地址):
字符串=请求。解码(“UTF-8”)
数据=字符串。编码(“UTF-8”)
打印(“请求字符串:”,数据)
第一行=string.split(“\n”)[0]
打印(第一行)
url=第一行。拆分(“”[1]
是否发布请求=错误
如果(第一行拆分(“”[0]=“POST”):
请求后是否为真
http_pos=url.find(“:/”)
如果(http_pos==-1):
temp=url
其他:
temp=url[(http_pos+3):]
端口位置=临时查找(“:”)
webserver=“”
端口=-1
路径位置=临时查找(“/”)
path=“”
如果(路径位置==-1):
路径位置=透镜(温度)
其他:
路径=温度[路径位置:透镜(温度)]
如果(端口位置==-1或路径位置<端口位置):
端口=80
webserver=temp[:路径位置]
其他:
端口=内部(温度[端口位置+1:len(温度)])
webserver=temp[:端口位置]
打印(Web服务器+路径,端口)
代理请求(webserver=webserver+path,port=port)
def代理_请求(Web服务器、端口):
headers=get_HTTP_headers()
数据_recv=“”
尝试:
打印(“代理请求”,地址[0])
如果(端口==443):
r=requests.get(“https://”+webserver)
数据_recv=r.text
发送\u头\u测试()
握手
其他:
r=requests.get(“http://”+webserver)
数据_recv=r.text
例外情况除外,如e:
打印(str(e))
data_recv=str(e).encode()
最后:
打印(“最后输入块”)
合并\u HTTP\u头\u和\u内容(头、数据\u记录)
进口证书
def do_握手():
ca_certificates=certifi.where()
打印(“ca证书mozilla”,ca_证书)
密码='ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA'
conn\u s=ssl.wrap\u套接字(conn,ssl\u version=ssl.PROTOCOL\u TLS,cert\u reqs=ssl.cert\u可选,ca\u certs=ca\u证书,do\u handshake\u on\u connect=False)
#conn\u s=context.wrap\u套接字(conn,do\u handshake\u on\u connect=False)
打印(“启动握手!”)
指挥部握手
打印(“握手完成!”)
尽管如此:
conn,addr=s.accept()
请求=conn.recv(4704)
打印(请求)
thread=threading.thread(target=url\u string,args=(conn,addr))
setDaemon(True)
thread.start()

很遗憾,您只提供了代码片段。问题可能出在这些代码片段之外。请提供一个最小但完整的代码,该代码足以重现您的问题。要点与您在问题中显示的不同(更完整)。看起来您不了解连接请求是如何工作的。代理不应该与服务器进行TLS握手,然后将非TLS通信发送到客户端。相反,代理应该在初始连接请求之后盲目地传递所有信息,以便客户端和服务器自己进行端到端TLS握手。如果需要TLS拦截,则代理需要与服务器和客户端进行TLS握手。后者需要证书。我看不到您在未显示的代码中做了什么。我不会试图在你的代码中破解一个解决方案。行为非常清楚:应该读取连接请求,向客户机发送响应,从那时起,所有内容都应该双向传递。如果你犯了一个错误,那么很可能是y
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number