Python HTTPS请求SSLError CERTIFICATE_VERIFY_FAILED

时间:2018-10-22 17:55:09

标签: python python-2.7 ssl request nim

PYTHON

refresh

NIM

import requests

url = "https://REDACTED/pb/s/api/auth/login"

r = requests.post(
    url,
    data = {
        'username': 'username',
        'password': 'password'
    }
)

我正在调用API来获取一些数据。运行python代码,我得到下面的追溯。但是,nim代码可以完美运行,因此python代码或设置一定存在问题。

我正在运行python版本2.7.15。 请求lib版本2.19.1

import httpclient, json

let client = newHttpClient()

client.headers = newHttpHeaders({ "Content-Type": "application/json" })
let body = %*{
    "username": "username",
    "password": "password"
}

let resp = client.request("https://REDACTED.com/pb/s/api/auth/login", httpMethod = httpPOST, body = $body)

echo resp.body

2 个答案:

答案 0 :(得分:1)

requests模块将验证从服务器获取的证书,就像浏览器一样。 requests会引发该异常,而不是像您在浏览器中那样单击并说出“添加异常”。

有一种解决方法:尝试将verify=False添加到您的post通话中。

答案 1 :(得分:1)

  

但是,nim代码可以完美运行,因此python代码或设置一定存在问题。

实际上,您对Python代码或设置的责任不大,而应该使用nim代码,或者最好使用httpclient库中的默认值。在nim的文档中可以看到,httpclient.request默认使用getDefaultSSL返回的SSL上下文,该上下文根据this code创建了不验证证书的上下文:< / p>

proc getDefaultSSL(): SSLContext =
  result = defaultSslContext
  when defined(ssl):
    if result == nil:
      defaultSSLContext = newContext(verifyMode = CVerifyNone)

您的Python代码改为尝试正确验证证书,因为requests库默认情况下会这样做。而且由于某些问题-您的设置或服务器出现问题,它无法验证证书。

不清楚谁为您的站点颁发了证书,但是如果它不在默认的CA存储中,则可以使用verify的{​​{1}}参数来指定颁发者CA。有关详情,请参见this documentation

如果您尝试访问的站点可与浏览器一起使用,但无法与您的程序一起使用,则可能是因为它使用了特殊的CA,该CA被添加为对浏览器的信任(例如公司证书)。浏览器和Python使用不同的信任库,因此,此添加的证书也需要添加到Python或至少也要信任为您的程序。服务器的设置也可能有问题。浏览器有时可以解决诸如缺少中间证书之类的问题,但Python则不能。如果是可公开访问的网站,则可以使用SSLLabs来检查出什么问题。