解析数字证书的两种方法—openssl命令和python pyopenssl模块

本文介绍两种方法获取数字证书文件中有用的信息。

证书文件的格式有多种,包括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村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

发布了132 篇原创文章 · 获赞 183 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/javajiawei/article/details/95617550