X.509 数字证书与 SSL/TLS
X.509
编码格式
- PEM
- DER
PEM (Privacy Enhanced Mail)
最常见的编码格式,BASE64 ASCII 编码,首尾都包含纯文本
例如,证书请求文件
1 | -----BEGIN CERTIFICATE REQUEST----- |
PEM 文件可以包含一个或多个证书
- FISCO BCOS 中的节点证书包含了服务器证书和节点本身的证书
通常,PEM 文件后缀包括 .pem
、.key
、.csr
、.crt
DER (Distinguished Encoding Rules)
二进制编码,不包含首尾文本,通常用于 Java ,文件后缀包括 .der
、.cer
注意:PEM 格式的文件和 DER 格式的文件可以相互转换
文件后缀及内容(字段)
PEM 格式的文件可以统一存储为后缀 .pem
,为了便于区分用途,假设根据文件内容设置不同的后缀
此外,假设使用国密证书
私钥文件
私钥文件(Private Key),后缀为 .key
,用于签名
- SM2 椭圆曲线公钥密码算法 --> 生成公钥、私钥
- 将私钥以 PEM 格式存储 -->
.key
文件
证书请求文件
全称 Certificate Signing Request,后缀为 .csr
,用于向服务器申请证书
证书请求文件模板
- 基于 Package x509
1 | type CertificateRequest struct { |
证书文件
全称 Certificate,后缀为 .crt
,用于身份认证
- 版本
- 序列号
- 签名算法
- 颁发者
- 有效期
- 主体
- 主体公钥
- 颁发者 ID(可选)
- 主体 ID(可选)
- 扩展(可选)
- 签名
证书链即包含多个层级的证书
证书文件模板
- 基于 Package x509
1 | type Certificate struct { |
国密改造细节
在 Package x509 的基础上进行改造
数字证书的每项都有对象标识 OID, SM2 数字证书与标准 X.509 证书的主要区别就是公钥算法、公钥参数、签名算法的标识不同
SignatureAlgorithm
1 | SM2WithSM3 |
algoName
1 | SM2WithSM3: "SM2-SM3", |
oidSignature
1 | oidSignatureSM2WithSM3 = asn1.ObjectIdentifier{1, 2, 156, 10197, 1, 501} |
signatureAlgorithmDetails
1 | var signatureAlgorithmDetails = []struct { |
oidNamed
1 | oidNamedCurveP256SM2 = asn1.ObjectIdentifier{1, 2, 156, 10197, 1, 301} |
代码演示
- 自签证书
- Root CA 使用自己的私钥对证书签名,生成自签证书
- 证书文件
- CA 直接使用 Client 提供的公钥进行证书签发
- 证书请求文件 --> 证书文件
- Client 向 CA 发送证书请求文件
- CA 使用证书请求文件中的信息签发证书
- CA 将证书文件返回给 Client
SSL/TLS
应用层协议
- 以 TCP 连接为基础(传输层)
原理 - 三次握手
-
SYN、SYN ACK、ACK
- TCP 三次握手,建立 TCP 连接
-
ClientHello
- Client 发送 Hello
- 协议版本(protocol version)
- Client 随机数(用于后续的三次握手)
- 支持的密码套件(cipher suites)
- 支持的压缩算法(compression methods)
- 支持的扩展(extensions)
- 可选的 session id (恢复 resume)
- Client 发送 Hello
-
ServerHello、Certificate、ServerHelloDone
- Server 发送 Hello
- 选择的协议版本
- Server 随机数
- 选择的密码套件
- 选择的压缩算法
- 一系列扩展
- session id
- Server 发送证书
- Server 主机名
- Server 使用的公钥
- 可信第三方签名(CA)
- Server 发送 Hello
-
ClientKeyExchange、ChangeCipherSpec、Finished
- Client 验证证书,提供密钥交换的信息
- Client 生成 pre Master Key(取决于密钥生成算法,通常是随机数,用于生成对称密钥)
- Client 使用 Server 公钥加密 pre Master Key,并发送给 Server
-
ChangeCipherSpec、Finished
- Server 解密 pre Master Key,利用 MAC 验证消息完整性
- 返回加密的 “Finished” 消息
Client 和 Server 使用相同的参数生成对称密钥,用于会话消息的加密,因此也称为会话密钥。
容易混淆的说法:将密钥称为加密密钥
国密算法要求双向认证
- 在 3. 上多一步,Server 向 Client 要求证书
- 在 4. 上多一步,Client 向 Server 提供自己的证书(证明身份)
代码演示
Server
- Root CA 证书
- Server 证书
- Server 私钥
Client
- Root CA 证书
- Client 证书
- Client 私钥
Server 与 Client 的逻辑基本一致
- 读取自己的公钥证书和私钥
- 载入证书(链)、根证书
- 提供自己的证书
- 验证对方的证书
- 配置 TLS
- 认证方式、证书(链)、根证书集合
- 创建通道进行监听 / 发起连接请求
区块链身份认证方案
FISCO BCOS
FISCO BCOS网络采用面向CA的准入机制,支持任意多级的证书结构,保障信息保密性、认证性、完整性、不可抵赖性。
- 使用
openssl
命令 - 一般情况,三级结构
- 链证书
- 机构证书
- 节点/SDK 证书
使用证书请求文件申请证书
1 | # CA |
Fabric
Fabric CA 在 Fabric 中的架构
Fabric CA 层级架构
CA 服务器
- TLS CA
- ORG CA
- TCA(transaction)
使用用户名密码获得证书
- 注册 Register:获得凭据
- 登记 Enroll:返回私钥、公钥证书、CA 证书链
典型 PKI 架构
组成部分
- 证书
- 信任链
- 根证书、中间证书、…
- 证书颁发机构
- Root CA:信任锚
总结
树形层级架构
1 | Root CA # 信任锚 |
-
FISCO BCOS 直接使用
openssl
进行签发,使用一个文件夹存储私钥、证书- 节点的黑名单机制,未提到撤销证书
- 优先级:黑名单 > 白名单
- 生成证书请求文件向服务器续期
- 节点的黑名单机制,未提到撤销证书
-
Fabric 结合数据库或 LDAP ,使用注册登记机制,通过 MSP 模块(成员服务提供者)管理私钥、证书
- 向服务器进行证书撤销或续期
都是向服务器申请 CA 证书(链),以及签发证书。
参阅
- PEM, DER, CRT, and CER: X.509 Encodings and Conversions
- Package x509
- Go 标准库 中文参考 package x509
- 什么是传输层安全性(TLS)?
- Taking a Closer Look at the SSL/TLS Handshake
- Differences between the terms “pre-master secret”, “master secret”, “private key”, and “shared secret”?
- Your Guide to How PKI Works & Secures Your Organization
- TLS terminology
- RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2
关于国密 TLS
市面产品