簡體   English   中英

如何使用Python驗證具有證書頒發機構的公鑰?

[英]How to authenticate a public key with certificate authority using Python?

import OpenSSL

key = ...
signature = ...
data = ...

x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, key)
OpenSSL.crypto.verify(x509, signature, data, 'sha1')

到目前為止,我能夠毫無問題地完成所有這些工作。 但是,它並不覺得這是足夠的安全性,因為密鑰本身是通過URL(我應該信任*)給我的,並且構建簽名的方法是公開可用的。

因此,據說該密鑰被“VeriSign Class 3 Code Signing 2010 CA”驗證,任何人都可以告訴我如何檢查這是一個有效的聲明嗎?

我猜我需要在我的機器上本地獲得VeriSign證書。 假設我這樣做,我從那里去哪里?

謝謝!

* URL作為JSON請求中的參數提供給我。 當然,URL將是HTTPS,我可以檢查域名和所有這些。 但似乎我應該對證書本身進行檢查

也許我只能部分解決你的問題。 您最大的擔心似乎是獲取密鑰的渠道的安全性。 您沒有顯示任何獲取該密鑰的代碼,但您說您通過HTTPS檢索它,現在您想通過證書驗證來驗證此連接的真實性。

您可以使用完善的第三方Web客戶端框架請求輕松地這樣做。

文檔引用:

請求可以驗證HTTPS請求的SSL證書,就像Web瀏覽器一樣。 要檢查主機的SSL證書,可以使用verify參數:

requests.get(url, verify=True)

也:

您可以使用受信任CA的證書驗證路徑到CA_BUNDLE文件。

后者看起來像

requests.get(url, verify='/path/to/cert.pem')

如果您確實想要控制(並降低復雜性),請從http://www.symantec.com/page.jsp?id=roots加載正確的文件,並將verify='/path/to/cert.pem'方法。 我想你需要http://www.symantec.com/content/en/us/enterprise/verisign/roots/Class-3-Public-Primary-Certification-Authority-G2.pem

你應該檢查證書本身是對的。 是的,您需要簽署要檢查的證書的VeriSign根證書(以及具有完整信任鏈的任何其他中間證書)。

目前賽門鐵克(威瑞信)根證書,可以發現這里zip文件

下載並解壓縮zip文件並查找您希望信任的所有證書,並將它們(以pem格式)放在一個證書包文件中。

現在您需要進行實際驗證。 不幸的是,您需要的OpenSSL調用是X509_verify_certificate 我查看了pyopenssl和M2Crypto的源代碼,並且都沒有公開該調用,因此沒有直接的Python代碼可以調用以使用這些軟件包中的任何一個來驗證證書。

但是,由於您使用的是pyopenssl,因此您顯然可以使用openssl庫。 因此,您可能已經或可以輕松安裝openssl命令行工具集。 如果是這樣,您可以通過執行以下操作來通過管道調用openssl verify命令:

cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, key)
# the command like likes pem format
cert_pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)

# the bundle that you created from the zip extraction
certificate_bundle = 'verisign-root-bundle.pem'

# Pipe the cert to the openssl verify command and check the return code
# a return code of 0 is successful verify
import subprocess
p = subprocess.Popen(['openssl', 'verify', '-CAfile', certificate_bundle],
                     stdin=subprocess.PIPE)
p.communicate(input=cert_pem)
p.wait()
if (p.returncode == 0):
    print('Certificate Verified.')
else:
    print('Problem with certificate')

上面的管道運行命令

openssl verify -CAfile ca.bundle certificate.pem

最后,如果您不熟悉openssl,則顯示證書的命令是

openssl x509 -inform PEM -text -in certificate.pem

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM