Python ssl套接字服务器SSLV3\u警报\u证书\u未知问题

2024-04-20 13:42:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用ssl编写python套接字服务器,在ssl握手过程中遇到了证书未知错误

我已经用openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes命令自己创建了私钥和证书。
此服务器将在我的电脑的内部网(wifi下)中运行,用户将通过浏览器与我的电脑IP地址联系。因此,我没有向任何CA注册此证书。我认为在我的情况下它不是强制性的。
下面是更多细节

echoserver.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)

我尝试的

  • 在wrap_socket函数中添加cert_reqs=ssl.cert_NONE和ca_certs=“/location/to/keys”参数。
    似乎不起作用。我假设这些选项是针对客户端的
  • 在wrap\u socket函数中添加do\u handshake\u on\u connect=False
    在Chrome中,当连接的服务器抛出相同的错误并且线程/连接异常关闭时。而且,chrome似乎会立即再次发送相同的连接请求,,第二个请求工作正常
    在firefox中,第一个连接以相同的错误关闭,并且没有第二个请求
  • 在证书中分配与IP地址相同的公共名称
    不工作
  • 已检查证书\u ietf规范here中存在未知错误。除了这个解释之外,它没有任何线索

我注意到的另一件事是,如果我以与下面相同的方式使用内置的^{,它工作得很好,没有我上面提到的任何问题

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()

Tags: keyimportself服务器sslcertdef错误
1条回答
网友
1楼 · 发布于 2024-04-20 13:42:05
ssl.SSLError: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:1108)

这意味着客户端(浏览器)不信任您的证书,因为它是由未知实体颁发的。如果要使用自签名证书,则必须将这些证书显式导入为所有要使用的客户端的受信任证书

这是没有办法的。TLS中的证书是为了确保连接与预期的服务器一起完成,而不是中间的一个人声称是预期的服务器。如果客户端信任任意证书,那么它也会信任中间攻击者创建的证书。

Below Python builtin HTTPServer works fine with ssl, not showing any error. Not sure how?

浏览器仍然会抱怨。 唯一的区别是服务器捕获异常,因此不会崩溃,而是继续。您可以在代码中执行相同的操作:

    while True:
        try:
            (c,a)=echoserver.accept()
            threading.Thread(target=self.handler, args=(c,a)).start()
        except:
            pass # ignore error

相关问题 更多 >