2013-06-03 21 views
14

Pemでエンコードされた(base64)証明書をPythonでどのようにデコードできますか?例えば、ここで、このgithub.comから:どのように私のpythonを使用して、この平文を得ることができますPythonを使用してSSL証明書をデコードするにはどうすればよいですか?

Common Name: github.com 
Subject Alternative Names: github.com, www.github.com 
Organization: GitHub, Inc. 
Locality: San Francisco 
State: California 
Country: US 
Valid From: May 26, 2011 
Valid To: July 29, 2013 

-----BEGIN CERTIFICATE----- 
MIIHKjCCBhKgAwIBAgIQDnd2il0H8OV5WcoqnVCCtTANBgkqhkiG9w0BAQUFADBp 
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 
d3cuZGlnaWNlcnQuY29tMSgwJgYDVQQDEx9EaWdpQ2VydCBIaWdoIEFzc3VyYW5j 
ZSBFViBDQS0xMB4XDTExMDUyNzAwMDAwMFoXDTEzMDcyOTEyMDAwMFowgcoxHTAb 
BgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYBBAGCNzwCAQMTAlVT 
MRswGQYLKwYBBAGCNzwCAQITCkNhbGlmb3JuaWExETAPBgNVBAUTCEMzMjY4MTAy 
MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2Fu 
IEZyYW5jaXNjbzEVMBMGA1UEChMMR2l0SHViLCBJbmMuMRMwEQYDVQQDEwpnaXRo 
dWIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7dOJw11wcgnz 
M08acnTZtlqVULtoYZ/3+x8Z4doEMa8VfBp/+XOvHeVDK1YJAEVpSujEW9/Cd1JR 
GVvRK9k5ZTagMhkcQXP7MrI9n5jsglsLN2Q5LLcQg3LN8OokS/rZlC7DhRU5qTr2 
iNr0J4mmlU+EojdOfCV4OsmDbQIXlXh9R6hVg+4TyBkaszzxX/47AuGF+xFmqwld 
n0xD8MckXilyKM7UdWhPJHIprjko/N+NT02Dc3QMbxGbp91i3v/i6xfm/wy/wC0x 
O9ZZovLdh0pIe20zERRNNJ8yOPbIGZ3xtj3FRu9RC4rGM+1IYcQdFxu9fLZn6TnP 
pVKACvTqzQIDAQABo4IDajCCA2YwHwYDVR0jBBgwFoAUTFjLJfBBT1L0KMiBQ5um 
qKDmkuUwHQYDVR0OBBYEFIfRjxlu5IdvU4x3kQdQ36O/VUcgMCUGA1UdEQQeMByC 
CmdpdGh1Yi5jb22CDnd3dy5naXRodWIuY29tMIGBBggrBgEFBQcBAQR1MHMwJAYI 
KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBLBggrBgEFBQcwAoY/ 
aHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ0FDZXJ0cy9EaWdpQ2VydEhpZ2hBc3N1 
cmFuY2VFVkNBLTEuY3J0MAwGA1UdEwEB/wQCMAAwYQYDVR0fBFowWDAqoCigJoYk 
aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL2V2MjAwOWEuY3JsMCqgKKAmhiRodHRw 
Oi8vY3JsNC5kaWdpY2VydC5jb20vZXYyMDA5YS5jcmwwggHEBgNVHSAEggG7MIIB 
tzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cuZGln 
aWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0wggFkBggrBgEFBQcCAjCC 
AVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABp 
AGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBw 
AHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQ 
AC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQBy 
AHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0 
ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwBy 
AHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBl 
AG4AYwBlAC4wHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBEGCWCGSAGG 
+EIBAQQEAwIGwDAOBgNVHQ8BAf8EBAMCBaAwDQYJKoZIhvcNAQEFBQADggEBABRS 
cR+GnW01Poa7ZhqLhZi5AEzLQrVG/AbnRDnI6FLYERQjs3KW6RSUni8AKPfVBEVA 
AMb0V0JC3gmJlxENFFxrvQv3GKNfZwLzCThjv8ESnTC6jqVUdFlTZ6EbUFsm2v0T 
flkXv0nvlH5FpP06STLwav+JjalhqaqblkbIHOAYHOb7gvQKq1KmyuhUItnbKj1a 
InuA6gcF1PnH8FNZX7t3ft6TcEFOI8t4eXnELurXZioY99HFfOISeIKNHeyCngGi 
5QK+eKG5WVjFTG9PpTG0SVtemB4uOPYZxDmiSvt5BbjyWeUmEnCtwOh1Ix8Y0Qvg 
n2Xkw9dJh1tybLEvrG8= 
-----END CERTIFICATE---- 

ssl-shopperによると、それはこのようなものでなければなりませんか?

+1

あなたはpythonを使用する必要がありますか? opensslのcmdline出力がこれを行います。 – Joe

+0

私はpythonプログラムのcertifiateファイルから情報を得たいと思っています。 – puwei219

+0

asn1crypto、pyOpenSSL、M2Crypto、暗号化、pyasn1 pythonパッケージを使用できます。ここに[コード例(ロシア語で)](http://ru.stackoverflow.com/a/464445/23044) – jfs

答えて

17

Pythonの標準ライブラリには、最新バージョンであっても、X.509証明書をデコードできるものは含まれていません。ただし、アドオンcryptographyパッケージはこれをサポートしています。 example from the documentation引用:

>>> from cryptography import x509 
>>> from cryptography.hazmat.backends import default_backend 
>>> cert = x509.load_pem_x509_certificate(pem_data, default_backend()) 
>>> cert.serial_number 
2 

オプションであるかもしれない別のアドオンパッケージはpyopensslです。これは、OpenSSL C APIの薄いラッパーです。つまり、の可能性があります。あなたが望むことをすることができますが、ドキュメンテーションであなたの髪を引き裂くのに費やすことを期待します。

あなたはPythonのアドオンパッケージをインストールすることはできませんが、opensslコマンドラインユーティリティを持っている場合は

import subprocess 
cert_txt = subprocess.check_output(["openssl", "x509", "-text", "-noout", 
            "-in", certificate]) 

は大体あなたがcert_txtであなたのWebユーティリティから得た同じものを生産する必要があります。

ちなみに、まっすぐなbase64デコードを行う理由は、2つのエンコードレイヤーが存在するということです。 X.509 certificatesASN.1のデータ構造であり、X.690 DER形式にシリアル化されています.DERはバイナリ形式なので、ファイル転送を容易にするためbase64で装備されています。

24

pyasn1pyasn1_modulesパッケージを使用して、この種のデータを解析することができます(この領域の多くの標準は、たとえば、

from pyasn1_modules import pem, rfc2459 
from pyasn1.codec.der import decoder 

substrate = pem.readPemFromFile(open('cert.pem')) 
cert = decoder.decode(substrate, asn1Spec=rfc2459.Certificate())[0] 
print(cert.prettyPrint()) 

残りの部分はpyasn1のドキュメントをご覧ください。