用python 請(qǐng)求https api割择,返回SSL報(bào)錯(cuò):
SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
問題排查:
1逝撬,一般這種情況都是證書是自簽名的准潭,本地找不到可用的CA證書吱瘩。
需下載對(duì)應(yīng)的CA證書,然后導(dǎo)入方法簡(jiǎn)述:
OSX/macOS/iOS
執(zhí)行如下命令導(dǎo)入證書:
sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" xxx-ca-rsa.crt
Windows
雙擊下載的證書文件后按提示導(dǎo)入證書到受信任的根證書頒發(fā)機(jī)構(gòu) > 證書中娄琉。
或 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
其他發(fā)行版本請(qǐng)自行查找使用方法役听,:(
Java
導(dǎo)入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庫讀取的證書位置和系統(tǒng)默認(rèn)安裝路徑不一致一铅,導(dǎo)致找不到證書文件:
如果使用的requests庫陕贮,可以在環(huán)境變量中添加REQUESTS_CA_BUNDLE變量指向有效的CA證書文件,
export REQUESTS_CA_BUNDLE=/usr/local/share/ca-certificates/xxx-ca-rsa.crt?
但是這個(gè)方法不是很好潘飘,可能導(dǎo)致訪問其他正常的https又出現(xiàn)解析問題肮之。
查看python httplib庫,在connnect建立的時(shí)候有一個(gè)配置是:
VERIFY_CERTS_DEFAULT = None
CA_CERTS = None
try:
? import certifi
? CA_CERTS = certifi.where()
except ImportError:
? pass
可以在本地執(zhí)行下本語句卜录,看下CA_CERTS指向的路徑局骤,我本機(jī)測(cè)試指向如下:
/Library/Python/2.7/site-packages/certifi/cacert.pem
把對(duì)應(yīng)的CA證書內(nèi)容添加到文件中即可。
/Library/Python/2.7/site-packages/certifi/cacert.pem