[英]Error while trying to receive an HTTPS request using a python script acting as an HTTPS Server - sslv3 alert certificate unknown
[英]Python ssl socket server SSLV3_ALERT_CERTIFICATE_UNKNOWN issue
我正在使用 ssl 编写 python 套接字服务器,并且在 ssl 握手期间遇到证书未知错误。
我自己使用openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
命令创建了私钥和证书。
该服务器旨在在我的 PC 中的 Intranet(在 wifi 下)运行,用户将通过他们的浏览器联系我的 PC IP 地址。 因此,我没有向任何 CA 注册此证书。 而且我认为在我的情况下它不是强制性的。
下面有更多细节..
回声服务器.py
import socket
import ssl
import threading
class echoserver:
def __init__(self,i,p):
self.ip=i
self.port=p
def handler(self,c,a):
msg=c.recv(1024)
c.send(msg)
def serve(self):
echoserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
echoserver = ssl.wrap_socket(echoserver, keyfile='keys/key.pem', certfile='keys/cert.pem', server_side=True)
echoserver.bind((self.ip, self.port))
echoserver.listen()
while True:
(c,a)=echoserver.accept()
threading.Thread(target=self.handler, args=(c,a)).start()
es=echoserver('192.168.43.124',443) #My PC's ip assigned under wifi network
es.serve()
#Connecting from mobile phone within same network as https://192.163.43.124
ssl 握手期间服务器出错
self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1108)
我试过的
certificate_unknown: Some other (unspecified) issue arose in processing the certificate, rendering it unacceptable.
我注意到的另一件事是,如果我以与下面相同的方式使用内置的ThreadedHTTPServer
,它工作得很好,没有我上面提到的任何问题。
httpd = self.ThreadedHTTPServer((self.ip, self.port), self.handler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile='keys/key.pem', certfile='keys/cert.pem', server_side=True)
我不确定为什么会发生这种情况以及我应该如何进行。 并且不确定内置服务器模块如何正常工作。
欣赏任何线索。 谢谢。
下面 Python 内置 HTTPServer 与 ssl 一起正常工作,没有显示任何错误。 不知道怎么做?
import ssl
from http.server import HTTPServer, BaseHTTPRequestHandler
class requesthandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type","text/html")
self.end_headers()
self.wfile.write("<html><body>It works</body></html>".encode('utf8'))
httpd = HTTPServer(('192.168.43.124', 443), requesthandler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile='keys/key.pem', certfile='keys/cert.pem', server_side=True)
httpd.serve_forever()
ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1108)
这意味着客户端(浏览器)不信任您的证书,因为它是由未知实体颁发的。 如果您想使用自签名证书,您必须明确将这些证书导入为您要使用的所有客户端的受信任证书。
没有办法解决这个问题。 TLS 中的证书是为了确保连接是通过预期的服务器完成的,而不是中间的某个人声称是预期的服务器。 如果客户端信任任意证书,那么它也会信任中间攻击者创建的证书。
下面 Python 内置 HTTPServer 与 ssl 一起正常工作,没有显示任何错误。 不知道怎么做?
浏览器仍然会抱怨。 唯一的区别是服务器捕获了异常,因此不会崩溃而是继续。 您可以在代码中执行相同的操作:
while True:
try:
(c,a)=echoserver.accept()
threading.Thread(target=self.handler, args=(c,a)).start()
except:
pass # ignore error
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.