簡體   English   中英

Python ssl 套接字服務器 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)

我試過的

  • 在 wrap_socket function 中添加 cert_reqs=ssl.CERT_NONE 和 ca_certs="/location/to/keys" 參數。
    似乎不起作用。 我假設這些選項是針對客戶端的。
  • 在 wrap_socket function 中添加 do_handshake_on_connect=False
    在 Chrome 中,當連接的服務器拋出相同的錯誤並且線程/連接異常關閉時。 並且chrome 似乎再次立即發送相同的連接請求,並且第二個請求完美無缺。!。
    在 firefox 中,第一個連接以同樣的錯誤關閉,並且沒有第二個請求。
  • 在證書中分配與 IP 地址相同的公用名
    不工作。
  • 此處檢查 ietf 規范中的 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()
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM