概述
在进行网络访问过程中,当某一应用(假设为客户端)需要向另一应用(假设为服务端)发送消息时,有可能该消息在网络传输过程中被第三方应用截获并被读取,所以通常在传输过程中需要将消息加密,以确保消息被截获后无法进行正确的识别。
“对称加密”算法就是一种高性能的加密算法,其可以通过生成一个密钥,对信息进行加密和解密,当需要传输信息时,发送端可以通过该密钥对信息加密,接受端也可以通过同一个密钥对信息进行解密,从而确保了信息传输的安全。
不过,虽然“对称加密“算法加、解密速度很快,但也存在一个缺陷,那就是如何将密钥分发给通讯的双方,由于对称加密算法的加、解密需要的是相同的密钥,因此一旦该密钥被泄露,比如分发密钥时被截获,则任何获得密钥的人都可以对信息解密。
因此出现了另一种称之为“非对称加密“的算法(简称RSA加密),该算法通过生成一对密钥,一个称为公钥,一个称为私钥。私钥由发送方保管不需要发送给任何一方,仅仅需要将公钥发送给消息接受者。该算法的公钥仅能对成对生成的私钥加密的信息进行解密,同样私钥加密的密文也可以用公钥解开,但是公钥却不能解开公钥加密的密文,私钥也不能解开私钥加密的密文。
在实际使用过程中,通常会将公钥发布出去给任何需要接收消息的目标用户,然后发送端利用私钥加密信息,此时只有持有公钥的一端才能对该信息进行解密,而公钥加密的信息则只有私钥一端可以解开,其他同样持有公钥的一方无法解开,从而相对能够保证信息的安全。
由于非对称加密算法的性能比较差,加解密时间较长,不太适合频繁地对传输的信息内容加解密,该算法一般仅用于为对称加密算法的密钥进行加密。
不过“非对称加密”也存在先天的不足,就是当分发公钥过程中,公钥会被第三方应用截获,而截获者可以自己再生成一对非法的公、私钥,然后将这个非法公钥发送给目标,代替截获的合法公钥,这样当有信息被截获时,就用获得的合法公钥对信息进行解密并读取或篡改信息后,再用非法的私钥重新加密信息,并发送到目标,目标将会用非法的公钥解密信息,而不会发现信息已被篡改,这就是“中间人攻击”。
CA证书
为了避免中间人攻击的发生,能够将合法的公钥分发到目标用户手中,从而出现了一个中间机构通过分发CA证书来实现对公钥的正确性校验,在CA证书中包含公钥,当CA证书合法有效,则其内部的公钥就是合法的,在分发公钥时,只需要将合法的CA证书分发给目标,即可实现公钥的分发。
通常的场景就是消息发送方首先通过有效组织信息以及一个合法公钥,在CA机构申请一个合法证书,CA机构通过线上及线下的方式对申请者进行审核后,为其颁发有效的CA证书,该证书中包含了申请者合法的公钥,而CA证书的目标就是将这个公钥正确地送到消息接收端的手中。
当消息接收端收到CA证书后,首先可以对CA证书的真伪进行校验,查看该证书是否被篡改,是否是真正发送端发送过来的证书,提起对于CA证书的校验,不得不提一个根证书的概念。
根证书和证书链
每一个CA机构作为安全机制的一个环节,也必须同时拥有一个CA证书,来证明其是合法的CA证书提供商,全世界仅有几个顶级的CA提供商,这些提供商都是公认的合法CA提供商,其发布的证书也被公认为一定是合法的,这些提供商都为自己签发了一个用于认证其合法性的证书(这些证书通常会被默认安装在各种主流的浏览器中),而所有由这些机构颁发的证书都绑定到这些合法证书中的某一个上,构成一个证书的链条,链条的开始端就是这些机构自己的证书,也被成为“根证书”。根证书是顶级CA机构为自己签名的证书,也称为“自签名证书”。
在每一个由顶级CA颁发的证书中,都包含一个签名,该签名是使用顶级CA机构持有的私钥对申请证书者提供的摘要信息进行加密的密文,这些密文只能通过根证书中包含的公钥进行解密(在根证书中包含顶级机构自己的公钥用于分发,而其保留一个私钥用于为其颁发的证书加密),而验证某证书是否合法时,就是通过预先获得并安装的根证书中包含的公钥,对发送来的证书的签名进行解密,然后用解密后的信息与证书的摘要信息进行比较,即可发现该证书是否被篡改或者是否过期等,每一个证书的摘要信息都包含证书拥有者的公钥,若证明证书合法,则证书中的摘要信息中包含的公钥也是合法的。
在现实中,有限的几个顶级CA机构不可能承担所有组织对与证书的申请,因此顶级机构会授权一些第三方机构作为中间CA机构来分担证书颁发的工作(也可能是其他原因),这些被授权的中间CA机构同样需要向顶级CA机构申请一个证书,用于证明该机构的合法性,这些机构的证书将与顶级CA机构持有的根证书进行绑定,构成一个证书链的一部分。
这些中间机构持有的证书中也同样存在一个签名,是由顶级CA机构(或者上级)的密钥进行加密的,可以验证其证书的合法性,这些中间机构也同样会生成一对密钥,其持有私钥,而将公钥用于加密从这些机构申请的CA证书的签名部分。
每一个中间CA机构都可以像顶级CA机构一样为其他的第三方CA机构授权颁发证书,并加密其持有证书的签名部分,从而构成任意长度的证书链。
CA机构分发的证书分为两种类型:
1、CA机构证书
2、服务证书
CA机构证书就是CA认证机构持有的证书,而服务证书则是对外发布的证书,仅用于公钥的分发
认证服务证书是否有效时:
1、首先从服务证书顺证书链向上回溯寻找绑定的上级证书,并逐级找到顶级根证书(必须持有或安装了顶级根证书)
2、由于根证书是合法的,因此可以从根证书开始逐级向下验证证书链中每一级证书的合法性方法是:
1、用上级证书的公钥解密当前证书的签名
2、验证签名是否与摘要信息相同
3、证明合法后,取出摘要中的公钥,用于验证下一级证书
3、最终验证到服务证书(也就是证书链的最末端证书)合法有效
CA证书最常见的是采用X.509规范约定的证书结构,当前的是V3版本,其规范中的证书主体就是证书的摘要,包含服务的信息和公钥。
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, //证书发行者名称(DN信息)
validity Validity, //证书有效期
subject Name, //证书主体名称(DN信息)
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 { //SA算法时的公钥值
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
}
识别名(DN)信息
DN字段 | 缩写 | 说明 |
---|---|---|
通用名(Common Name) | CN | 证书颁发对象名称 |
组织或公司(Organization or Company) | O | 颁发对象所属单位 |
部门(Organizational Unit) | OU | 所在单位部门 |
城市(City/Locality) | L | 所在城市 |
省份(State/Province) | ST | 所在省份 |
国家(Country) | C | 国家代码,见ISO 3166-1 A2 |