Java安全之证书与PKI

一、证书的作用

        证书作用之一就是存储公钥和用于公钥交换。公钥作为一个字段存储在数字证书中,因此证书的交换和传输就可以完成公钥的传输和交换。

        数字证书有各种格式,不同的格式存储的内容以及存储的格式也是不同的,常用的就是X.509格式的数字证书,这是国际标准。

所谓的证书格式就是存储着不同内容格式的文件。

 

        证书的另外一个作用是作为信任的基石。证书中存储了所有者的一些认证信息,并且该证书需要通过受信任的CA机构进行签名,

然后该证书就可以代表所有者的合法身份了。此时数字证书中的任何内容都将无法修改,否则证书的签名将会变化,就变成了不再受信任的证书。

其中数字签名就是用来保护数字证书本身的安全性和可信任性的。

        对于证书的签名一般先使用所有者的私钥进行签名,这样之后就可以对其进行完整性和一致性的校验,之后为了能让其他人信任这个证书,

那么就需要CA机构对其进行签名以认证证书的所有者和证书的从属关系。


二、证书链

        所谓的证书链就是一个证书A由另一个受信任的证书B进行签名,那么这个证书A也就成为了受信任的证书。也就是子证书可以由所有受信任的父级证书进行签名,

而不一定非要使用CA签名。也就是说,一个证书只要是由本地的受信任的证书列表所签名的,那么这个证书就是受信任的,并且这个证书还可以签名其他的证书,

那么其他的证书也将称为受信任的证书。此时验证的时候会采用回溯的方式进行验证,先验证证书的签名者是否在受信任列表,如果不再那么就查找这个颁发者的

颁发者是否在信任列表,如果在那么就信任该证书,如果不在则继续这个步骤。

        可以在浏览器查看证书时通过“证书路径”这个选项卡看到的就是证书链的关系,也就是当前证书由哪个证书签名,签名者由是由哪个证书或机构签名,

这个列表中最顶级的哪个证书就是本地信任列表中的一个证书。

        例如:

       

        这就说明了一般数字证书的签名是由其他受信任的证书或机构进行签名的,而根证书(信任列表的那些证书)是使用自己的私钥签名的,

 因此根证书的颁发者和颁发给的是同一个,例如:

       


        非根证书就不能使用自己的私钥进行签名了,否则就不是受信任的证书,而是需要使用一个其他受信任的证书的私钥进行签名,这样才能保证一

个信任的证书链。因此当验证非根证书的时候就需使用颁发者的公钥去验证,而不能使用证书本身的公钥进行验证,因为签名是使用颁发者的私钥签名的,

所以只有颁发者的公钥才可以解密这个签名。


三、证书的约束

        证书的约束主要包括证书的使用约束(用途)、有效期。例如根证书颁发的二级证书就需要限制这个证书的一些约束,例如显示证书的用途和有效期,

甚至包括这个二级证书是否可以再对其他证书进行签名。

        例如:

        Java安全之证书与PKI_第1张图片

        这个证书的SubjectType就是CA,那么这个证书就可以再对其他证书进行签名,那么被签名的证书就将成为受信任的证书。如果这里是EndEntity

则表示这个证书不能再对其他证书进行签名,否则被签名的证书也是不受信任的证书,当进行回溯验证时发现证书的签名者的约束是EndEntity则表示

这个颁发者所颁发的证书是不受信任的。

        再比如证书有“密钥用法”这个字段,该字段就定义这个证书只能用来做哪些事情,例如只能做数据的加密解密或者只能做身份的认证等。

       

        如果使用证书进行了非允许的用途,那么如果客户端比较严格那么就不会通过验证,也就是认为这个证书在此时是不受信任的。

就好像工商局颁发的营业执照中定义了经营范围和品类,如果用于其他的范围和品类那么就是不合法的,也就是不受信任的。



四、PKI

        PKI的含义就是“公钥基础设施”,它不是一个单独的概念,而是一个体系的概念。整个非对称加密系统、公钥体系、数字证书、证书链等

所有的内容组合起来形成了一个安全认证体系,使用这个体系来实现现代安全系统的一个基石,这个基石就称为PKI。所以PKI是一套系统或称为体系,

而不是一个单独的概念。

         证书的应用范围例如HTTPS和WIFI都是需要进行安全认证的,使用的就是服务提供者的数字证书进行安全和身份的认证。





你可能感兴趣的:(Java)