【问题标题】:ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:777)
【发布时间】:2018-03-13 13:28:53
【问题描述】:

我目前正在使用 websocket-client 处理 python 到 QlikSense 服务器的连接。对于身份验证,我使用了由 Qlik sense 服务器生成的证书。

即使我遵循link 中提到的相同代码逻辑,但仍然出现错误。

from websocket import create_connection

def conn(senseHost, userDirectory, userId, privateKeyPath):

    # self.url = "wss://" + senseHost + ":4747/app/" # invalid
    url = "wss://" + senseHost + ":4747/app"  # valid
    ca = open(privateKeyPath + "root.pem").read()
    cer = open(privateKeyPath + "client.pem").read()
    key = open(privateKeyPath + "client_key.pem").read()
    certs = ({"ca": ca,
              "cert": cer,
              "key": key})
    # import pdb
    # pdb.set_trace()
    # ERROR raised here.
    ws = create_connection(url, sslopt=certs,
                                header={'X-Qlik-User: UserDirectory=%s; UserId=%s' % (userDirectory, userId)})
    session = self.ws.recv()
    return session

# below code has specific perameters.
c = conn("blablah.com","XYZ","ME","path/to/cert/")

我使用 pdb 跟踪了一个错误,

-> ws = create_connection(url,sslopt=certs,header={'X-Qlik-User: UserDirectory=%s; UserId=%s' % (userDirectory, userId)})
(Pdb) n
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

【问题讨论】:

  • QS 证书是自签名的。这意味着连接是安全的,但证书不受信任。可能这就是您收到错误的原因,您的代码应该忽略该错误。我不是 python 开发人员,但可以尝试这样的 `ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE}) ws.connect("wss://xxx.com:9090/websocket")` 发现于stackoverflow.com/questions/46852066/…
  • 如果我指定 ssl.CERT_NONE 那么它会给出 websocket._exceptions.WebSocketConnectionClosedException: Connection is already closed.

标签: python-3.x ssl websocket qliksense


【解决方案1】:

经过 4 小时的努力,我找到了解决方案。

def conn(senseHost, userDirectory, userId, privateKeyPath):
    url = "wss://" + senseHost + ":4747/app"  # valid
    certs = ({"ca_certs": privateKeyPath + "root.pem",
              "certfile": privateKeyPath + "client.pem",
              "keyfile": privateKeyPath + "client_key.pem",
              "cert_reqs":ssl.CERT_REQUIRED,
              "server_side": False
              })
    ssl.match_hostname = lambda cert, hostname: True
    ws = create_connection(url, sslopt=certs,
                                header={'X-Qlik-User: UserDirectory=%s; UserId=%s'% (userDirectory, userId)})

【讨论】:

  • 这条线是做什么用的? ssl.match_hostname = lambda 证书,主机名:True
  • ssl.match_hostname = lambda cert, hostname: True 也称为猴子补丁。它将 match_host name 设置为 true 即,这将避免像 Qlik_sense_server_hostname == request_origin_hostname 这样的条件。
猜你喜欢
  • 2018-07-29
  • 2017-06-01
  • 2023-03-03
  • 2018-03-15
  • 2020-01-14
  • 2019-03-12
  • 2017-06-25
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多