2013-06-03 28 views
14

Làm cách nào tôi có thể giải mã chứng chỉ được mã hóa bằng pem (base64) bằng Python? Ví dụ ở đây từ github.com:Làm cách nào để giải mã chứng chỉ SSL bằng python?

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

Theo ssl-shopper nó phải được một cái gì đó như thế này:

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 

Làm thế nào tôi có thể nhận rõ này sử dụng python?

+1

Bạn có phải sử dụng python không? Đầu ra cmdline openssl sẽ làm điều này cho bạn. – Joe

+0

Tôi muốn nhận một số thông tin từ tệp chứng thực trong chương trình python, khi đang di chuyển. – puwei219

+0

bạn có thể sử dụng gói asn1crypto, pyOpenSSL, M2Crypto, mã hóa, pyasn1 python. Đây là [ví dụ về mã (bằng tiếng Nga)] (http://ru.stackoverflow.com/a/464445/23044) – jfs

Trả lời

17

Thư viện chuẩn của Python, ngay cả trong phiên bản mới nhất, không bao gồm bất kỳ thứ gì có thể giải mã chứng chỉ X.509. Tuy nhiên, gói bổ sung cryptography không hỗ trợ điều này. Trích dẫn một 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 

Một add-on gói mà có thể là một lựa chọn là pyopenssl. Đây là một wrapper mỏng xung quanh API OpenSSL C, có nghĩa là nó sẽ được có thể để làm những gì bạn muốn, nhưng mong đợi để dành một vài ngày rách tóc của bạn ra tại tài liệu hướng dẫn.

Nếu bạn không thể cài đặt Python add-on gói, nhưng bạn không có các tiện ích openssl dòng lệnh,

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

nên sản xuất khoảng những thứ mà bạn nhận được từ tiện ích web của bạn trong cert_txt.

Ngẫu nhiên, lý do thực hiện giải mã base64 thẳng đứng mang lại cho bạn tính năng gobbledygook nhị phân là có hai lớp mã hóa ở đây. X.509 certificatesASN.1 cấu trúc dữ liệu, được tuần tự hóa thành định dạng X.690 DER và sau đó, vì DER là định dạng nhị phân, được bọc base64 để dễ truyền tệp. (Rất nhiều tiêu chuẩn trong lĩnh vực này đã được viết trở lại vào những năm chín mươi khi bạn không thể giao một cách đáng tin cậy bất cứ thứ gì nhưng ASCII bảy bit xung quanh.)

24

Bạn có thể sử dụng gói pyasn1pyasn1_modules để phân tích loại dữ liệu này. Ví dụ:

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

Đọc tài liệu về pyasn1 cho phần còn lại.