2013-06-03 49 views
14

Pem kodlu (base64) bir sertifikayı Python ile nasıl çözebilirim?Bir SSL sertifikasını python kullanarak nasıl çözebilirim?

-----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 göre böyle bir şey olmalı: Burada github.com bu Örneğin

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 

nasıl piton kullanarak bu düz metin alabilirim?

+1

Python'u kullanmak zorunda mısın? Openssl cmdline çıkışı bunu sizin için yapacak. – Joe

+0

Bir python programındaki tasdik dosyasından bazı bilgileri anında elde etmek istiyorum. – puwei219

+0

, asn1crypto, pyOpenSSL, M2Crypto, kriptografi, pyasn1 python paketlerini kullanabilirsiniz. İşte [kod örneği (Rusça)] (http://ru.stackoverflow.com/a/464445/23044) – jfs

cevap

17

Python'un standart kitaplığı, en son sürümde bile, X.509 sertifikalarının kodunu çözebilecek hiçbir şey içermez. Ancak, eklenti cryptography paketi bunu desteklemektedir. Bir example from the documentation alıntı:

>>> 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 

bir seçenek olabilir başka eklenti paketi pyopenssl olduğunu. Bu, OpenSSL C API'sinin etrafındaki ince bir sarıcıdır, yani istediğinizi yapmak için olacaktır, ancak belgelerinizde saçlarınızı koparmak için birkaç gün bekleyiniz.

Python eklenti paketleri yükleyemezsiniz, ancak openssl komut satırı yardımcı programını zorunda mıyım

,

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

kabaca Eğer cert_txt, web fayda var aynı şeyler üretmelidir.

Tesadüfen, düz bir base64 kod çözme işlemi yapmanın sebebi, ikili gobbledygook'un burada iki kodlama katmanı olmasıdır. X.509 certificates, X.690 DER formatına serileştirilmiş ASN.1 veri yapılarıdır ve daha sonra, DER, dosya aktarımı kolaylığı için base64 zırhlı bir ikili format olduğundan. (Bu alanda standartların bir çok şekilde geri doksanlarda güvenilir bir çevrede yedi bitlik ASCII başka bir şey gemi olamazdı zaman yazılmıştır.)

24

Sen bu tür verileri ayrıştırmak için pyasn1 ve pyasn1_modules paketlerini kullanabilirsiniz. Örneğin:

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()) 

Geri kalan için pyasn1 için dokümanlar okuyun.

İlgili konular