本文主要是讲解如何用python读取p12
的信息。html
若是有过iOS团队开发经验的朋友,必定对p12
有所了解,由于苹果开发者网站制做的cer证书,只能用生成上传苹果后台的 CSR
(Certificate Signing Request)文件 ————CertificateSigningRequest.certSigningRequest
的macOS系统安装使用,同时,普通我的开发帐号最多可注册iOS Development/Distribution 证书各2个。因此,p12
就是解决在多个电脑之间共享证书的一种方式。本文不会详解iOS证书相关知识,能够查看本文末的参考连接。前端
在讲解以前,先给你们说说原理。 p12
--- KCS12 file holds the private key and certificate. 我的信息交换(personal information exchange file)node
p12
存放了证书和私钥,使用的是DER编码。那什么是DER呢? 这里就要讲讲证书的知识:python
X.509
- 一种证书标准,主要定义了证书中应该包含哪些内容。其详情能够参考RFC5280
,SSL
使用的就是这种证书标准。算法
一样的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
转换为pem
:post
openssl pkcs12 -in XXX.p12 -out XXX.pem -nodes
复制代码
执行命令后,会要求输入p12
文件的密码,若是密码错误:Mac verify error: invalid password?
,若是密码正确:MAC verified OK
。
示例:
p12:
pem:
因此,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
的简单知识,证书体系有很是多的标准和知识,还须要多学习多实战,加油!