PKCS#7(RFC2315)描述了Data(明文),Signed-data(签名), Enveloped-data(数字信封)signedAndEnvelopedData, digestedData, and encryptedData六种数据结构,并用PEM格式存储。定义了如何对数据进行签名和加密并进行存储的方法。在Windows上可以用PKCS#7来存储证书,它是通过无正文数据的Signed-data来存储证书的(后缀名为.p7b,事实上PKCS#7中data正文是必选的,证书是可选的),因为PKCS#7设计并不是专门用来存储证书的,这样存储蛮奇怪的而且不符合标准。
关于对证书的定义PKCS#12标准(RFC7292)的原话是:A digitally signed data unit binding a public key to identity information.
我的理解证书就是将身份信息用私钥进行签名,并把签名和公钥绑定在一起的数据单元(PKCS#12把存储的一个个数据对象称为PDU)。PKCS#7中的Signed-data包含了身份信息(虽然没有X.509中的身份信息详尽)和签名,但是没有包含公钥,所以不能称为证书。
PKCS#12定义了KeyBag,PKCS8ShroudedKeyBag,CertBag,CRLBag,SecretBag,SafeContents一共6种PDU类型和Data,EncryptedData,EnvelopedData三种PDU加密方式,但是仍然不包含公钥(虽然可以把证书文件塞进去作为CertBag)。PKCS#12是一个复合容器(keystore),可以存储多种不同类型的密钥和证书,并且可以对PDU进行加密和完整性验证。属于一种keystore,PKCS#12不用来存储用户数据。
按照PKCS#12和PKCS#8中的要求虽然KeyBag,PKCS8ShroudedKeyBag只用来存储单个私钥,是不能包含公钥的(虽然私钥可以导出公钥)。
PKCS虽然涵盖了PKI的方方面面,但是唯独没有定义证书的格式,只有X.509同时包含了身份信息,公钥,签名三种信息,符合证书的定义。
以上,只有X.509证书的说法,没有PKCS格式证书的说法,X.509证书可以保存在PKCS#12证书容器中。X.509与PKCS的大多数规范并没有太大关系,反而PKCS#7中的Signed data可以使用X.509证书,只有PKCS#1中定义的公私钥存储格式和RSA加密/签名操作规范在X.509中有所体现。
https://lapo.it/asn1js/
asn.1解码器,可以解码PKCS和X.509编码的文件