最近的项目中接触到了密钥和证书。最开始拿到的是 x.pfx 和 x.der 两个文件,当时傻傻不懂这两者的区别,人云亦云的把这两个文件都称之为 密钥文件 ,把pfx叫做了私钥证书,把der叫做了公钥证书。
在需要我自行生成这两个文件时才头大了,完全不知道这两者从何而来,怎么生成。在咨询同事以及在网络上搜寻相关资料后,大致明白了 x.pfx 和 x.der 文件的区别以及它们的真正身份:
pfx文件
这是密钥库文件,里面可以包含多个密钥对,不同密钥对可以通过别名alias进行区分。一个密钥对就分为了公钥和私钥。密钥库文件本身就需要密码才能访问,其包含的密钥对也需要密码才能访问。
密钥库也有很多的标准,后缀名为 pfx的密钥库使用的标准应该是:PKCS12 , 这个标准下的后缀名也可以是 .p12 。 查找相关资料说这个标准下 密钥库的密码和密钥对的密码是同一个,暂时未进行实际操作验证。
所以,最开始把pfx文件叫做私钥文件,其实是不对的。
java自带的keytool生成的密钥库的标准为 jks ,文件的后缀名称可以是 .jks/.ks 。 但实际使用keytool生成的密钥库文件后缀名却是 ".keystore " ,但貌似同一个标准下的后缀名可以互相替换。jks标准下的密钥对可以使用与密钥库不同密码,这一点倒是经过了实际的验证。
其他密钥库标准还有 JCEKS BKS UBER,但貌似主流使用的是 PKCS12 。 java自带的 jks 标准使用的也不少。但说到底,这只是密钥库文件的标准,对于密钥对来说并不影响,因此也有不少的工具可以将不同标准的密钥库文件进行互相的转换,并生成文件。 目前java中主流的密钥库以及密钥对的操作工具是 BouncyCastle 提供的。
der文件
这个是存放了公钥的证书文件。叫它公钥文件到还是不算错。 但实际上 der本身又是一个证书格式的标准,实现其标准的文件只包含公钥,后缀名称可以是 .cer/.crt/.rsa 。 从项目中文件后缀名称为 der ,并且实际证书可以正常的使用这一点来看,至少公钥证书文件的后缀名不影响java程序对其的识别与解析,至少在接触到的系统中是如此。