用Python庫pyOpenSSL讀取iOS的p12證書

一、前言

本文主要是講解如何用python讀取p12的信息。html

若是有過iOS團隊開發經驗的朋友,必定對p12有所瞭解,由於蘋果開發者網站製做的cer證書,只能用生成上傳蘋果後臺的 CSR(Certificate Signing Request)文件 ————CertificateSigningRequest.certSigningRequest 的macOS系統安裝使用,同時,普通我的開發帳號最多可註冊iOS Development/Distribution 證書各2個。因此,p12 就是解決在多個電腦之間共享證書的一種方式。本文不會詳解iOS證書相關知識,能夠查看本文末的參考連接。前端

二、p12證書

在講解以前,先給你們說說原理。 p12 --- KCS12 file holds the private key and certificate. 我的信息交換(personal information exchange file)node

p12 存放了證書和私鑰,使用的是DER編碼。那什麼是DER呢? 這裏就要講講證書的知識:python

證書標準

X.509 - 一種證書標準,主要定義了證書中應該包含哪些內容。其詳情能夠參考RFC5280SSL 使用的就是這種證書標準。算法

編碼格式

一樣的X.509證書,可能有不一樣的編碼格式,目前有如下兩種編碼格式:shell

  • DER - Distinguished Encoding Rules,打開看是二進制格式,不可讀.跨域

  • PEM - Privacy Enhanced Mail,打開看文本格式,以"-----BEGIN..."開頭,"-----END..."結尾,內容是BASE64編碼。安全

因此,要查看p12的內容,最好是轉換成PEM格式。那麼這裏一種證書標準的格式,就須要實現了這種標準的工具就能解析:工具

  • OpenSSL - OpenSSL是SSL的一個實現,SSL只是一種規範。理論上來講,SSL這種規範是安全的,目前的技術水平很難破解,但SSL的實現就可能有些漏洞,如著名的"心臟出血"。OpenSSL還提供了一大堆強大的工具軟件,強大到90%咱們都用不到。

因此,使用 OpenSSL 就能夠讀取p12的信息,能夠經過如下命令把p12轉換爲pempost

openssl pkcs12 -in XXX.p12  -out XXX.pem -nodes
複製代碼

執行命令後,會要求輸入p12文件的密碼,若是密碼錯誤:Mac verify error: invalid password? ,若是密碼正確:MAC verified OK

示例:

p12:

20190628-HTC.p12.png

pem:

20190628-HTC.pem.png

pyOpenSSL 使用

因此,python 解析 p12 可使用 pyOpenSSL ,這裏就沒有什麼多說的,看代碼就好:

先安裝 pyOpenSSL

pip install pyOpenSSL
複製代碼

p12文件讀取代碼:

# load OpenSSL.crypto
from OpenSSL import crypto

# open it, using password. Supply/read your own from stdin.
p12 = crypto.load_pkcs12(open("/Users/HTC/Desktop/HTC.p12", 'rb').read(), '123456')

cer = p12.get_certificate()     # (signed) certificate object
pkey = p12.get_privatekey()      # private key.
ca_cer = p12.get_ca_certificates() # ca chain.
print(cer, pkey, ca_cer)

print('版本', cer.get_version())
print('簽名算法', cer.get_signature_algorithm())
print('序列號:', cer.get_serial_number())
print('證書是否過時:', cer.has_expired())
print('在此以前無效:', cer.get_notBefore())
print('在此以後無效', cer.get_notAfter())



#主題名稱
subject = cer.get_subject()
s_components = subject.get_components()
print(s_components)

key_dict = {'UID': '用戶 ID',
			'CN': '經常使用名稱',
			'OU': '組織單位',
			'O': '組織',
			'C': '國家或地區'
			}

for (key, value) in s_components:
	print(key, value)
	print(key_dict.get(key.decode(), key))

#簽發者名稱
suer = cer.get_issuer()
print(suer.get_components())

#證書擴展信息
print('擴展數:', cer.get_extension_count())
print('擴展1:', cer.get_extension(0))

複製代碼

總結

如今 Xcode8 以後,已經能夠經過登錄開發者帳號,自動下載和管理證書,從而減小開發者配置證書遇到的各位問題,很是的方便。固然,若是是多人開發或跨域團隊,或者不想讓開發人員拿到最高權限,使用p12仍是目前最好的方式!由於若是一個主帳號下的子帳號均可以操做證書,其實影響和安全性很難保證,因此,蘋果也有必定道理,很難在Xcode的帳號中,分權限管理吧。

關於證書,這裏只是介紹的說說p12的簡單知識,證書體系有很是多的標準和知識,還須要多學習多實戰,加油!

參考


  • 若有疑問,歡迎在評論區一塊兒討論!
  • 若有不正確的地方,歡迎指導!
> 注:本文首發於 [iHTCboy's blog](https://iHTCboy.com),如若轉載,請注來源
相關文章
相關標籤/搜索