前提条件¶
以下关于身份、会员服务提供商(MSP)和证书颁发机构(CA)的Fabric文档资源为理解证书管理提供了上下文:
- 身份(Identity)
- MSP
- 注册和登记(Registration and Enrollment)
- 注册身份
- 登记身份
关键概念¶
注册(Register)
用户名和密码对,存储在证书颁发机构(CA)中。此注册由CA管理员用户创建,没有过期,并且包含任何必需的角色和属性。
登记(Enroll)
由组织的证书颁发机构(CA)颁发的公钥/私钥对和X.509证书。证书对角色、属性和元数据进行编码,由此证书表示Fabric网络中的身份。这里的登记通过用户名和密码与CA注册相关联。
身份(Identidy)
用于加密的公共证书及其私钥。公共证书是由CA颁发的X.509证书,而私钥则存储在带外的安全存储中。
TLS
授权客户端和节点通信的公共传输层安全性(TLS)证书。在Fabric网络上,X.509证书和TLS证书的注册和登记是相同的。
证书类型¶
Hyperledger Fabric实现了两种类型的证书:
1)用于标识身份的登记证书和
2)用于节点和客户端通信的TLS证书。
登记(enroll)证书¶
登记证书分为四种类型:
- Admin
- Peer
- Orderer
- Client
每种登记证书类型都有一个特定的角色:
- Admin:用于验证管理员身份的X.509证书,更改Fabric配置时需要这些证书。
- Peer:用于注册peer节点的X.509证书,物理上位于节点上或映射到节点。要启动Fabric peer节点,它必须具有具有所需属性的有效注册证书。
- Orderer:X.509证书,用于注册位于节点上或映射到节点的Orderer节点。要启动Fabric排序节点,它必须具有具有所需属性的有效注册证书。
- Client:允许已签名请求从客户端传递到Fabric节点的X.509证书。客户端证书定义向Fabric网络提交交易的客户端应用程序的标识。
TLS证书¶
TLS证书允许Fabric节点和客户端对通信进行签名和加密。任何通道通信都需要有效的TLS证书。
证书过期问题¶
注册和TLS证书由颁发证书颁发机构(CA)指定一个到期日期。必须监控到期日期,并且证书必须在到期前重新注册。最重要的证书参数是Not After元素,它指示其到期日期。
证书和位置¶
组织CA为身份提供X.509注册证书,TLS CA为保护节点和客户端通信提供TLS证书。
组织CA证书¶
组织CA根证书和组织CA管理证书提供与组织的证书颁发机构交互的授权,如下所述。
组织CA根证书¶
- Description:允许验证组织CA颁发的所有证书的公共证书。如果创建新的证书颁发机构(CA),则组织CA根证书是自签名证书,或者由外部CA提供。
- Location:存储在组织CA目录(CA-cert.pem)的磁盘上,并复制到通道配置中,以验证组织的标识。
- Impact if expired:必须颁发新的组织CA根证书。组织CA根证书的有效期为15年。
组织CA管理员证书¶
- Description:向组织CA发出管理请求时使用的证书。
- Location:取决于实施情况:
**Note**: Each identity has a local **msp** directory structure which contains its certificate in the **signcerts** directory and its private key in the **keystore** directory. For details on the **msp** directory, refer to [MSP Structure](https://hyperledger-fabric.readthedocs.io/en/latest/membership/membership.html#msp-structure).
msp
├── IssuerPublicKey
├── IssuerRevocationPublicKey
├── cacerts
│ └── localhost-7053.pem
├── keystore
│ └── key.pem
├── signcerts
│ └── cert.pem
└── user
- Impact if expired:组织管理员无法向CA注册新标识,但交易流量不会停止。
TLS CA证书¶
TLS CA根证书和TLS CA管理证书提供与TLS证书颁发机构交互的授权,如下所述。
TLS CA根证书¶
- Description:允许验证TLS CA颁发的所有证书的公共证书。如果创建新的证书颁发机构(CA),TLS CA根证书是自签名证书,或者由外部CA提供。
- Location:存储在TLS CA目录(CA-cert.pem)的磁盘上,并复制到通道配置中,以验证组织的TLS证书。
- Impact if expired:必须颁发新的TLS CA根证书。TLS CA根证书的有效期为15年。
TLS CA管理员证书¶
- Description:用于TLS CA的管理请求的证书。
- Location:取决于实施情况:
msp
├── IssuerPublicKey
├── IssuerRevocationPublicKey
├── cacerts
│ └── localhost-7053.pem
├── keystore
│ └── key.pem
├── signcerts
│ └── cert.pem
└── user
- Impact if expired:结构管理员将无法再在网络中节点的TLS CA中注册TLS证书。
Peer证书¶
为组织中的每个peer节点颁发peer登记证书和peer TLS证书。
peer登记证书¶
- Description:在认可事务时验证Peer节点的身份。
- Location:取决于实施情况:
org1ca
└── peer1
├── msp
│ ├── admincerts
│ │ └── cert.pem
│ ├── cacerts
│ │ └── localhost-7053.pem
│ ├── keystore
│ │ └── key.pem
│ ├── signcerts
│ │ └── cert.pem
│ └── user
|── tls
- Impact if expired:生产中断。没有有效的注册证书,Peer节点不会启动。
Peer TLS证书¶
Description:对通道上的节点组件通信进行身份验证。
Location:取决于实施情况:
org1ca/
└── peer1
├── msp
└── tls
├── cacerts
├── keystore
│ └── key.pem
├── signcerts
│ └── cert.pem
├── tlscacerts
│ └── tls-localhost-7053.pem
└── user
Impact if expired:生产中断。无法与Peer节点进行通信。
排序证书¶
为组织中的每个排序服务节点颁发排序注册证书和排序TLS证书。
排序注册证书¶
Description:排序用于对区块进行签名的公钥。
Location:取决于实施情况:
└── orderer1
├── msp
│ ├── admincerts
│ │ └── cert.pem
│ ├── cacerts
│ │ └── localhost-7053.pem
│ ├── keystore
│ │ └── key.pem
│ ├── signcerts
│ │ └── cert.pem
│ |── user
└── tls
Impact if expired:生产中断。没有有效的注册证书,排序将无法启动。
排序TLS证书¶
- Description:用于排序节点通信的TLS证书。
- Location:取决于实施情况:
ordererca/
└── orderer1
├── msp
└── tls
├── cacerts
├── keystore
| └── key.pem
├── signcerts
│ └── cert.pem
├── tlscacerts
│ └── tls-localhost-7053.pem
└── user
- Impact if expired:生产中断。排序节点不再被允许参与集群。
Admin证书¶
为每个组织颁发排序服务组织通道管理员证书和Peer服务组织通道管理证书。
排序服务机构通道管理员证书¶
- Description:组织管理员管理排序服务和通道更新的证书。
- Location:取决于实施情况:
ordererca/
└── ordereradmin
└── msp
├── admincerts
│ └── cert.pem
├── cacerts
│ └── localhost-7053.pem
├── keystore
│ └── key.pem
├── signcerts
│ └── cert.pem
└── user
- Impact if expired:交易可以继续成功工作。无法从客户端应用程序修改通道,也无法从控制台管理排序。
Peer服务组织通道管理员证书¶
- Description-组织管理员管理Peer节点的证书,包括通道和链码服务。
- Location-取决于实施情况:
org1ca/
└── org1admin
└── msp
├── admincerts
│ └── cert.pem
├── cacerts
│ └── localhost-7053.pem
├── keystore
│ └── key.pem
├── signcerts
│ └── cert.pem
└── user
Impact if expired:交易可以继续成功工作。无法从客户端应用程序安装新的智能合约,也无法从控制台管理Peer节点。
客户端证书¶
Description:为每个组织颁发两种类型的客户证书:
(1)组织登记证书-对客户端身份进行身份验证,以便与Peer节点和排序节点进行交互。
(2)TLS证书-对客户端通信进行身份验证,并且只有在配置了双向TLS时才需要。
使用Hyperledger Fabric CA默认设置,客户端证书将在一年后过期。可以使用命令行Hyperledger Fabric CA实用程序或Fabric CA客户端SDK重新注册客户端证书。
Impact if expired:客户端证书必须在过期前重新注册,否则客户端应用程序将无法与Fabric节点交互。
证书解码¶
X.509证书是根据证书的注册通过登记创建的。X.509证书包含描述其用途和标识父CA的元数据。证书过期时间在“Not After”字段中指定。
可以使用OpenSSL实用程序对证书详细信息进行解码:
# openssl x509 -in cert.pem -text -noout
以下示例显示了已解码的证书:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
47:4d:5d:f6:db:92:6b:54:98:8d:9c:44:0c:ad:b6:77:c5:de:d2:ed
Signature Algorithm: ecdsa-with-SHA256
Issuer: C = US, ST = North Carolina, O = Hyperledger, OU = Fabric, CN = orderer1ca
Validity
Not Before: Feb 4 14:55:00 2022 GMT
Not After : Feb 4 15:51:00 2023 GMT
Subject: C = US, ST = North Carolina, O = Hyperledger, OU = orderer, CN = orderer1
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:29:ec:d5:53:3e:03:9d:64:a4:a4:28:a5:fe:12:
e2:f0:dd:e4:ee:b9:3f:3e:01:b2:3a:d4:68:b1:b2:
4f:82:1a:3a:33:db:92:6d:10:c9:c2:3b:3d:fc:7a:
f0:fa:cc:8b:44:e8:03:cb:a1:6e:eb:b3:6c:05:a2:
f8:fc:3c:af:24
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Key Identifier:
63:97:F5:CA:BB:B7:4B:26:84:D9:65:40:E3:43:14:A4:7B:EE:79:FF
X509v3 Authority Key Identifier:
keyid:BA:2A:F8:EA:A5:7D:DF:1D:0F:CF:47:37:41:82:03:7E:04:61:D0:D8
X509v3 Subject Alternative Name:
DNS:server1.testorg.com
1.2.3.4.5.6.7.8.1:
{"attrs":{"hf.Affiliation":"","hf.EnrollmentID":"orderer1","hf.Type":"orderer"}}
Signature Algorithm: ecdsa-with-SHA256
30:45:02:21:00:e1:93:f6:3c:08:f2:b9:fb:06:c9:02:d0:cf:
e1:a6:23:a3:05:78:10:d9:41:2c:1e:2c:91:80:fd:52:ad:62:
9c:02:20:51:33:42:5e:a0:8a:2a:ec:f5:83:46:f0:99:6a:7e:
eb:a8:97:1f:30:99:9d:ae:8d:ef:36:07:da:bb:67:ed:80
证书续订¶
所有节点和客户端的注册和TLS证书应在到期前续订,以避免服务中断。使用结构CA注册或重新注册功能从颁发结构证书颁发机构(CA)获取更新的证书。重新登记功能允许重用现有私钥,这对于排序节点TLS证书尤其重要。
过期证书的续期¶
证书过期后仍然可以使用reenroll功能续订,但Fabric CA的版本必须为v1.5.5或更高版本,并且必须配置为允许它。在重新注册之前,通过将reenrollignorecertexpiry参数添加到Fabric-CA-server-config.yaml,在Fabric CA服务器上启用reenrollignerecertexpirry选项,如下所示:
ca:
certfile: /crypto/tlsca/cert.pem
chainfile: /crypto/tlsca/chain.pem
keyfile: /crypto/tlsca/key.pem
name: tlsca
reenrollignorecertexpiry: true
或者,还可以使用环境变量或Fabric CA服务器启动标志设置reenrollignorecertexpiry:
- 在CA启动时将FABRIC_CA_SERVER_CA_REENROLLIGNORECERTEXPIRY环境变量设置为true
- 使用标志–ca.reenrollignorecertexpiry=true启动CA
最后,重新启动Fabric CA服务器。
续订Peer节点证书¶
对于Peer节点注册证书和TLS证书,您可以使用Fabric CA客户端的注册或重新注册功能。如果您想通过传递csr.keyrequest.reusekey选项并指示现有私钥的mspdir位置(私钥位于/keystore目录中)来重用私钥,请使用重新滚动:
fabric-ca-client enroll --<OTHER-OPTIONS>
fabric-ca-client reenroll --csr.keyrequest.reusekey --mspdir <LOCATION-OF-IDENTITY'S-MSP-DIRECTORY-THAT-CONTAINS-THE-EXISTING-PRIVATE-KEY> --<OTHER-OPTIONS>
替换Peer节点的登记证书或TLS证书。
Peer节点的注册证书配置在Peer节点的<peer.mspConfigPath>/signcerts目录中(如果私钥未被重用,则新私钥也应在<peer.mspConfigPath>/keystore目录中更新)。
Peer节点的TLS证书配置为位于Peer节点的<peer.TLS.cert.file>目录/文件中(如果未重用私钥,则还应在<peer.TLS.key.file>中更新新私钥)。
最后,重新启动Peer节点。
续订排序节点证书¶
对于排序节点注册证书,您还可以使用注册或重新注册功能,使用上面针对Peer节点描述的步骤。
排序节点TLS证书必须重新启用,并具有重新使用私钥的选项。这是由于在应用程序通道中配置了排序节点TLS证书(使用配置的TLS证书中的公钥验证排序节点到排序节点的通信)。从v1.4.9和v2.2.1开始,排序节点验证匹配的密钥,而不是整个配置的TLS证书,从而无需更新通道配置即可续订排序节点TLS证书。
通过传递csr.keyrequest.reusekey选项并指示现有私钥的mspdir位置(私钥位于<mspdir>/keystore目录中),使用重新滚动并重用TLS证书的私钥:
fabric-ca-client reenroll --csr.keyrequest.reusekey --mspdir <LOCATION-OF-IDENTITY'S-MSP-DIRECTORY-THAT-CONTAINS-THE-EXISTING-PRIVATE-KEY> --<OTHER-OPTIONS>`
替换排序节点的注册证书或TLS证书。
排序节点的注册证书配置在排序节点的<General.LocalMSPDir>/signcerts目录中(如果未重用私钥,则还应在<General.LegalMSPDir>/keystore目录中更新新私钥)。
排序节点的TLS证书配置为位于排序节点的<General.TLS.Certifice>目录/文件中(由于私钥已被重用,因此不要更新私钥)。
重新启动排序节点节点。
续订排序节点TLS证书而不重复使用私钥¶
虽然建议在排序节点TLS证书续订时重复使用私钥,但这可能并非在所有情况下都可行。由于必须为新的排序节点TLS证书更新每个排序服务通道,因此需要额外的步骤和计划。
假设您在重新注册期间没有重用排序节点TLS私钥,并且原始排序节点TLS证书尚未过期。在这种情况下,您必须在每个节点和每个通道配置中一次更新一个排序节点TLS证书,然后在转到其他排序节点TLS证书更新之前验证排序节点功能。
如果您不重用排序节点TLS私钥,并且原始排序节点TLS证书已过期,排序服务将无法形成共识,因此将无法处理包括通道配置更新在内的交易。排序服务恢复过程很复杂,因为您必须在所有节点上临时使用排序节点TLSHandshakeTimeShift属性并重新启动它们,以便与过期的证书形成共识,以便处理通道配置更新以更新TLS证书。在每个节点和通道配置中一次更新大多数排序节点TLS证书(例如,5个中有3个)。一旦更新了大多数证书,新证书的到期日期将不再属于TLSH和握手时间偏移范围,因此更新的排序节点将脱离一致性集合,导致再次失去一致性。接下来,从所有节点中删除TLSHandshakeTimeShift设置。重新启动后,大多数更新的排序节点现在将形成共识,然后您可以在每个节点和通道配置中一次更新剩余的排序节点TLS证书(例如,5个中有2个)。
引用
- https://hyperledger-fabric.readthedocs.io/en/latest/certs_management.html?highlight=Fabric CA
- https://hyperledger-fabric-ca.readthedocs.io/en/latest/deployguide/use_CA.html#enroll-an-identity
- https://hyperledger-fabric.readthedocs.io/en/latest/identity/identity.html?highlight=Identity#a-simple-scenario-to-explain-the-use-of-an-identity
- 华为区块链服务:https://support.huaweicloud.com/devg-bcs/bcs_devg_0038.html