数字证书 X509详解 && python解析SSL证书
程序员文章站
2022-07-12 22:29:20
...
数字证书
数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权,(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开**拥有者信息以及公开**的文件。最简单的证书包含一个公开**、名称以及证书授权中心的数字签名。
X.509信息
X.509 标准规定了证书可以包含什么信息,并说明了记录信息的方法(数据格式)。除了签名外,所有 X.509 证书还包含以下数据:
名称 | 含义 |
---|---|
版本 | 识别用于该证书的 X.509 标准的版本,这可以影响证书中所能指定的信息。迄今为止,已定义的版本有三个。 |
*** | 发放证书的实体有责任为证书指定***,以使其区别于该实体发放的其它证书。此信息用途很多。例如,如果某一证书被撤消,其***将放到证书撤消清单 (CRL) 中。 |
签名算法标识符 | 用于识别 CA 签写证书时所用的算法。 |
签发人姓名 | 签写证书的实体的 X.500 名称。它通常为一个 CA。 使用该证书意味着信任签写该证书的实体(注意:有些情况下(例如根或顶层 CA 证书),签发人会签写自己的证书)。 |
有效期 | 每个证书均只能在一个有限的时间段内有效。该有效期以起始日期和时间及终止日期和时间表示,可以短至几秒或长至一世纪。所选有效期取决于许多因素,例如用于签写证书的私钥的使用频率及愿为证书支付的金钱等。它是在没有危及相关私钥的条件下,实体可以依赖公钥值的预计时间。 |
主体名 | 证书可以识别其公钥的实体名。此名称使用 X.500 标准,因此在Internet中应是唯一的。它是实体的特征名 (DN),例如, CN=Java Duke,OU=Java Software Division,O=Sun Microsystems Inc,C=US (这些指主体的通用名、组织单位、组织和国家)。 |
主体公钥信息 | 这是被命名实体的公钥,同时包括指定该**所属公钥密码系统的算法标识符及所有相关的**参数。 |
成员 | 格式 |
---|---|
版本号 | INTEGER |
*** | INTEGER |
签名算法 | OBJECT |
颁发者 | SET |
有效期 | UTC_TIME |
主体 | SET |
主体公钥 | BIT_STRING |
主体公钥算法 | OBJECT |
签名值 | BIT_STRING |
常见的X.509证书格式包括:
cer/crt是用于存放证书,它是2进制形式存放的,不含私钥。
pem跟crt/cer的区别是它以Ascii来表示,可以用于存放证书或私钥。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式。
p10是证书请求。
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
X.509证书数据结构:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate, -- 证书主体
signatureAlgorithm AlgorithmIdentifier, -- 证书签名算法标识
signatureValue BIT STRING --证书签名值,是使用signatureAlgorithm部分指定的签名算法对tbsCertificate证书主题部分签名后的值.
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, -- 证书版本号
serialNumber CertificateSerialNumber, -- 证书***,对同一CA所颁发的证书,***唯一标识证书
signature AlgorithmIdentifier, --证书签名算法标识
issuer Name, --证书发行者名称
validity Validity, --证书有效期
subject Name, --证书主体名称
subjectPublicKeyInfo SubjectPublicKeyInfo,--证书公钥
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- 证书发行者ID(可选),只在证书版本2、3中才有
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- 证书主体ID(可选),只在证书版本2、3中才有
extensions [3] EXPLICIT Extensions OPTIONAL
-- 证书扩展段(可选),只在证书版本3中才有
}
Version ::= INTEGER { v1(0), v2(1), v3(2) }
CertificateSerialNumber ::= INTEGER
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL }
parameters:
Dss-Parms ::= SEQUENCE { -- parameters ,DSA(DSS)算法时的parameters,
RSA算法没有此参数
p INTEGER,
q INTEGER,
g INTEGER }
signatureValue:
Dss-Sig-Value ::= SEQUENCE { -- sha1DSA签名算法时,签名值
r INTEGER,
s INTEGER }
Name ::= CHOICE {
RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::=
SET OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue }
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY DEFINED BY AttributeType
Validity ::= SEQUENCE {
notBefore Time, -- 证书有效期起始时间
notAfter Time -- 证书有效期终止时间
}
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }
UniqueIdentifier ::= BIT STRING
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier, -- 公钥算法
subjectPublicKey BIT STRING -- 公钥值
}
subjectPublicKey:
RSAPublicKey ::= SEQUENCE { -- RSA算法时的公钥值
modulus INTEGER, -- n
publicExponent INTEGER -- e -- }
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }
python解析X509证书
导入对应的包
import ssl
import OpenSSL
from dateutil import parser
获取证书返回信息
resp=ssl.get_server_certificate(('www.qq.com', 443))
解析证书信息
x509 =OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM,resp )
解析具体数据
issuer=x509.get_issuer() #获取证书发行者名称
time1=parser.parse(x509.get_notBefore().decode("UTF-8")) #获取证书发放时间
对应函数
'get_issuer', 证书发行者名称
"CN : 通用名称 OU : 机构单元名称"
"O : 机构名 L : 地理位置"
"S : 州/省名 C : 国名"
'get_notAfter', 证书有效期终止时间
'get_notBefore', 证书有效期终止时间
'get_pubkey', 证书公钥值
'get_serial_number', 证书***,对同一CA所颁发的证书,***唯一标识证书
'get_signature_algorithm', 证书签名算法标识
'get_subject', 证书主体名称
'get_version', 证书版本
'has_expired', 证书是否已经过期
'gmtime_adj_notAfter',
'gmtime_adj_notBefore',
'set_issuer',
'set_notAfter',
'set_notBefore',
'set_pubkey',
'set_serial_number',
'set_subject',
'set_version',
'sign',
'subject_name_hash',
'to_cryptography'
上一篇: Myeclipse视图调整
下一篇: 5 tomcat多域名配置