SSL 证书异常的几种排错方法

用python 请求https api,返回SSL报错:

SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

问题排查:

1,一般这种情况都是证书是自签名的,本地找不到可用的CA证书。

需下载对应的CA证书,然后导入方法简述:

OSX/macOS/iOS

执行如下命令导入证书:

sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" xxx-ca-rsa.crt


Windows

双击下载的证书文件后按提示导入证书到受信任的根证书颁发机构 > 证书中。

或 certutil -addstore -f "ROOT" xxx-ca-rsa.crt

Linux

Ubuntu: cp xxx-ca-rsa.crt /usr/local/share/ca-certificates/xxx-ca-rsa.crt && update-ca-certificates –fresh

Arch: sudo trust anchor –store xxx-ca-rsa.crt

其他发行版本请自行查找使用方法,:(

Java

导入CA: ${JAVA_HOME}/bin/keytool -import -trustcacerts -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -alias RSA-CA -file xxx-ca-rsa.crt

查看CA: ${JAVA_HOME}/bin/keytool -list -v -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit

2. 如果还有问题,可能是一些python库读取的证书位置和系统默认安装路径不一致,导致找不到证书文件:

如果使用的requests库,可以在环境变量中添加REQUESTS_CA_BUNDLE变量指向有效的CA证书文件,

export REQUESTS_CA_BUNDLE=/usr/local/share/ca-certificates/xxx-ca-rsa.crt 

但是这个方法不是很好,可能导致访问其他正常的https又出现解析问题。

查看python httplib库,在connnect建立的时候有一个配置是:

VERIFY_CERTS_DEFAULT = None

CA_CERTS = None

try:

  import certifi

  CA_CERTS = certifi.where()

except ImportError:

  pass

可以在本地执行下本语句,看下CA_CERTS指向的路径,我本机测试指向如下:

/Library/Python/2.7/site-packages/certifi/cacert.pem

把对应的CA证书内容添加到文件中即可。

/Library/Python/2.7/site-packages/certifi/cacert.pem

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 服务器https配置 配置https操作说明文档 1、查看服务器环境配置(tomcat和apache合并使用) 2...
    南京杨小兵阅读 8,945评论 0 9
  • Cinder对接netapp存储使用https协议时,c-vol.log日志里会提示[SSL: CERTIFICA...
    笨手笨脚越阅读 1,341评论 0 1
  • 身体虚弱病菌就容易入侵人体、引起疾病,于是很多保健品都把提升免疫力作为卖点进行销售,仿佛免疫力上去了就能百病不侵、...
    悬壶记事阅读 801评论 0 0
  • 昨晚住在学校,感觉这是以后的常态了!天气渐冷,不能被冻得落下一身病!住在学校,少了在路上的奔波,感觉时间很充裕...
    平安执笔写青春阅读 153评论 0 0
  • 睁开眼睛 我便开始流泪 摸着镜子里的自己 孤独而又明亮的眼睛 在黑暗中摸索 想要找到结束一切的工具 却只能找到一个...
    欺尘阅读 180评论 1 0