本文介绍两种方法获取数字证书文件中有用的信息。
证书文件的格式有多种,包括cer,der,crt,pem等。对于这些格式的文件通常可以使用openssl来查看相关的信息并进行输出。同时openssl 命令工具一般都是系统自带的,使用起来较为方便。例如解析.cer证书的openssl命令如下:
openssl x509 -inform DER -in xxx.cer -noout -subject
该命令会输出证书的subject信息,如下:
subject= /C=CN/ST=ZheJiang/L=HangZhou/O=Alibaba (China) Technology Co., Ltd./CN=*.cnzz.com
但是在使用的过程中发现,openssl提供的命令只能够解析到subject以及issuer这一级别,再精细的粒度无法直接提取,例如无法直接提取其中的O。如果想要直接输出suject中的O,则必须进行正则匹配,命令如下:
openssl x509 -inform DER -in xxx.cer -noout -subject | grep -oP "(?<=/O=).+?(?=/CN=)"
可得如下的输出:
Alibaba (China) Technology Co., Ltd.
如果需要提取像CN 以及ST或者L等一些字段,还需要再写一些正则进行匹配。同时可以看到subject的输出中如果有OU等输出,则相关的顺序需要注意,写正则还需要留心,非常的不方便。
由于python提供了对于openssl的支持,因此可以在python中使用该模块来获取证书信息。
安装该模块命令是:pip install pyopenssl
提取的demo如下:
def getCertSubjectInfo(certName):
from OpenSSL import crypto
cert = crypto.load_certificate(crypto.FILETYPE_ASN1, open(certName).read())
subject = cert.get_subject()
certSubjectInfo = []
certSubjectInfo.append(subject.O)
certSubjectInfo.append(subject.C)
certSubjectInfo.append(subject.L)
certSubjectInfo.append(subject.ST)
certSubjectInfo.append(subject.CN)
certSubjectInfo.append(subject.OU)
# 得到证书颁发机构
#issuer = cert.get_issuer()
#issued_by = issuer.CN
if subject.O != None:
print(subject.O)
return certSubjectInfo
其中load_certificate中的证书type包含FILETYPE_PEM, FILETYPE_ASN1两种,可以根据不同的证书类型进行选择。API 的参考见这里
可以看到通过python程序可以直接提取直接提取subject中的O,CN 等诸多信息,比之openssl命令更加的方便。
本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里。