我正在實施一個使用API的Web應用程序。在響應期間,API服務器通過鏈接發送X509證書(PEM格式,由簽名證書和一個或多箇中間證書組成的根證書),我必須下載該證書並使用該證書進行進一步驗證。如何在Python中驗證/驗證X509證書信任鏈?
在使用證書之前,我需要確保鏈中的所有證書都組合起來,爲受信任的根CA證書創建一個信任鏈(以檢測並避免任何惡意請求)。我在python中很難做到這一點,我對這個主題的研究沒有產生任何有用的東西。
證書被容易地抓住和使用加載請求和M2Crypto
import requests
from M2Crypto import RSA, X509
mypem = requests.get('https://server.com/my_certificate.pem')
cert = X509.load_cert_string(str(mypem.text), X509.FORMAT_PEM)
然而,驗證證書鏈是一個問題。我不可能將證書寫入磁盤,以便像子進程一樣使用像openssl
這樣的命令行實用程序,所以它必須通過python完成。我也沒有任何開放的連接,因此使用基於連接的驗證解決方案(如在此答案/線程中提到的:https://stackoverflow.com/a/1088224/4984533)也不起作用。
在這個問題(在https://stackoverflow.com/a/4427081)住持解釋說m2crypto是不能這樣做的驗證,而另一個線程說,他寫的擴展,允許驗證(使用該模塊m2ext
),但他的補丁似乎永遠不會工作,總是返回假的,即使我知道它是有效的:
from m2ext import SSL
ctx = SSL.Context()
ctx.load_verify_locations(capath='/etc/ssl/certs/') # I have run c_rehash in this directory to generate a list of cert files with signature based names
if not ctx.validate_certificate(cert): # always happens
print('Invalid certificate!')
也有一個類似的線程這裏https://stackoverflow.com/a/9007764/4984533在約翰·馬修斯聲稱有一個補丁書面這將做到這一點,但不幸的是補丁的鏈接現在是死了這個答案 - 無論如何,這個線程有一個評論,說明這個補丁不適用於openssl 0.9.8e。
所有有關驗證python證書信任鏈的答案似乎都鏈接到死補丁或返回到m2ext
。
有沒有一種簡單直接的方法可以驗證我的證書信任鏈在Python中?
順便說一句pyopenssl包裝OpenSSL的,所以你就不需要在命令行中使用它的相關文檔。如果你還沒有,也值得一讀https://www.python.org/dev/peps/pep-0476/ –
感謝鏈接AVI,我以前沒有見過。然而,它並不能幫助我解決當前的困境(特別是關於http客戶)。如果有必要,我沒有使用命令行程序進行驗證的問題 - 但如果我需要在每次請求時將pem文件寫入磁盤,則不會有問題。如果openssl verify命令可以使用原始字符串,那麼我可以使用它(儘管它看起來像是一種我認爲在Python中微不足道的冒險解決方法)。 – speznot