PKI和公钥证书标准
PKI(Public Key Infrastructure)公钥基础设施是一种密钥管理机构,采用数字证书技术管理公钥。数字证书是实现基于公开密钥认证协议的基础,数字证书主要起到身份认证和提供通信加密密钥的作用。目前数字证书普遍采用的标准是X.509。
PKI的组成
PKI采用数字证书技术管理公钥,通过第三方的可信任机构CA,把用户的公钥和身份信息绑定,用于身份验证。

认证机构CA:认证机构CA也成为认证中心,是PKI的核心,其重要功能包括数字证书申请注册、证书签发和管理。
证书库:CA颁发证书和撤销证书的集中存放地,供外部进行开放式查询。
X.509数字证书
如图所示为X.509 V3格式的证书内容。

数字证书绑定了公钥及其持有者的身份信息,数字证书身份认证流程如下:
- 示证方A向CA提交注册资料,申请数字证书。
- CA向A颁发用CA私钥签名过的数字证书,证书包含A的身份信息和CA的公钥,由于使用了CA私钥进行签名,其他人无法伪造该证书。
- A使用私钥对特定信息进行签名,连同数字证书一起发给验证方B。
- B为了核实A证书的真伪,使用CA公钥验证A的证书。
- 获取A的公钥,用A的公钥对A的签名进行验证。

实际上,X.509的CA目录是一个层次结构,例如:x希望验证a的证书,由于a的证书是认证机构D签发的,那么x需要得到D的公钥。如果x不能确定D的公钥,就必须查看D的证书,而D的证书是认证机构B签发的,x此时需要B的公钥,以此类推。
认证机构A作为CA结构的根节点,A的证书也叫根证书,其实是一个自签名证书,根节点的证书一般会内置在操作系统和浏览器中。

JKS证书库
Java相关开发中,经常用到JKS证书库。例如Android开发中,我们可以对APK进行自签名,签名会生成一个.jks文件,它其实是一个证书库文件。而使用最新的APP Bundle格式发布时,需要由Play商店签名,此处Play商店就起到了类似CA的作用。
JDK中包含一个keytool.exe可以用于操作JKS证书库,使用例子如下。
生成证书库和自签名证书:
keytool -genkey -alias mytest -keyalg RSA -keystore keystore.jks -keysize 2048
生成证书过程中,需要输入密码、身份信息等内容。
查看证书库内容:
keytool -list -v -keystore keystore.jks
下面代码从JKS证书库中,读取私钥和证书公钥。
// 读取证书库
String alias = "mytest";
String keystorePass = "abc123";
String keyPass = "abc123";
KeyStore keyStore = KeyStore.getInstance("JKS");
File file = new File("E:/keystore.jks");
InputStream in = new FileInputStream(file);
keyStore.load(in, keystorePass.toCharArray());
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, keyPass.toCharArray());
PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey();
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。