使用证书私钥的标准与报文格式
写在前面
最近在对一些银行接口,发现牵涉到加密、签名、证书,甚至各种标准,这方面有些资料比较少,有些资料多但是很杂乱,容易陷入混乱,于是尝试整理一下,也希望对别人能有所帮助。
有些是摘记部分博文概念,写的时候没能记录下来,如果博主需要,请联系我做引用说明。
这方面了解不多,如果有错漏之处欢迎指出!
1. 加密算法
在报文签名时,需要选择加密方式处理数据,这里简单提一下常见的加密概念,需要注意的是:签名、摘要都属于加密
- 单向加密:是不可逆的加密,例如MD5,SHA,对数据使用算法运算后得到固定长度的输出
- 对称加密:是加密方和解密方利用同一个密钥对数据进行加密和解密,例如DES,PBE等等
- 非对称加密:非对称加密分为公钥和私钥,二者是非对称的一对钥匙,例如用私钥加密的内容需要使用公钥来解密,使用公钥加密的内容需要用私钥来解密,例如DSA,RSA
签名:签名算法也是加密算法,它加密后的数据具有唯一标识性,就像一个人的签名能代表一个人身份。签名一般是指用非对称加密算法的私钥来加密明文的过程,生成的密文可以被持有公钥的人识别解密,只要你的公钥是准确对应无误的,就能保证你解密的数据是来自持有私钥的一方
摘要:是单向加密,例如MD5、SHA,对数据使用算法运算后得到固定长度的输出
2. 关于证书与密钥
2.1 公钥密码学标准PKCS
PKCS 全称是 Public-Key Cryptography Standards ,由一堆RFC文档组成。是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 15 个标准,以下PKCS标准汇总表格来自wiki:
版本 | 名称 | 简介 | |
---|---|---|---|
PKCS #1 | 2.1 | RSA密码编译标准(RSA Cryptography Standard) | 定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。1.5版本曾经遭到攻击[1]。 |
PKCS #2 | - | 弃用 | 原本是用以规范RSA加密摘要的转换方式,现已被纳入PKCS#1之中。 |
PKCS #3 | 1.4 | DH密钥协议标准(Diffie-Hellman key agreement Standard) | 规范以DH密钥协议为基础的密钥协议标准。其功能,可以让两方透过金议协议,拟定一把会议密钥(Session key)。 |
PKCS #4 | - | 弃用 | 原本用以规范转换RSA密钥的流程。已被纳入PKCS#1之中。 |
PKCS #5 | 2.0 | 密码基植加密标准(Password-based Encryption Standard) | 参见RFC 2898与PBKDF2。 |
PKCS #6 | 1.5 | 证书扩展语法标准(Extended-Certificate Syntax Standard) | 将原本X.509的证书格式标准加以扩展。 |
PKCS #7 | 1.5 | 密码消息语法标准(Cryptographic Message Syntax Standard) | 参见RFC 2315。规范了以公开密钥基础设施(PKI)所产生之签名/密文之格式。其目的一样是为了拓展数字证书的应用。其中,包含了S/MIME与CMS。 |
PKCS #8 | 1.2 | 私钥消息表示标准(Private-Key Information Syntax Standard). | Apache读取证书私钥的标准。 |
PKCS #9 | 2.0 | 选择属性格式(Selected Attribute Types) | 定义PKCS#6、7、8、10的选择属性格式。 |
PKCS #10 | 1.7 | 证书申请标准(Certification Request Standard) | 参见RFC 2986。规范了向证书中心申请证书之CSR(certificate signing request)的格式。 |
PKCS #11 | 2.20 | 密码设备标准接口(Cryptographic Token Interface (Cryptoki)) | 定义了密码设备的应用程序接口(API)之规格。 |
PKCS #12 | 1.0 | 个人消息交换标准(Personal Information Exchange Syntax Standard) | 定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的PFX就履行了PKCS#12。 |
PKCS #13 | – | 椭圆曲线密码学标准(Elliptic curve cryptography Standard) | 制定中。规范以椭圆曲线密码学为基础所发展之密码技术应用。椭圆曲线密码学是新的密码学技术,其强度与效率皆比现行以指数运算为基础之密码学算法来的优秀。然而,该算法的应用尚不普及。 |
PKCS #14 | – | 拟随机数产生器标准(Pseudo-random Number Generation) | 制定中。规范拟随机数产生器的使用与设计。 |
PKCS #15 | 1.1 | 密码设备消息格式标准(Cryptographic Token Information Format Standard) | 定义了密码设备内部数据的组织结构。 |
PKCS #7和CMS
PKCS #7对应的是RFC2315&5652文档。其中RFC5652即Cryptographic Message Syntax (密码消息语法,简称CMS,不是内容管理网站的那个cms),可以说PKCS#7包含了CMS,CMS是PKCS#7的新版本。这里附上RFC5652的原文文档,里面有这么一段:
This syntax is used to digitally sign, digest, authenticate, or encrypt arbitrary message content.
这说明pkcs#7只是定义了一种用于签名、证书和加密的语法标准,它既不是证书也不是签名,但是其定义的数据格式中可以包含证书和签名。因此有时提到的pkcs#7签名或者pkcs#7证书文件,是指的符合pkcs#7语法格式的部分内容,只是比较特殊。关于PKCS#7签名和CMS,具体请看文章2.2 报文数据定义。
我们一般会将pkcs#7用于数字信封加密,这包含两个步骤:
-
数字签名
签名方(或消息发送方)首先对业务数据进行摘要计算(例如sha1,sha256等),再对摘要结果使用私钥加密生成数字签名。消息接收方则使用发送方公钥和数字签名来验证消息真伪。
-
信封加密
消息发送方随机生成一个通讯秘钥,对业务数据完成对称加密计算,再对通讯秘钥进行加密封装(比如使用接收方公钥对其加密),按照一定格式对业务数据密文、通讯密钥密文、消息接收信息等组合形成信封,完成业务数据的加密保障。消息接收方则使用己方私钥解密信封的通讯密钥密文,得到通讯密钥,使用此秘钥对业务数据密文解密得到实际数据。
PKCS #12
更多待补充
2.2. 报文数据定义(CMS标准)
CMS(Cryptographic Message Syntax)是一系列针对电子签名、摘要、身份认证、数据加密的报文格式规范。
CMS 描述了用于数据保护的封装语法,支持数字签名和加密。该语法结构允许多层封装;一个封装信封可以嵌套在另一个里面。同样, 也可以对已封装的数据进行再次数字签名。它还允许任意属性,比如签名时间, 与数据消息一起进行签名等。
CMS 可以支持基于证书的各种体系结构密钥管理,比如采用X.509的公钥体系结构。CMS采用ASN.1[x. 208-88]格式,使用BER编码(基本编码规则) [X. 209-88],因此数字签名需按照ASN.1通用语法标准封装成ContentInfo类型。
ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。我将它理解成是一种语法定义标准,一些接口文档出现的类似以下的定义,就是属于ASN.1的数据定义,形如:
Report ::= SEQUENCE {
author OCTET STRING,
title OCTET STRING,
body OCTET STRING,
biblio Bibliography
}
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncapsulatedContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
signerInfos SignerInfos }
php封装ASN.1格式
SignedData
2.3 常见证书密钥格式
X.509是常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI) 制定的 ITU-T X509 国际标准。
- PKCS#7 常用的后缀是: .P7B .P7C .SPC
- PKCS#12 常用的后缀有: .P12 .PFX
- X.509 DER 编码(ASCII)的后缀是: .DER .CER .CRT
- X.509 PEM 编码(Base64)的后缀是: .PEM .CER .CRT
更多证书格式分辨,可参考这篇文章:那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)