【问题标题】:Python ssl socket server SSLV3_ALERT_CERTIFICATE_UNKNOWN issuePython ssl 套接字服务器 SSLV3_ALERT_CERTIFICATE_UNKNOWN 问题
【发布时间】:2020-10-12 12:40:53
【问题描述】:

我正在使用 ssl 编写 python 套接字服务器,并且在 ssl 握手期间遇到证书未知错误。

我自己使用openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes 命令创建了私钥和证书。
该服务器旨在在我的 PC 中的 Intranet(在 wifi 下)运行,用户将通过他们的浏览器联系我的 PC 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_socket 函数中添加 do_handshake_on_connect=False
    在 Chrome 中,当连接的服务器抛出相同的错误并且线程/连接异常关闭时。 chrome 似乎再次立即发送相同的连接请求,第二个请求完美无缺!!。
    在 Firefox 中,第一个连接以同样的错误关闭,并且没有第二个请求。
  • 在证书中分配与 IP 地址相同的公用名
    不工作。
  • 在 ietf 规范 here 中检查了 certificate_unknown 错误。除了这个解释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()

【问题讨论】:

    标签: python sockets ssl tcp server


    【解决方案1】:
    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
    

    【讨论】:

    • 谢谢@Steffen。感激。你能解释一下,这对于像 ThreadedHTTPServer 这样的内置服务器模块是如何工作的。
    • @Liju:除非您明确跳过浏览器中的安全警告,否则它也不应该与自签名证书和 ThreadedHTTPServer 一起使用。
    • 谢谢@Steffen。我重新表述我的问题。作为测试,我尝试创建一个新的 ThreadedHTTPServer 实例并使用相同的密钥对其进行 ssl_wrapped 并在 PC 中启动它。现在我可以从移动浏览器连接。服务器中没有抛出证书错误(由浏览器发送)。这就是我想知道的?它是否旨在以某种方式抑制和忽略来自浏览器的这些错误并继续?
    • @Liju:不,你不能抑制来自服务器的错误,这将是一个巨大的安全问题。您能否提供代码和证书,以便我自己复制它?
    • @Liju:我在浏览器中得到了一个明确的NET::ERR_CERT_AUTHORITY_INVALID' - 正如预期的那样。唯一不同的是服务器不会崩溃,因为您使用的类捕获了错误。尽管如此,问题是相同的,因为证书不受客户端信任。需要明确跳过警告才能访问内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2021-08-30
    • 2018-03-20
    • 2011-11-28
    • 2021-04-30
    相关资源
    最近更新 更多