Hyperledger Fabric CA 是Hyperledger Fabric的证书颁发机构(CA).
它提供以下功能:
- 注册身份,或连接到LDAP作为用户注册表
- 颁发注册证书(ECerts)
- 证书续订和吊销
Hyperledger Fabric CA 由服务器和客户端组件组成,如本文档后面所述。
对于有兴趣参与Hyperledger Fabric CA的开发人员,请参阅Fabric CA 存储库了解更多信息。
目录
概述
下图说明了HyperledgerFabric CA服务器如何适应整个Hyperledger结构体系结构。
有两种与HyperledgerFabric CA服务器交互的方式:通过HyperledgerFabric CA客户端或通过其中一个结构SDK。到HyperledgerFabric CA服务器的所有通信都是通过REST API进行的。请参阅fabric ca/swagger/swagger-fabric-ca.json以获取这些RESTAPI的swagger文档. 您可以通过 Swagger online editor.
Hyperledger Fabric CA客户端或SDK可以连接到Hyperledger Fabric CA服务器群集中的服务器。图的右上部分对此进行了说明。客户端路由到HA代理端点,该端点将流量负载平衡到Fabric CA服务器集群成员之一。
集群中的所有HyperledgerFabric CA服务器共享相同的数据库,以跟踪身份和证书。如果配置了LDAP,则标识信息保存在LDAP中,而不是数据库中。
一台服务器可能包含多个CA。每个CA都是根CA或中间CA。每个中间CA都有一个父CA,它是根CA或另一个中间CA。
快速入门
先决条件
- Go 1.10+ 安装
GOPATH
环境变量设置正确- 已安装libtool和libtdhl dev包
以下内容将在Ubuntu上安装libtool依赖项:
sudo apt install libtool libltdl-dev
以下内容将在MacOSX上安装libtool依赖项:
brew install libtool
笔记
如果通过自制程序安装libtool,则在MacOSX上不需要libtldl dev
有关libtool的更多信息,请参见 https://www.gnu.org/software/libtool.
有关libltdl dev的更多信息,请参阅https://www.gnu.org/software/libtool/manual/html_node/Using-libltdl.html.
安装
下面将在$GOPATH/bin中安装Fabric CA服务器和Fabric CA客户端二进制文件。
go get -u github.com/hyperledger/fabric-ca/cmd/...
注意:如果您已经克隆了fabric ca存储库,请确保您在运行上面的“go-get”命令之前位于主分支上。否则,您可能会看到以下错误:
<gopath>/src/github.com/hyperledger/fabric-ca; git pull --ff-only
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=<remote>/<branch> tlsdoc
package github.com/hyperledger/fabric-ca/cmd/fabric-ca-client: exit status 1
以本机方式启动服务器
以下内容使用默认设置启动Fabric CA服务器。
fabric-ca-server start -b admin:adminpw
b选项为引导程序管理员提供注册ID和密码;如果未使用“LDAP.enabled”设置启用LDAP,则需要此选项。
名为fabric ca server config的默认配置文件。yaml是在可以自定义的本地目录中创建的。
通过Docker启动服务器
Docker Hub
Go to: https://hub.docker.com/r/hyperledger/fabric-ca/tags/
查找与要提取的Fabric CA的体系结构和版本匹配的标记。
创建docker compose。类似下面的yml文件。更改iamge以反映以前找到的标记。
fabric-ca-server:
image: hyperledger/fabric-ca:amd64-1.4.7
container_name: fabric-ca-server
ports:
- "7054:7054"
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
volumes:
- "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"
command: sh -c 'fabric-ca-server start -b admin:adminpw'
在docker compose所在的目录中打开一个终端。yml文件并执行以下操作:
# docker-compose up -d
这将下拉组合文件中指定的Fabric CA映像(如果该映像不存在),并启动Fabric CA服务器的实例。
构建自己的Docker镜像
您可以通过Docker Compose构建并启动服务器,如下所示。
cd $GOPATH/src/github.com/hyperledger/fabric-ca
make docker
cd docker/server
docker-compose up -d
hyperledger/fabric ca Docker映像包含fabric ca服务器和fabric ca客户端。
# cd $GOPATH/src/github.com/hyperledger/fabric-ca
# FABRIC_CA_DYNAMIC_LINK=true make docker
# cd docker/server
# docker-compose up -d
探索Fabric CA CLI
为了方便起见,本节仅提供Fabric CA服务器和客户端的使用消息。以下部分提供了其他使用信息。
以下链接显示 Server Command Line 和 Client Command Line.
笔记
请注意,可以通过使用逗号分隔的列表元素指定选项或多次指定选项(每个选项都有组成列表的字符串值)来指定作为字符串片段(列表)的命令行选项。 例如,为“csr”指定“host1”和“host2”。hosts选项,您可以传递“-csr”。主机“host1、host2”或“--csr”。主机host1--csr。主机主机2`。使用前一种格式时,请确保在任何逗号之前或之后没有空格。
配置设置
Fabric CA提供了3种在Fabric CA服务器和客户端上配置设置的方法。优先顺序为:
- CLI标志
- 环境变量
- 配置文件
在本文档的其余部分中,我们将提到对配置文件进行更改。但是,可以通过环境变量或CLI标志覆盖配置文件更改。
例如,如果客户端配置文件中包含以下内容:
tls:
# Enable TLS (default: false)
enabled: false
# TLS for the client's listenting port (default: false)
certfiles:
client:
certfile: cert.pem
keyfile:
以下环境变量可用于覆盖配置文件中的“cert.pem”设置:
export FABRIC_CA_CLIENT_TLS_CLIENT_CERTFILE=cert2.pem
如果我们想覆盖环境变量和配置文件,我们可以使用命令行标志。
fabric-ca-client enroll --tls.client.certfile cert3.pem
同样的方法也适用于fabric ca server,除了使用 FABRIC_CA_CLIENT
作为环境变量的前缀之外,还使用了FABRIC_CA_SERVER
文件路径上的字
Fabric CA服务器和客户端配置文件中指定文件名的所有属性都支持相对路径和绝对路径。相对路径相对于配置文件所在的配置目录。 例如,如果config目录为“/config”,tls部分如下所示,则Fabric CA服务器或客户端将查找“root”。“/config”目录中的pem文件、“~/config/certs”目录中的'cert.pem
文件和'key。“/abs/path”目录中的pem`文件
tls:
enabled: true
certfiles:
- root.pem
client:
certfile: certs/cert.pem
keyfile: /abs/path/key.pem
Fabric CA 服务器
本节介绍Fabric CA服务器。
您可以在启动Fabric CA服务器之前对其进行初始化。这为您提供了一个生成默认配置文件的机会,可以在启动服务器之前查看和自定义该文件。
-
Fabric CA服务器的主目录确定如下:
如果设置了–home命令行选项,请使用其值,否则, 如果设置了
FABRIC_CA_SERVER_HOME
环境变量,请使用其值,否则, 如果设置了FABRIC_CA_HOME
环境变量, 使用其值,否则, 如果设置了CA_CFG_PATH
环境变量,请使用其值否则,请使用当前工作目录
对于本服务器部分的其余部分,我们假设您已将FABRIC_CA_HOME
环境变量设置为$HOME/fabric-ca/server
。
以下说明假定服务器配置文件存在于服务器的主目录中。
正在初始化服务器
按如下方式初始化Fabric CA服务器:
fabric-ca-server init -b admin:adminpw
禁用LDAP时,初始化需要“-b”(引导标识)选项。启动Fabric CA服务器至少需要一个引导标识;此标识是服务器管理员。
服务器配置文件包含可以配置的证书签名请求(CSR)部分。以下是CSR示例。
cn: fabric-ca-server
names:
- C: US
ST: "North Carolina"
L:
O: Hyperledger
OU: Fabric
hosts:
- host1.example.com
- localhost
ca:
expiry: 131400h
pathlength: 1
以上所有字段都与“fabric ca server init”生成的X.509签名密钥和证书有关。这对应于服务器配置文件中的“ca.certfile”和“ca.keyfile”文件。字段如下所示:
- cn 是通用名称
- O 是组织名称
- OU 是组织单位
- L 是地点还是城市
- ST 是州政府
- C 是国家
如果需要CSR的自定义值,可以自定义配置文件,删除“ca.certfile”和“ca.keyfile”配置项指定的文件,然后再次运行“fabric ca server init-b admin:adminpw”命令。
“fabric ca server init”命令生成自签名ca证书,除非指定了“-u<parent fabric ca server URL>”选项。如果指定了“-u”,则服务器的CA证书由父Fabric CA服务器签名。为了向父Fabric CA服务器进行身份验证,URL的格式必须为“<scheme>://<enrollmentID>:<secret>@<host>:<port>”,其中<enrollmentID>和<secret>对应一个带有“hf”的标识。“IntermediateCA”属性,其值等于“true”。“fabric ca server init”命令还生成名为**fabric ca server config**的默认配置文件。服务器主目录中的yaml。
如果希望Fabric CA服务器使用您提供的CA签名证书和密钥文件,则必须将文件分别放置在“CA.certfile”和“CA.keyfile”引用的位置。这两个文件都必须是PEM编码的,不能加密。更具体地说,CA证书文件的内容必须以“-----BEGIN CERTIFICATE-----
开头,密钥文件的内容必须以-----BEGIN PRIVATE KEY-----
开头,而不是以-----BEGIN ENCRYPTED PRIVATE KEY-----
开头。
算法和密钥大小
可以自定义CSR以生成支持椭圆曲线(ECDSA)的X.509证书和密钥。以下设置是使用曲线“prime256v1”和签名算法“ECDSA-with-SHA256”实现椭圆曲线数字签名算法(ECDSA)的示例:
key:
algo: ecdsa
size: 256
算法和密钥大小的选择基于安全需求。
椭圆曲线(ECDSA)提供以下密钥大小选项:
大小 | ASN1 OID | 签名算法 |
---|---|---|
256 | prime256v1 | ecdsa-with-SHA256 |
384 | secp384r1 | ecdsa-with-SHA384 |
启动服务器
按如下方式启动Fabric CA服务器:
fabric-ca-server start -b <admin>:<adminpw>
如果服务器之前尚未初始化,它将在第一次启动时进行初始化。在此初始化过程中,服务器将生成ca-cert.pem和ca密钥。pem文件,如果它们还不存在,也将创建默认配置文件(如果不存在)。 请参见 初始化Fabric CA服务器 部分.
除非Fabric CA服务器配置为使用LDAP,否则必须使用至少一个预注册的引导标识对其进行配置,以便您能够注册和注册其他标识。“-b”选项指定引导标识的名称和密码。
要使Fabric CA服务器侦听“https”而不是“http”,请设置“tls”。已启用“至”true“。
安全警告:Fabric CA服务器应始终在启用TLS的情况下启动(“TLS.enabled”设置为true)。否则,服务器容易受到攻击者的攻击,从而无法访问网络流量。
要限制同一个密钥(或密码)可用于注册的次数,请设置注册表。将配置文件中的maxenrollments设置为适当的值。如果将该值设置为1,则Fabric CA服务器只允许对特定注册ID使用一次密码。如果将该值设置为-1,Fabric CA服务器对可重复使用密码进行注册的次数没有限制。默认值为-1。将该值设置为0,Fabric CA服务器将禁用所有标识的注册,并且不允许注册标识。
Fabric CA服务器现在应该正在侦听端口7054。
您可以跳到 Fabric CA客户端 如果不想将Fabric CA服务器配置为在群集中运行或使用LDAP,请参阅第节。
配置数据库
本节介绍如何配置Fabric CA服务器以连接到PostgreSQL或MySQL数据库。默认数据库为SQLite,默认数据库文件为“fabric ca server”。db`位于Fabric CA服务器的主目录中。
如果您不关心在集群中运行Fabric CA服务器,则可以跳过此部分;否则,您必须按照如下所述配置PostgreSQL或MySQL。Fabric CA在群集设置中支持以下数据库版本:
- PostgreSQL: 9.5.5 or later
- MySQL: 5.7 or later
PostgreSQL
为了连接到PostgreSQL数据库,可以将以下示例添加到服务器的配置文件中。请确保适当地自定义各种值。数据库名称中允许的字符有限制。有关更多信息,请参阅以下Postgres文档:https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
db:
type: postgres
datasource: host=localhost port=5432 user=Username password=Password dbname=fabric_ca sslmode=verify-full
指定sslmode可配置SSL身份验证的类型。sslmode的有效值为:
模式 | 描述 |
---|---|
disable | 无SSL |
require | 始终SSL(跳过验证) |
verify-ca | 始终 SSL(验证服务器提供的证书是否由受信任的CA签名) |
verify-full | 与验证ca相同,并验证服务器提供的证书是否由受信任的ca签名,以及服务器主机名是否与证书中的主机名匹配 |
如果要使用TLS,请使用“db”。必须指定Fabric CA服务器配置文件中的tls `节。如果在PostgreSQL server上启用了SSL客户端身份验证,则还必须在数据库中指定客户端证书和密钥文件。tls。“客户”部分。下面是“db”的一个示例。tls章节:
db:
...
tls:
enabled: true
certfiles:
- db-server-cert.pem
client:
certfile: db-client-cert.pem
keyfile: db-client-key.pem
certfiles - PEM编码的受信任根证书文件的列表。
certfile and keyfile - Fabric CA服务器用于与PostgreSQL服务器安全通信的PEM编码证书和密钥文件
PostgreSQL SSL配置
在PostgreSQL server上配置SSL的基本说明:
- 在postgresql中。conf,取消对SSL的注释并设置为“on”(SSL=on)
- 将证书和密钥文件放在PostgreSQL数据目录中。
生成自签名证书的说明:https://www.postgresql.org/docs/9.5/static/ssl-tcp.html
注意:自签名证书用于测试目的,不应在生产环境中使用
PostgreSQL Server-需要客户端证书
- 将您信任的证书颁发机构(CA)的证书放在文件根目录中。PostgreSQL数据目录中的crt
- 在postgresql中。conf,将“ssl_ca_file”设置为指向客户端的根证书(ca cert)
- 在pg hba.conf中适当的hostssl行上将clientcert参数设置为1。
有关在PostgreSQL server上配置SSL的更多详细信息,请参阅以下PostgreSQL文档: https://www.postgresql.org/docs/9.4/static/libpq-ssl.html
MySQL
为了连接到MySQL数据库,可以将以下示例添加到Fabric CA server配置文件中。请确保适当地自定义各种值。数据库名称中允许的字符有限制。有关更多信息,请参阅以下MySQL文档:https://dev.mysql.com/doc/refman/5.7/en/identifiers.html
在MySQL 5.7上。十、 某些模式会影响服务器是否允许“0000-00-00”作为有效日期。可能有必要放松MySQL服务器使用的模式。我们希望允许服务器能够接受零日期值。
在my.cnf中,找到配置选项sql模式并删除NO ZERO DATE如果存在。进行此更改后重新启动MySQL服务器。
请参考以下关于不同可用模式的MySQL文档,并为正在使用的MySQL的特定版本选择适当的设置。
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
db:
type: mysql
datasource: root:rootpw@tcp(localhost:3306)/fabric_ca?parseTime=true&tls=custom
如果通过TLS连接到MySQL Server,则需要如上** PostgreSQL **部分所述“ db.tls.client”部分。
MySQL SSL配置
MySQL服务器上配置SSL的基本说明:
-
为服务器打开或创建my.cnf文件。在[mysqld]部分添加或取消注释下面的行。它们应该指向服务器的密钥和证书,以及根CA证书。
有关创建服务器和客户端证书的说明:http://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html
[mysqld] ssl-ca=ca-cert.pem ssl-cert=server-cert.pem ssl-key=server-key.pem
可以运行以下查询以确认已启用SSL。
mysql> SHOW GLOBAL VARIABLES LIKE ‘have_%ssl’;
Should see:
Variable_name Value have_openssl YES have_ssl YES -
服务器端SSL配置完成后,下一步是创建一个有权通过SSL访问MySQL服务器的用户。为此,请登录MySQL服务器,然后键入:
mysql> GRANT ALL PRIVILEGES ON . TO ‘ssluser’@’%’ IDENTIFIED BY ‘password’ REQUIRE SSL; mysql> FLUSH PRIVILEGES;
如果要指定用户访问服务器的特定IP地址,请将“%”更改为特定IP地址。
MySQL服务器-需要客户端证书
安全连接选项与服务器端使用的选项类似。
- ssl ca标识证书颁发机构(ca)证书。如果使用此选项,则必须指定服务器使用的相同证书。
- ssl证书标识MySQL服务器的证书.
- ssl密钥标识MySQL服务器的私钥.
假设您希望使用一个帐户进行连接,该帐户没有特殊的加密要求,或者是使用包含REQUIRE SSL选项的GRANT语句创建的。作为一组推荐的安全连接选项,启动MySQL服务器时至少使用ssl-cert和ssl-key选项。然后设置' db.tls。并启动Fabric CA服务器。
为了要求还指定客户端证书,请使用require x509选项创建帐户。然后,客户端还必须指定适当的客户端密钥和证书文件;否则,MySQL Server将拒绝连接。要为Fabric CA服务器指定客户端密钥和证书文件,请设置db.tls.client.certfile
和db.tls.client.keyfile
配置属性''。
配置 LDAP
Fabric CA 服务器可以配置为从 LDAP 服务器读取。
特别是,Fabric CA 服务器可以连接到 LDAP 服务器以执行以下操作:
- 在注册之前验证身份
- 检索用于授权的身份属性值。
修改 Fabric CA 服务器配置文件的 LDAP 部分,将服务器配置为连接到 LDAP 服务器。
ldap:
# Enables or disables the LDAP client (default: false)
enabled: false
# The URL of the LDAP server
url: <scheme>://<adminDN>:<adminPassword>@<host>:<port>/<base>
userfilter: <filter>
attribute:
# 'names' is an array of strings that identify the specific attributes
# which are requested from the LDAP server.
names: <LDAPAttrs>
# The 'converters' section is used to convert LDAP attribute values
# to fabric CA attribute values.
#
# For example, the following converts an LDAP 'uid' attribute
# whose value begins with 'revoker' to a fabric CA attribute
# named "hf.Revoker" with a value of "true" (because the expression
# evaluates to true).
# converters:
# - name: hf.Revoker
# value: attr("uid") =~ "revoker*"
#
# As another example, assume a user has an LDAP attribute named
# 'member' which has multiple values of "dn1", "dn2", and "dn3".
# Further assume the following configuration.
# converters:
# - name: myAttr
# value: map(attr("member"),"groups")
# maps:
# groups:
# - name: dn1
# value: client
# - name: dn2
# value: peer
# The value of the user's 'myAttr' attribute is then computed to be
# "client,peer,dn3". This is because the value of 'attr("member")' is
# "dn1,dn2,dn3", and the call to 'map' with a 2nd argument of
# "group" replaces "dn1" with "client" and "dn2" with "peer".
converters:
- name: <fcaAttrName>
value: <fcaExpr>
maps:
<mapName>:
- name: <from>
value: <to>
Where:
scheme
是 ldap 或 ldaps 之一;adminDN
是管理员用户的专有名称;pass
是管理员用户的密码;host
是 LDAP 服务器的主机名或 IP 地址;port
是可选端口号,其中 ldap 的默认值为 389,ldaps 的默认值为 636;base
是用于搜索的 LDAP 树的可选根;filter
是在搜索将登录用户名转换为专有名称时使用的过滤器。 例如,(uid=%s)
的值会搜索具有uid
属性值的 LDAP 条目,该属性的值是登录用户名。 类似地,(email=%s)
可用于使用电子邮件地址登录。LDAPAttrs
是代表用户从 LDAP 服务器请求的 LDAP 属性名称数组;- attribute.converters 部分用于将 LDAP 属性转换为结构 CA 属性,其中 *
fcaAttrName
是结构 CA 属性的名称; *fcaExpr
是一个表达式,其评估值分配给结构 CA 属性。 例如,假设 LDAPAttrs 是 [“uid”],fcaAttrName 是‘hf.Revoker’,fcaExpr 是‘attr(“uid”) =~ “revoker*”’。 这意味着代表用户从 LDAP 服务器请求一个名为“uid”的属性。 如果用户的“uid”LDAP 属性的值以“revoker”开头,则用户的“hf.Revoker”属性的值为“true”; 否则,用户的“hf.Revoker”属性值为“false”。- attribute.maps 部分用于映射 LDAP 响应值。 典型用例是将与 LDAP 组关联的专有名称映射到身份类型。
LDAP 表达式语言使用 govaluate 包,如在https://github.com/Knetic/govaluate/blob/master/MANUAL.md. 这定义了诸如“=~”之类的运算符和诸如“revoker*”之类的文字,这是一个正则表达式。 扩展基本 govaluate 语言的特定于 LDAP 的变量和函数如下:
DN
是一个变量,等于用户的专有名称。affiliation
是一个变量,等于用户的隶属关系。attr
是一个接受 1 或 2 个参数的函数。 第一个参数是 LDAP 属性名称。 第二个参数是一个分隔字符串,用于将多个值连接成一个字符串; 默认分隔符字符串是“,”。attr
函数总是返回一个“string”类型的值。map
是一个接受 2 个参数的函数。 第一个参数是任何字符串。 第二个参数是映射的名称,用于对第一个参数的字符串执行字符串替换。if
是一个接受 3 个参数的函数,其中第一个参数必须解析为布尔值。 如果计算结果为真,则返回第二个参数; 否则,返回第三个参数。
例如,如果用户具有以“O=org1,C=US”结尾的专有名称,或者如果用户具有以“org1.dept2”开头的从属关系,则以下表达式的计算结果为真。 并且还具有“true”的“admin”属性。
DN =~ “*O=org1,C=US” || (affiliation =~ “org1.dept2.*” && attr(‘admin’) = ‘true’)
注意:由于 attr
函数总是返回“字符串”类型的值,所以不能使用数字运算符来构造表达式。 例如,以下不是有效的表达式:
value: attr("gidNumber") >= 10000 && attr("gidNumber") < 10006
或者,如下所示的用引号括起来的正则表达式可用于返回等效结果:
value: attr("gidNumber") =~ "1000[0-5]$" || attr("mail") == "root@example.com"
以下是 OpenLDAP 服务器的默认设置的示例配置部分,其 Docker 映像位于 https://github.com/osixia/docker-openldap
。
ldap:
enabled: true
url: ldap://cn=admin,dc=example,dc=org:admin@localhost:10389/dc=example,dc=org
userfilter: (uid=%s)
有关启动 OpenLDAP Docker 映像、配置它、在 FABRIC_CA/cli/server/ldap/ldap_test.go
中运行 LDAP 测试并停止 OpenLDAP 服务器的脚本,请参阅FABRIC_CA/scripts/run-ldap-tests
。
配置 LDAP 后,注册工作如下:
- Fabric CA 客户端或客户端 SDK 发送带有基本授权标头的注册请求。
- Fabric CA 服务器接收到注册请求,解码授权标头中的身份名称和密码,使用配置文件中的“userfilter”查找与身份名称关联的 DN(可分辨名称),然后尝试使用 LDAP 绑定 身份的密码。 如果 LDAP 绑定成功,则注册处理被授权并且可以继续。
设置集群
您可以使用任何 IP Sprayer 对 Fabric CA 服务器集群进行负载平衡。 本节提供了一个示例,说明如何设置 Haproxy 以路由到 Fabric CA 服务器集群。 请务必更改主机名和端口以反映 Fabric CA 服务器的设置。
haproxy.conf
global
maxconn 4096
daemon
defaults
mode http
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
listen http-in
bind *:7054
balance roundrobin
server server1 hostname1:port
server server2 hostname2:port
server server3 hostname3:port
注意:如果使用 TLS,需要使用 mode tcp
。
设置多个 CA
默认情况下,fabric-ca 服务器由一个默认 CA 组成。 但是,可以使用 cafiles 或 cacount 配置选项将其他 CA 添加到单个服务器。 每个额外的 CA 都有自己的主目录。
cacount:
cacount 提供了一种快速启动 X 数量的默认附加 CA 的方法。 主目录将相对于服务器目录。 使用此选项,目录结构将如下所示:
--<Server Home>
|--ca
|--ca1
|--ca2
每个额外的 CA 都会在其主目录中生成一个默认配置文件,在配置文件中它将包含一个唯一的 CA 名称。
例如,以下命令将启动 2 个默认 CA 实例:
fabric-ca-server start -b admin:adminpw --cacount 2
cafiles:
如果在使用 cafiles 配置选项时未提供绝对路径,CA 主目录将相对于服务器目录。
要使用此选项,必须已为每个要启动的 CA 生成和配置 CA 配置文件。 每个配置文件必须有唯一的 CA 名称和通用名称 (CN),否则服务器将无法启动,因为这些名称必须是唯一的。 CA 配置文件将覆盖任何默认 CA 配置,并且 CA 配置文件中任何缺失的选项都将替换为默认 CA 中的值。
优先顺序如下:
- CA 配置文件
- 默认 CA CLI 标志
- 默认 CA 环境变量
- 默认 CA 配置文件
CA 配置文件必须至少包含以下内容:
ca:
# Name of this CA
name: <CANAME>
csr:
cn: <COMMONNAME>
您可以按如下方式配置目录结构:
--<Server Home>
|--ca
|--ca1
|-- fabric-ca-config.yaml
|--ca2
|-- fabric-ca-config.yaml
例如,以下命令将启动两个自定义 CA 实例:
fabric-ca-server start -b admin:adminpw --cafiles ca/ca1/fabric-ca-config.yaml
--cafiles ca/ca2/fabric-ca-config.yaml
注册中间 CA
为了为中间 CA 创建 CA 签名证书,中间 CA 必须向父 CA 注册,其方式与 fabric-ca-client 向 CA 注册的方式相同。 这是通过使用 -u 选项指定父 CA 的 URL 以及注册 ID 和密码来完成的,如下所示。 与此注册 ID 关联的身份必须具有名称为“hf.IntermediateCA”且值为“true”的属性。 颁发证书的 CN(或通用名称)将设置为注册 ID。 如果中间 CA 尝试显式指定 CN 值,则会发生错误。
fabric-ca-server start -b admin:adminpw -u http://<enrollmentID>:<secret>@<parentserver>:<parentport>
对于其他中间 CA 标志,请参阅 Fabric CA 服务器的配置文件格式部分。
升级服务器
在升级 Fabric CA 客户端之前,必须先升级 Fabric CA 服务器。 升级前建议备份当前数据库:
- 如果使用 sqlite3,请备份当前数据库文件(默认名为 fabric-ca-server.db)。
- 对于其他数据库类型,请使用适当的备份/复制机制。
升级 Fabric CA 服务器的单个实例:
-
停止 fabric-ca-server 进程。
-
确保当前数据库已备份。
-
用升级版本替换以前的 fabric-ca-server 二进制文件。
-
启动 fabric-ca-server 进程。
-
使用以下命令验证 fabric-ca-server 进程是否可用,其中 host 是启动服务器的主机名:
fabric-ca-client getcainfo -u http://<host>:7054
升级集群:
要使用 MySQL 或 Postgres 数据库升级 fabric-ca-server 实例集群,请执行以下过程。 我们假设您正在使用 haproxy 分别对 host1 和 host2 上的两个 fabric-ca-server 集群成员进行负载平衡,这两个成员都在侦听端口 7054。在此过程之后,您将对升级后的 fabric-ca-server 集群成员进行负载平衡 分别在 host3 和 host4 上,都侦听端口 7054。
为了使用 haproxy stats 监控更改,请启用统计信息收集。 将以下行添加到 haproxy 配置文件的 global 部分:
stats socket /var/run/haproxy.sock mode 666 level operator
stats timeout 2m
重新启动 haproxy 以获取更改:
# haproxy -f <configfile> -st $(pgrep haproxy)
要显示来自 haproxy “show stat” 命令的摘要信息,以下函数可能对解析返回的大量 CSV 数据很有用:
haProxyShowStats() {
echo "show stat" | nc -U /var/run/haproxy.sock |sed '1s/^# *//'|
awk -F',' -v fmt="%4s %12s %10s %6s %6s %4s %4s\n" '
{ if (NR==1) for (i=1;i<=NF;i++) f[tolower($i)]=i }
{ printf fmt, $f["sid"],$f["pxname"],$f["svname"],$f["status"],
$f["weight"],$f["act"],$f["bck"] }'
}
-
最初,您的 haproxy 配置文件类似于以下内容:
server server1 host1:7054 check server server2 host2:7054 check
将此配置更改为以下内容:
server server1 host1:7054 check backup server server2 host2:7054 check backup server server3 host3:7054 check server server4 host4:7054 check
-
使用新配置重新启动 HA 代理,如下所示:
haproxy -f <configfile> -st $(pgrep haproxy)
"haProxyShowStats"
现在将反映修改后的配置,有两个活动的旧版本备份服务器和两个(尚未启动)升级的服务器:sid pxname svname status weig act bck 1 fabric-cas server3 DOWN 1 1 0 2 fabric-cas server4 DOWN 1 1 0 3 fabric-cas server1 UP 1 0 1 4 fabric-cas server2 UP 1 0 1
-
在 host3 和 host4 上安装升级的 fabric-ca-server 二进制文件。 host3 和 host4 上的新升级服务器应配置为使用与 host1 和 host2 上的旧服务器相同的数据库。 启动升级的服务器后,数据库将自动迁移。 haproxy 会将所有新流量转发到升级的服务器,因为它们没有配置为备份服务器。 在继续之前,使用“fabric-ca-client getcainfo”命令验证您的集群仍然正常运行。 此外,
"haProxyShowStats"
现在应该反映所有服务器都处于活动状态,类似于以下内容:sid pxname svname status weig act bck 1 fabric-cas server3 UP 1 1 0 2 fabric-cas server4 UP 1 1 0 3 fabric-cas server1 UP 1 0 1 4 fabric-cas server2 UP 1 0 1
-
停止 host1 和 host2 上的旧服务器。 在继续之前,使用“fabric-ca-client getcainfo”命令验证您的新集群仍然正常运行。 然后从 haproxy 配置文件中删除旧的服务器备份配置,使其看起来类似于以下内容:
server server3 host3:7054 check server server4 host4:7054 check
-
使用新配置重新启动 HA 代理,如下所示:
haproxy -f <configfile> -st $(pgrep haproxy)
"haProxyShowStats"
现在将反映修改后的配置,两个活动服务器已升级到新版本:sid pxname svname status weig act bck 1 fabric-cas server3 UP 1 1 0 2 fabric-cas server4 UP 1 1 0
运营服务
CA 服务器托管一个提供 RESTful “操作” API 的 HTTP 服务器。 此 API 旨在供运营商使用,而不是网络的管理员或“用户”。
API 公开了以下功能:
操作指标的 Prometheus 目标(配置时)
配置操作服务
操作服务需要两个基本配置:
要监听的 address 和 port。 TLS 证书 和 keys 用于身份验证和加密。 请注意,这些证书应由单独的专用 CA 生成。 不要使用已为任何渠道中的任何组织生成证书的 CA。
CA 服务器可以在服务器配置文件的“操作”部分进行配置:
operations:
# host and port for the operations server
listenAddress: 127.0.0.1:9443
# TLS configuration for the operations endpoint
tls:
# TLS enabled
enabled: true
# path to PEM encoded server certificate for the operations server
cert:
file: tls/server.crt
# path to PEM encoded server key for the operations server
key:
file: tls/server.key
# require client certificate authentication to access all resources
clientAuthRequired: false
# paths to PEM encoded ca certificates to trust for client authentication
clientRootCAs:
files: []
listenAddress
键定义了操作服务器将监听的主机和端口。 如果服务器应该监听所有地址,则可以省略主机部分。
tls
部分用于指示是否为操作服务启用了 TLS、服务证书和私钥的位置,以及客户端身份验证应该信任的证书颁发机构根证书的位置。 当 clientAuthRequired
为 true
时,客户端将需要提供证书进行身份验证。
运营安全
由于运营服务专注于运营并且有意与 Fabric 网络无关,因此它不使用 Membership Services Provider 进行访问控制。 相反,操作服务完全依赖于带有客户端证书身份验证的双向 TLS。
强烈建议在生产环境中通过将 clientAuthRequired
的值设置为 true
来启用双向 TLS。 使用此配置,客户端需要提供有效证书进行身份验证。 如果客户端不提供证书或服务无法验证客户端的证书,则请求被拒绝。 请注意,如果 clientAuthRequired
设置为 false
,则客户端不需要提供证书; 但是,如果他们这样做了,并且服务无法验证证书,则该请求将被拒绝。
禁用 TLS 时,会绕过授权,任何可以连接到操作端点的客户端都可以使用 API。
指标
Fabric CA 公开的指标可以提供对系统行为的洞察力。 操作员和管理员可以使用此信息更好地了解系统在一段时间内的运行情况。
配置指标
Fabric CA 提供了两种公开指标的方法:基于 Prometheus 的 pull 模型和基于 StatsD 的 push 模型。
Prometheus
典型的 Prometheus 部署通过从检测目标公开的 HTTP 端点请求指标来抓取指标。 由于 Prometheus 负责请求指标,因此它被认为是一个拉取系统。
配置后,Fabric CA 服务器将在操作服务上显示“/metrics”资源。 要启用 Prometheus,请将服务器配置文件中的 provider 值设置为 prometheus
。
metrics:
provider: prometheus
统计数据
StatsD 是一个简单的统计聚合守护进程。 指标被发送到“statsd”守护进程,在那里它们被收集、聚合并推送到后端以进行可视化和警报。 由于此模型需要检测流程将指标数据发送到 StatsD,因此这被视为推送系统。
通过在服务器配置文件的“metrics”部分中将指标提供程序设置为“statsd”,可以将 CA 服务器配置为向 StatsD 发送指标。 statsd
小节还必须配置 StatsD 守护程序的地址、要使用的网络类型(tcp
或 udp
)以及发送指标的频率。 可以指定一个可选的“前缀”来帮助区分指标的来源——例如,区分来自不同服务器的指标——这将被添加到所有生成的指标中。
metrics:
provider: statsd
statsd:
network: udp
address: 127.0.0.1:8125
writeInterval: 10s
prefix: server-0
要查看生成的不同指标,请查看 指标参考。
Fabric CA 客户端
本节介绍如何使用 fabric-ca-client 命令。
-
Fabric CA 客户端的主目录确定如下:
如果设置了 –home 命令行选项,则使用其值,否则,如果设置了
FABRIC_CA_CLIENT_HOME
环境变量,则使用其值,否则,如果设置了FABRIC_CA_HOME
环境变量,则使用其值,否则,如果CA_CFG_PATH
环境变量是 设置,使用它的值否则,使用$HOME/.fabric-ca-client
以下说明假设客户端配置文件存在于客户端的主目录中。
注册引导标识
首先,如果需要,自定义客户端配置文件中的 CSR(证书签名请求)部分。 请注意,“csr.cn”字段必须设置为引导标识的 ID。 默认 CSR 值如下所示:
csr:
cn: <<enrollment ID>>
key:
algo: ecdsa
size: 256
names:
- C: US
ST: North Carolina
L:
O: Hyperledger Fabric
OU: Fabric CA
hosts:
- <<hostname of the fabric-ca-client>>
ca:
pathlen:
pathlenzero:
expiry:
有关字段的说明,请参阅 CSR 字段。
然后运行“fabric-ca-client注册”命令来注册身份。 例如,以下命令通过调用在 7054 端口上本地运行的 Fabric CA 服务器来注册 ID 为 admin 和密码为 adminpw 的身份。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
注册命令将注册证书 (ECert)、相应的私钥和 CA 证书链 PEM 文件存储在 Fabric CA 客户端的“msp”目录的子目录中。 您将看到指示 PEM 文件存储位置的消息。
注册新身份
执行注册请求的身份必须当前已注册,并且还必须具有注册正在注册的身份类型的适当权限。
特别是,Fabric CA 服务器在注册期间会进行三项授权检查,如下所示:
- 注册器(即调用者)必须具有“hf.Registrar.Roles”属性和逗号分隔的值列表,其中一个值等于正在注册的身份类型; 例如,如果注册器具有值为“peer”的“hf.Registrar.Roles”属性,则注册器可以注册 peer 类型的身份,但不能注册 client、admin 或 orderer。
- 注册服务机构的从属关系必须等于被注册身份的从属关系或前缀。 例如,隶属于“a.b”的注册商可以注册隶属于“a.b.c”的身份,但不能注册隶属于“a.c”的身份。 如果身份需要根从属关系,则从属关系请求应该是一个点(“.”),并且注册商还必须具有根从属关系。 如果注册请求中没有指定从属关系,则被注册的身份将被赋予注册商的从属关系。
- 如果满足以下所有条件,注册商可以注册具有属性的身份:
- 仅当注册器拥有该属性并且它是 hf.Registrar.Attributes 属性值的一部分时,注册器才能注册具有前缀“hf.”的 Fabric CA 保留属性。 此外,如果属性是列表类型,那么被注册的属性的值必须等于注册器拥有的值或其子集。 如果属性是布尔类型,则只有当注册商的属性值为“真”时,注册商才能注册该属性。
- 注册自定义属性(即名称不以“hf.”开头的任何属性)要求注册商具有“hf.Registar.Attributes”属性以及正在注册的属性或模式的值。 唯一受支持的模式是结尾带有“”的字符串。 例如,“a.b.”是匹配所有以“a.b.”开头的属性名称的模式。 例如,如果注册商有 hf.Registrar.Attributes=orgAdmin,那么注册商可以从身份中添加或删除的唯一属性是“orgAdmin”属性。
-如果请求的属性名称是“hf.Registrar.Attributes”,则执行附加检查以查看该属性的请求值是否等于注册商的“hf.Registrar.Attributes”值或其子集。 为此,每个请求的值都必须与注册商的“hf.Registrar.Attributes”属性值中的一个值匹配。 例如,如果 'hf.Registrar.Attributes' 的注册商值为 'a.b., x.y.z' 并且请求的属性值为 'a.b.c, x.y.z',则它是有效的,因为 'a.b.c' 匹配 'a.b.' 并且 'x.y.z' 匹配注册商的 'x.y.z' 值。
-
例子:
有效场景:如果注册商具有属性'hf.Registrar.Attributes = a.b., x.y.z'并且正在注册属性'a.b.c',则有效的'a.b.c'匹配'a.b.'。如果注册商具有属性'hf.Registrar.Attributes = a.b., x.y.z' 并且正在注册属性 'x.y.z',它是有效的,因为 'x.y.z' 匹配注册商的 'x.y.z' 值。如果注册商具有属性 'hf.Registrar。 Attributes = a.b., x.y.z' 并且请求的属性值为 'a.b.c, x.y.z',它是有效的,因为 'a.b.c' 匹配 'a.b.' 并且 'x.y.z' 匹配 registrar 的 'x.y.z' 值。如果registrar 具有属性 'hf.Registrar.Roles = peer,client,admin,orderer' 并且请求的属性值为 'peer', 'peer,client,admin,orderer' 或 'client,admin' 它是有效的,因为请求的值等于或注册商值的子集。无效场景:如果注册商具有属性 'hf.Registrar.Attributes = a.b., x.y.z' 并且正在注册属性 'hf.Registar.Attributes = a.b.c, x.y.* ', 它无效,因为请求的属性“x.y.”不是注册商拥有的模式。值 'x.y.' 是 'x.y.z' 的超集。如果注册器具有属性 'hf.Registrar.Attributes = a.b., x.y.z' 并且正在注册属性 'hf.Registar.Attributes = a.b.c, x.y.z, attr1 ',这是无效的,因为注册器的 'hf.Registrar.Attributes' 属性值不包含 'attr1'。如果注册器具有属性 'hf.Registrar.Attributes = a.b., x.y.z' 并且正在注册属性 'a. b' 无效,因为值 'a.b' 不包含在 'a.b.' 中。如果注册器具有属性 'hf.Registrar.Attributes = a.b., x.y.z' 并且正在注册属性 'x.y ',无效,因为'x.y.z'不包含'x.y'。如果注册器具有属性'hf.Registrar.Roles = peer'并且请求的属性值为'peer,client',则无效因为注册商在其 hf.Registrar.Roles 属性的值中没有客户端角色。如果注册商具有属性 'hf.Revoker = false' 并且请求的属性值为 'true',则它是无效的,因为 h f.Revoker 属性是一个布尔属性,注册商对该属性的值不是“true”。
下表列出了可以为身份注册的所有属性。 属性名称区分大小写。
姓名 | 类型 | 描述 |
---|---|---|
hf.Registrar.Roles | List | 允许注册商管理的角色列表 |
hf.Registrar.DelegateRoles | List | 允许注册商为其“hf.Registrar.Roles”属性赋予注册者的角色列表 |
hf.Registrar.Attributes | List | 允许注册商注册的属性列表 |
hf.GenCRL | Boolean | 如果属性值为 true,身份能够生成 CRL |
hf.Revoker | Boolean | 如果属性值为 true,身份能够撤销身份和/或证书 |
hf.AffiliationMgr | Boolean | 如果属性值为 true,身份能够管理从属关系 |
hf.IntermediateCA | Boolean | 如果属性值为 true,则身份能够注册为中间 CA |
注意:注册身份时,您指定属性名称和值的数组。 如果数组指定了多个同名数组元素,则当前只使用最后一个元素。 换句话说,目前不支持多值属性。
以下命令使用 admin 身份的凭据来注册一个新身份,其注册 ID 为“admin2”,隶属关系为“org1.department1”,属性名为“hf.Revoker”,值为“true” ,以及一个名为“admin”的属性,其值为“true”。 “:ecert”后缀意味着默认情况下“admin”属性及其值将被插入到身份的注册证书中,然后可用于做出访问控制决策。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'
打印密码,也称为注册密码。 需要此密码才能注册身份。 这允许管理员注册身份并将注册 ID 和秘密提供给其他人以注册身份。
多个属性可以指定为 –id.attrs 标志的一部分,每个属性必须用逗号分隔。 对于包含逗号的属性值,该属性必须用双引号括起来。 请参见下面的示例。
fabric-ca-client register -d --id.name admin2 --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,client",hf.Revoker=true'
或者
fabric-ca-client register -d --id.name admin2 --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,client"' --id.attrs hf.Revoker=true
您可以通过编辑客户端的配置文件为 register 命令中使用的任何字段设置默认值。 例如,假设配置文件包含以下内容:
id:
name:
type: client
affiliation: org1.department1
maxenrollments: -1
attributes:
- name: hf.Revoker
value: true
- name: anotherAttrName
value: anotherAttrValue
然后,以下命令将注册一个新身份,其注册 ID 为“admin3”,它从命令行获取,其余部分来自配置文件,包括身份类型:“client”,隶属关系:“org1.department1” ,以及两个属性:“hf.Revoker”和“anotherAttrName”。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register --id.name admin3
要注册具有多个属性的身份,需要在配置文件中指定所有属性名称和值,如上所示。
将 maxenrollments 设置为 0 或将其从配置中排除将导致身份被注册以使用 CA 的最大注册值。 此外,正在注册的身份的最大注册值不能超过 CA 的最大注册值。 例如,如果 CA 的最大注册值为 5。任何新身份的值必须小于或等于 5,并且也不能将其设置为 -1(无限注册)。
接下来,让我们注册一个 peer 身份,该身份将用于在下一节中注册 peer。 以下命令注册 peer1 身份。 请注意,我们选择指定自己的密码(或秘密),而不是让服务器为我们生成密码。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw
请注意,从属关系区分大小写,但在服务器配置文件中指定的非叶从属关系除外,它们始终以小写形式存储。 例如,如果服务器配置文件的 affiliations 部分如下所示:
affiliations:
BU1:
Department1:
- Team1
BU2:
- Department2
- Department3
BU1、Department1、BU2 以小写形式存储。 这是因为 Fabric CA 使用 Viper 来读取配置。 Viper 将映射键视为不区分大小写并始终返回小写值。 要使用 Team1 隶属关系注册身份,需要将 bu1.department1.Team1 指定给 –id.affiliation 标志,如下所示:
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register --id.name client1 --id.type client --id.affiliation bu1.department1.Team1
注册peer身份
现在您已经成功注册了peer身份,您现在可以在给定注册 ID 和密码(即上一节中的密码)的情况下注册peer。 这类似于注册引导身份,除了我们还演示了如何使用“-M”选项来填充 Hyperledger Fabric MSP(成员服务提供者)目录结构。
以下命令注册 peer1。 请务必将“-M”选项的值替换为peer的 MSP 目录的路径,即peer的 core.yaml 文件中的“mspConfigPath”设置。 您还可以将 FABRIC_CA_CLIENT_HOME 设置为peer的主目录。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
注册orderer者是相同的,除了 MSP 目录的路径是orderer者的 orderer.yaml 文件中的“LocalMSPDir”设置。
Fabric-ca-server 颁发的所有注册证书都有以下组织单位(或简称“OU”):
- OU 层次结构的根等于身份类型
- 为身份从属关系的每个组成部分添加一个 OU
例如,如果一个身份的类型是 peer 并且它的从属关系是 department1.team1,那么身份的 OU 层次结构(从叶到根)是 OU=team1, OU=department1, OU=peer。
获取身份混合器凭据
Identity Mixer (Idemix) 是一种加密协议套件,用于保护隐私的身份验证和认证属性的传输。 Idemix 允许客户在没有发行人 (CA) 参与的情况下向验证者进行身份验证,并有选择地仅披露验证者所需的那些属性,并且可以这样做而无需在其交易中进行链接。
除了 X509 证书之外,Fabric CA 服务器还可以颁发 Idemix 凭据。 可以通过将请求发送到 /api/v1/idemix/credential
API 端点来请求 Idemix 凭证。 有关此和其他 Fabric CA 服务器 API 端点的更多信息,请参阅 swagger-fabric-ca.json。
Idemix 证书颁发是一个两步过程。 首先,向 /api/v1/idemix/credential
API 端点发送一个空主体的请求,以获取 nonce 和 CA 的 Idemix 公钥。 其次,使用 nonce 和 CA 的 Idemix 公钥创建一个凭证请求,并将正文中包含凭证请求的另一个请求发送到 /api/v1/idemix/credential
API 端点以获取 Idemix 凭证,凭证撤销信息(CRI ),以及属性名称和值。 目前只支持三个属性:
- OU -组织单位的身份。 此属性的值设置为身份的从属关系。 例如,如果身份的从属关系为 dept1.unit1,则 OU 属性设置为 dept1.unit1
- IsAdmin - 身份是否为管理员。 此属性的值设置为 isAdmin 注册属性的值。
- EnrollmentID - 身份的注册ID
您可以参考 https://github.com/hyperledger/fabric-ca/blob/main/lib/client.go 中的 handleIdemixEnroll 函数,了解获取 Idemix 凭证的两步过程的参考实现。
/api/v1/idemix/credential
API 端点接受基本和令牌授权标头。 基本授权标头应包含用户的注册 ID 和密码。 如果身份已经有 X509 注册证书,也可以用来创建令牌授权头。
请注意,Hyperledger Fabric 将支持客户端使用 X509 和 Idemix 凭证签署交易,但仅支持peer和orderer者身份的 X509 凭证。 和以前一样,应用程序可以使用 Fabric SDK 向 Fabric CA 服务器发送请求。 SDK 隐藏了与创建授权标头和请求有效负载以及处理响应相关的复杂性。
获取 Idemix CRI(证书吊销信息)
Idemix CRI(证书撤销信息)的目的类似于 X509 CRL(证书撤销列表):撤销之前发布的内容。 但是,存在一些差异。
在 X509 中,颁发者吊销最终用户的证书,其 ID 包含在 CRL 中。 验证者检查用户的证书是否在 CRL 中,如果是,则返回授权失败。 最终用户不参与此撤销过程,除了收到来自验证者的授权错误。
在 Idemix 中,最终用户参与其中。 颁发者吊销最终用户的证书,类似于 X509,并且此吊销的证据记录在 CRI 中。 CRI 提供给最终用户(又名“证明者”)。 然后,最终用户会生成一个证明,证明他们的证书没有根据 CRI 被撤销。 最终用户将此证明提供给根据 CRI 验证证明的验证者。 为了验证成功,最终用户和验证者使用的 CRI 版本(称为“epoch”)必须相同。 可以通过向 /api/v1/idemix/cri
API 端点发送请求来请求最新的 CRI。
当 fabric-ca-server 接收到注册请求并且撤销句柄池中没有剩余的撤销句柄时,CRI 的版本会增加。 在这种情况下,fabric-ca-server 必须生成一个新的撤销句柄池,这会增加 CRI 的纪元。 撤销句柄池中的撤销句柄数可通过“idemix.rhpoolsize”服务器配置属性进行配置。
重新注册身份
假设您的注册证书即将到期或已被泄露。 您可以发出 reenroll 命令来更新您的注册证书,如下所示。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client reenroll
撤销证书或身份
可以撤销身份或证书。 撤销身份将撤销该身份拥有的所有证书,并且还将阻止该身份获得任何新证书。 吊销证书将使单个证书失效。
为了撤销证书或身份,调用身份必须具有 hf.Revoker
和 hf.Registrar.Roles
属性。 撤销身份只能撤销与撤销身份的隶属关系相等或前缀为隶属关系的证书或身份。 此外,撤销者只能撤销具有在撤销者的 hf.Registrar.Roles
属性中列出的类型的身份。
例如,具有隶属关系 orgs.org1 和 'hf.Registrar.Roles=peer,client' 属性的撤销者可以撤销隶属于 orgs 的 peer 或 client 类型身份。 org1 或 orgs.org1.department1 但不能撤销隶属于 orgs.org2 或任何其他类型的身份。
以下命令禁用身份并撤销与该身份关联的所有证书。 Fabric CA 服务器从该身份接收到的所有未来请求都将被拒绝。
fabric-ca-client revoke -e <enrollment_id> -r <reason>
以下是可以使用 -r
标志指定的受支持原因:
- 未指定
- 关键妥协
- 妥协
- 隶属关系改变
- 被取代
- 停止运营
- 证书持有人
- 从crl中删除
- 特权被撤销
- 妥协
例如,与隶属关系树的根相关联的引导管理员可以撤销 peer1 的身份,如下所示:
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client revoke -e peer1
可以通过指定其 AKI(Authority Key Identifier)和序列号来撤销属于某个身份的注册证书,如下所示:
fabric-ca-client revoke -a xxx -s yyy -r <reason>
例如,您可以使用 openssl 命令获取 AKI 和证书的序列号,并将它们传递给 revoke
命令以撤销所述证书,如下所示:
serial=$(openssl x509 -in userecert.pem -serial -noout | cut -d "=" -f 2)
aki=$(openssl x509 -in userecert.pem -text | awk '/keyid/ {gsub(/ *keyid:|:/,"",$1);print tolower($0)}')
fabric-ca-client revoke -s $serial -a $aki -r affiliationchange
–gencrl 标志可用于生成包含所有已吊销证书的 CRL(证书吊销列表)。 例如,以下命令将撤销身份 peer1,生成 CRL 并将其存储在 msp 文件夹/crls/crl.pem 文件中。
fabric-ca-client revoke -e peer1 --gencrl
也可以使用 gencrl 命令生成 CRL。 参考【生成 CRL(证书撤销列表)】(https://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html#generating-a-crl-certificate-revocation-list) 部分了解有关 gencrl 命令的更多信息。
生成 CRL(证书吊销列表)
在 Fabric CA 服务器中撤销证书后,还必须更新 Hyperledger Fabric 中的相应 MSP。 这包括peer的本地 MSP 以及适当通道配置块中的 MSP。 为此,PEM 编码的 CRL(证书撤销列表)文件必须放在 MSP 的 crls 文件夹中。 fabric-ca-client gencrl
命令可用于生成 CRL。 任何具有 hf.GenCRL
属性的身份都可以创建一个 CRL,其中包含在特定时期内被撤销的所有证书的序列号。 创建的 CRL 存储在 msp 文件夹/crls/crl.pem 文件中。
以下命令将创建一个包含所有已撤销证书(过期和未过期)的 CRL,并将 CRL 存储在 ~/msp/crls/crl.pem 文件中。
export FABRIC_CA_CLIENT_HOME=~/clientconfig
fabric-ca-client gencrl -M ~/msp
下一个命令将创建一个 CRL,其中包含在 2017-09-13T16:39:57-08:00(由 –revokedafter 标志指定)和 2017-09-21T16:39 之前撤销的所有证书(过期和未过期): 57-08:00(由 –revokedbefore 标志指定)并将 CRL 存储在 ~/msp/crls/crl.pem 文件中。
export FABRIC_CA_CLIENT_HOME=~/clientconfig
fabric-ca-client gencrl --caname "" --revokedafter 2017-09-13T16:39:57-08:00 --revokedbefore 2017-09-21T16:39:57-08:00 -M ~/msp
–caname 标志指定该请求被发送到的 CA 的名称。 在此示例中,gencrl 请求被发送到默认 CA。
–revokedafter 和 –revokedbefore 标志指定时间段的下限和上限。 生成的 CRL 将包含在此时间段内被吊销的证书。 这些值必须是以 RFC3339 格式指定的 UTC 时间戳。 –revokedafter 时间戳不能大于 –revokedbefore 时间戳。
默认情况下,CRL 的“下次更新”日期设置为第二天。 crl.expiry CA 配置属性可用于指定自定义值。
gencrl 命令还将接受 –expireafter 和 –expirebefore 标志,这些标志可用于生成带有在这些标志指定的期限内过期的吊销证书的 CRL。 例如,以下命令将生成一个 CRL,其中包含在 2017-09-13T16:39:57-08:00 和 2017-09-21T16:39:57-08:00 之后被吊销的证书,并且在之后过期 2017-09-13T16:39:57-08:00 和 2018-09-13T16:39:57-08:00 之前
export FABRIC_CA_CLIENT_HOME=~/clientconfig
fabric-ca-client gencrl --caname "" --expireafter 2017-09-13T16:39:57-08:00 --expirebefore 2018-09-13T16:39:57-08:00 --revokedafter 2017-09-13T16:39:57-08:00 --revokedbefore 2017-09-21T16:39:57-08:00 -M ~/msp
启用 TLS
本节更详细地描述了如何为 Fabric CA 客户端配置 TLS。
以下部分可以在 fabric-ca-client-config.yaml
中配置。
tls:
# Enable TLS (default: false)
enabled: true
certfiles:
- root.pem
client:
certfile: tls_client-cert.pem
keyfile: tls_client-key.pem
certfiles 选项是客户端信任的根证书集。 这通常只是在 ca-cert.pem 文件的服务器主目录中找到的根 Fabric CA 服务器证书。
只有在服务器上配置了双向 TLS 时才需要 client 选项。
基于属性的访问控制
访问控制决策可以通过链码(以及 Hyperledger Fabric 运行时)根据身份的属性做出。 这称为基于属性的访问控制,或简称ABAC。
为了使这成为可能,身份的注册证书 (ECert) 可能包含一个或多个属性名称和值。 然后,链码提取属性值以做出访问控制决策。
例如,假设您正在开发应用程序 app1 并希望特定的链码操作只能由 app1 管理员访问。 您的链代码可以验证调用者的证书(由受信任的通道的 CA 颁发)包含名为 app1Admin 的属性,其值为 true。 当然,属性的名称可以是任何东西,并且值不必是布尔值。
那么如何获得带有属性的注册证书呢? 有两种方法:
1.注册身份时,您可以指定为该身份颁发的注册证书默认应包含一个属性。 此行为可以在注册时被覆盖,但这对于建立默认行为很有用,并且假设注册发生在您的应用程序之外,则不需要任何应用程序更改。
下面显示如何使用两个属性注册 user1:app1Admin 和 email。 当用户在注册时没有明确请求属性时,“:ecert”后缀会默认将 appAdmin 属性插入到 user1 的注册证书中。 默认情况下,email 属性不会添加到注册证书中。
fabric-ca-client register --id.name user1 --id.secret user1pw --id.type client --id.affiliation org1 --id.attrs 'app1Admin=true:ecert,email=user1@gmail.com'
-
注册身份时,您可以明确要求将一个或多个属性添加到证书中。 对于每个请求的属性,您可以指定该属性是否是可选的。 如果不是可选的请求并且身份不具有该属性,则会发生错误。
下面显示了如何使用 email 属性、不使用 app1Admin 属性和可选的 phone 属性(如果用户拥有 phone 属性)注册 user1。
fabric-ca-client enroll -u http://user1:user1pw@localhost:7054 --enrollment.attrs "email,phone:opt"
下表显示了为每个身份自动注册的三个属性。
属性名称 | 属性值 |
---|---|
hf.EnrollmentID | 身份的注册ID |
hf.Type | 身份类型 |
hf.Affiliation | 身份的隶属关系 |
要将上述任何属性默认情况下添加到证书,您必须使用“:ecert”规范显式注册该属性。 例如,以下注册身份“user1”,以便如果在注册时没有请求特定属性,则“hf.Affiliation”属性将添加到注册证书中。 请注意,从属关系的值(即“org1”)在“–id.affiliation”和“–id.attrs”标志中必须相同。
fabric-ca-client register --id.name user1 --id.secret user1pw --id.type client --id.affiliation org1 --id.attrs 'hf.Affiliation=org1:ecert'
有关基于属性的访问控制的链代码库 API 的信息,请参阅https://github.com/hyperledger/fabric-chaincode-go/blob/master/pkg/cid/README.md
动态服务器配置更新
本节介绍如何使用 fabric-ca-client 动态更新部分 fabric-ca-server 的配置,而无需重新启动服务器。
本节中的所有命令都要求您首先通过执行 fabric-ca-client 注册命令进行注册。
动态更新身份
本节介绍如何使用 fabric-ca-client 动态更新身份。
如果客户端身份不满足以下所有条件,则会发生授权失败:
- 客户端身份必须拥有“hf.Registrar.Roles”属性和逗号分隔的值列表,其中一个值等于正在更新的身份类型; 例如,如果客户端的身份具有值为“client”的“hf.Registrar.Roles”属性,则客户端可以更新“client”类型的身份,但不能更新“peer”。
- 客户身份的从属关系必须等于或正在更新的身份的从属关系的前缀。 例如,隶属关系为“a.b”的客户可以更新隶属关系为“a.b.c”的身份,但不能更新隶属关系为“a.c”的身份。 如果身份需要根从属关系,则更新请求应为从属关系指定一个点(“.”),并且客户端也必须具有根从属关系。
下面显示了如何添加、修改和删除从属关系。
获取身份信息
只要调用者满足上面部分中强调的授权要求,调用者就可以从fabric-ca服务器检索有关身份的信息。 以下命令显示如何获取身份。
fabric-ca-client identity list --id user1
调用者还可以通过发出以下命令请求检索有关其有权查看的所有身份的信息。
fabric-ca-client identity list
添加身份
以下为“user1”添加了一个新身份。 添加新身份执行与通过“fabric-ca-client register”命令注册身份相同的操作。 添加新身份有两种可用的方法。 第一种方法是通过 –json 标志在 JSON 字符串中描述身份。
fabric-ca-client identity add user1 --json '{"secret": "user1pw", "type": "client", "affiliation": "org1", "max_enrollments": 1, "attrs": [{"name": "hf.Revoker", "value": "true"}]}'
下面添加一个具有 root 隶属关系的用户。 请注意,从属机构名称“。” 指根系。
fabric-ca-client identity add user1 --json '{"secret": "user1pw", "type": "client", "affiliation": ".", "max_enrollments": 1, "attrs": [{"name": "hf.Revoker", "value": "true"}]}'
添加标识的第二种方法是使用直接标志。 请参阅下面的示例以添加“user1”。
fabric-ca-client identity add user1 --secret user1pw --type client --affiliation . --maxenrollments 1 --attrs hf.Revoker=true
下表列出了身份的所有字段以及它们是必需的还是可选的,以及它们可能具有的任何默认值。
字段 | 必需的 | 默认值 |
---|---|---|
ID | Yes | |
Secret | No | |
Affiliation | No | Caller’s Affiliation |
Type | No | client |
Maxenrollments | No | 0 |
Attributes | No |
修改身份
修改现有身份有两种可用的方法。 第一种方法是通过 –json 标志,您可以在其中描述对 JSON 字符串中身份的修改。 可以在一个请求中进行多项修改。 任何未修改的身份元素都将保留其原始值。
注意:“-2”的 maxenrollments 值指定要使用 CA 的最大注册设置。
下面的命令使用 –json 标志对身份进行多次修改。
fabric-ca-client identity modify user1 --json '{"secret": "newPassword", "affiliation": ".", "attrs": [{"name": "hf.Regisrar.Roles", "value": "peer,client"},{"name": "hf.Revoker", "value": "true"}]}'
下面的命令使用直接标志进行修改。 以下将身份“user1”的注册密码(或密码)更新为“newsecret”。
fabric-ca-client identity modify user1 --secret newsecret
以下将身份“user1”的从属关系更新为“org2”。
fabric-ca-client identity modify user1 --affiliation org2
下面将身份“user1”的类型更新为“peer”。
fabric-ca-client identity modify user1 --type peer
以下将身份“user1”的 maxenrollments 更新为 5。
fabric-ca-client identity modify user1 --maxenrollments 5
通过将 maxenrollments 值指定为“-2”,以下会导致身份“user1”使用 CA 的最大注册设置。
fabric-ca-client identity modify user1 --maxenrollments -2
下面将身份“user1”的“hf.Revoker”属性的值设置为“false”。 如果身份有其他属性,它们不会改变。 如果身份之前不具有“hf.Revoker”属性,则将该属性添加到身份中。 也可以通过不指定属性值来删除属性。
fabric-ca-client identity modify user1 --attrs hf.Revoker=false
以下内容删除了用户“user1”的“hf.Revoker”属性。
fabric-ca-client identity modify user1 --attrs hf.Revoker=
下面演示了可以在单个 fabric-ca-client identity modify 命令中使用多个选项。 在这种情况下,将为用户“user1”更新密钥和类型。
fabric-ca-client identity modify user1 --secret newpass --type peer
删除身份
以下内容将删除身份“user1”并撤销与“user1”身份关联的任何证书。
fabric-ca-client identity remove user1
注意:fabric-ca-server 中默认禁用身份删除,但可以通过使用 –cfg.identities.allowremove 选项启动 fabric-ca-server 来启用。
动态更新隶属关系
本节介绍如何使用 fabric-ca-client 动态更新从属关系。 下面显示了如何添加、修改、删除和列出从属关系。
添加隶属关系
如果客户端身份不满足以下所有条件,则会发生授权失败:
- 客户端身份必须具有属性“hf.AffiliationMgr”,其值为“true”。
- 客户身份的从属关系必须在层次上高于被更新的从属关系。 例如,如果客户的从属关系是“a.b”,则客户可以添加从属关系“a.b.c”,但不能添加“a”或“a.b”。
以下添加了一个名为“org1.dept1”的新隶属关系。
fabric-ca-client affiliation add org1.dept1
修改隶属关系
如果客户端身份不满足以下所有条件,则会发生授权失败:
- 客户端身份必须具有属性“hf.AffiliationMgr”,其值为“true”。
- 客户身份的从属关系必须在层次上高于被更新的从属关系。 例如,如果客户的从属关系是“a.b”,则客户可以添加从属关系“a.b.c”,但不能添加“a”或“a.b”。
- 如果“--force”选项为真并且存在必须修改的身份,则还必须授权客户端身份修改身份。
以下将“org2”从属关系重命名为“org3”。 它还重命名任何子隶属关系(例如,“org2.department1”重命名为“org3.department1”)。
fabric-ca-client affiliation modify org2 --name org3
如果有身份受到重命名从属关系的影响,除非使用“-force”选项,否则将导致错误。 使用“-force”选项将更新受影响身份的从属关系以使用新的从属关系名称。
fabric-ca-client affiliation modify org1 --name org2 --force
删除从属关系
如果客户端身份不满足以下所有条件,则会发生授权失败:
- 客户端身份必须具有属性“hf.AffiliationMgr”,其值为“true”。
- 客户身份的从属关系必须在层次上高于被更新的从属关系。 例如,如果客户的从属关系是“a.b”,则客户可以删除从属关系“a.b.c”,但不能删除“a”或“a.b”。
- 如果“--force”选项为真并且存在必须修改的身份,则还必须授权客户端身份修改身份。
以下删除隶属关系“org2”以及任何子隶属关系。 例如,如果“org2.dept1”是“org2”下面的从属关系,它也会被删除。
fabric-ca-client affiliation remove org2
如果有身份受到删除从属关系的影响,除非使用“-force”选项,否则将导致错误。 使用“-force”选项还将删除与该隶属关系关联的所有身份,以及与这些身份中的任何一个关联的证书。
注意:默认情况下,fabric-ca-server 中禁用从属关系的删除,但可以通过使用 –cfg.affiliations.allowremove 选项启动 fabric-ca-server 来启用。
列出隶属关系信息
如果客户端身份不满足以下所有条件,则会发生授权失败:
- 客户端身份必须具有属性“hf.AffiliationMgr”,其值为“true”。
- 客户身份的隶属关系必须等于或在层次上高于正在更新的隶属关系。 例如,如果客户的从属关系是“a.b”,则客户可能会获得“a.b”或“a.b.c”的从属关系信息,而不是“a”或“a.c”。
以下命令显示了如何获得特定的从属关系。
fabric-ca-client affiliation list --affiliation org2.dept1
调用者还可以通过发出以下命令请求检索有关其有权查看的所有从属关系的信息。
fabric-ca-client affiliation list
管理证书
本节介绍如何使用 fabric-ca-client 管理证书。
清单证书信息
调用者可见的证书包括:
- 属于调用者的那些证书
- 如果调用者拥有
hf.Registrar.Roles
属性或值为true
的hf.Revoker
属性,则所有属于调用者从属关系内及以下身份的证书。 例如,如果客户的从属关系是a.b
,则客户端可能会获得身份的证书,这些身份的从属关系是a.b
或a.b.c
但不是a
或a.c
。
如果执行一个请求多个身份的证书的列表命令,则只会列出具有等于或低于调用者从属关系的从属关系的身份证书。
可以根据 ID、AKI、序列号、到期时间、撤销时间、未撤销和未到期标志过滤将列出的证书。
id
: 列出此注册 ID 的证书serial
: 列出具有此序列号的证书aki
: 列出具有此 AKI 的证书expiration
: 列出过期日期在此过期时间内的证书revocation
: 列出在此吊销时间内吊销的证书notrevoked
: 列出尚未撤销的证书notexpired
: 列出尚未过期的证书
您可以使用标志 noteexpired
和 notrevoked
作为过滤器,从结果集中排除已撤销的证书和/或过期的证书。 例如,如果您只关心已过期但尚未撤销的证书,您可以使用 expiration
和 notrevoked
标志来获取此类结果。 下面提供了这种情况的一个示例。
时间应根据 RFC3339 指定。 例如,要列出在 2018 年 3 月 1 日下午 1:00 和 2018 年 6 月 15 日凌晨 2:00 之间到期的证书,输入时间字符串将类似于 2018-03-01T13:00:00z 和 2018-06 -15T02:00:00z。 如果时间不是问题,而只有日期很重要,那么可以省略时间部分,然后字符串变为 2018-03-01 和 2018-06-15。
字符串 now
可用于表示当前时间,空字符串表示任何时间。 例如,now::
表示从现在到未来任何时间的时间范围,而::now
表示从过去任何时间到现在的时间范围。
以下命令显示如何使用各种过滤器列出证书。
列出所有证书:
fabric-ca-client certificate list
按 id 列出所有证书:
fabric-ca-client certificate list --id admin
按序列号和 aki 列出证书:
fabric-ca-client certificate list --serial 1234 --aki 1234
按 id 和序列/aki 列出证书:
fabric-ca-client certificate list --id admin --serial 1234 --aki 1234
列出既不是撤销者也不是按 id 过期的证书:
fabric-ca-client certificate list --id admin --notrevoked --notexpired
列出所有未针对 id (admin) 撤销的证书:
fabric-ca-client certificate list --id admin --notrevoked
列出所有未过期的 id (admin) 证书:
“--noteexpired”标志相当于“--expiration now::”,这意味着证书将在未来某个时间过期。
fabric-ca-client certificate list --id admin --notexpired
列出在 id (admin) 的时间范围内被吊销的所有证书:
fabric-ca-client certificate list --id admin --revocation 2018-01-01T01:30:00z::2018-01-30T05:00:00z
列出在某个时间范围内被吊销但 ID 未过期的所有证书(管理员):
fabric-ca-client certificate list --id admin --revocation 2018-01-01::2018-01-30 --notexpired
使用 id(管理员)的持续时间(在 30 天到 15 天前撤销)列出所有撤销的证书:
fabric-ca-client certificate list --id admin --revocation -30d::-15d
在某个时间之前列出所有吊销的证书
fabric-ca-client certificate list --revocation ::2018-01-30
一段时间后列出所有吊销的证书
fabric-ca-client certificate list --revocation 2018-01-30::
列出现在之前和某个日期之后的所有吊销证书
fabric-ca-client certificate list --id admin --revocation 2018-01-30::now
列出所有在某个时间范围内过期但尚未因 id (admin) 而被吊销的证书:
fabric-ca-client certificate list --id admin --expiration 2018-01-01::2018-01-30 --notrevoked
使用 id(管理员)的持续时间(在 30 天到 15 天前过期)列出所有过期的证书:
fabric-ca-client certificate list --expiration -30d::-15d
列出所有已过期或将在特定时间之前过期的证书
fabric-ca-client certificate list --expiration ::2058-01-30
列出所有已过期或将在特定时间后过期的证书
fabric-ca-client certificate list --expiration 2018-01-30::
列出现在之前和某个日期之后的所有过期证书
fabric-ca-client certificate list --expiration 2018-01-30::now
列出未来 10 天到期的证书:
fabric-ca-client certificate list --id admin --expiration ::+10d --notrevoked
list certificate 命令还可用于在文件系统上存储证书。 这是一种在 MSP 中填充 admins 文件夹的便捷方式,“-store”标志指向文件系统上用于存储证书的位置。
通过在 MSP 中存储身份的证书,将身份配置为管理员:
export FABRIC_CA_CLIENT_HOME=/tmp/clientHome
fabric-ca-client certificate list --id admin --store msp/admincerts
联系特定的 CA 实例
当服务器运行多个 CA 实例时,可以将请求定向到特定 CA。 默认情况下,如果客户端请求中没有指定 CA 名称,则请求将被定向到 fabric-ca 服务器上的默认 CA。 可以使用 caname
过滤器在客户端命令的命令行上指定 CA 名称,如下所示:
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054 --caname <caname>
配置 HSM
默认情况下,Fabric CA 服务器和客户端将私钥存储在 PEM 编码文件中,但也可以将它们配置为通过 PKCS11 API 将私钥存储在 HSM(硬件安全模块)中。 此行为在服务器或客户端配置文件的 BCCSP(BlockChain Crypto Service Provider)部分进行配置。 目前,Fabric 仅支持 PKCS11 标准与 HSM 通信。
例子
以下示例演示如何配置 Fabric CA 服务器或客户端以使用称为 SoftHSM 的 PKCS11 软件版本(请参阅 https://github.com/opendnssec/SoftHSMv2)。
安装 SoftHSM 后,确保将 SOFTHSM2_CONF 环境变量设置为指向存储 SoftHSM2 配置文件的位置。 配置文件看起来像
directories.tokendir = /tmp/
objectstore.backend = file
log.level = INFO
创建一个令牌,标记为“ Forfabric”,将PIN设置为“ 98765432”(请参阅SOFTHSM文档)。
您可以使用配置文件和环境变量来配置 BCCSP。 例如,如下设置 Fabric CA 服务器配置文件的 bccsp 部分。 请注意,默认字段的值为 PKCS11。
#############################################################################
# BCCSP (BlockChain Crypto Service Provider) section is used to select which
# crypto library implementation to use
#############################################################################
bccsp:
default: PKCS11
pkcs11:
Library: /usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so
Pin: 98765432
Label: ForFabric
hash: SHA2
security: 256
filekeystore:
# The directory used for the software file-based keystore
keystore: msp/keystore
您可以通过环境变量覆盖相关字段,如下所示:
FABRIC_CA_SERVER_BCCSP_DEFAULT=PKCS11
FABRIC_CA_SERVER_BCCSP_PKCS11_LIBRARY=/usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so
FABRIC_CA_SERVER_BCCSP_PKCS11_PIN=98765432
FABRIC_CA_SERVER_BCCSP_PKCS11_LABEL=ForFabric
未启用预构建的 Hyperledger Fabric Docker 映像以使用 PKCS11。 如果您使用 Docker 部署 Fabric CA,则需要构建自己的映像并使用以下命令启用 PKCS11:
make docker GO_TAGS=pkcs11
您还需要确保 PKCS11 库可供 CA 使用,方法是安装它或将其挂载到容器中。 如果您使用 Docker Compose 部署 Fabric CA,您可以更新 Compose 文件以使用卷在容器内挂载 SoftHSM 库和配置文件。 例如,您可以将以下环境和卷变量添加到 Docker Compose 文件中:
environment:
- SOFTHSM2_CONF=/etc/hyperledger/fabric/config.file
volumes:
- /home/softhsm/config.file:/etc/hyperledger/fabric/config.file
- /usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so:/etc/hyperledger/fabric/libsofthsm2.so
文件格式
Fabric CA 服务器的配置文件格式
在服务器的主目录中创建默认配置文件(有关详细信息,请参阅 Fabric CA 服务器 部分) . 以下链接显示了一个示例 服务器配置文件。
Fabric CA 客户端的配置文件格式
在客户端的主目录中创建默认配置文件(有关详细信息,请参阅 Fabric CA 客户端 部分) . 以下链接显示了一个示例 客户端配置文件。
故障排除
-
如果您在尝试执行
fabric-ca-client
或fabric-ca-server
时在 OSX 上看到Killed: 9
错误,则在 https://github.com/golang 上有一个描述此问题的长线程 /go/issues/19734。 简短的回答是,要解决此问题,您可以运行以下命令:# sudo ln -s /usr/bin/true /usr/local/bin/dsymutil
-
如果发生以下事件序列,则会出现错误“[ERROR] No certificate found for provided serial and aki”:
- 您发出一个 fabric-ca-client 注册命令,创建一个注册证书(即 ECert)。 这会将 ECert 的副本存储在 fabric-ca-server 的数据库中。
- Fabric-ca-server 的数据库被删除并重新创建,从而丢失了步骤“a”中的 ECert。 例如,如果您停止并重新启动托管fabric-ca-server 的Docker 容器,但您的fabric-ca-server 使用默认sqlite 数据库并且数据库文件未存储在卷上,因此不会持久,则可能会发生这种情况 .
- 您发出一个 fabric-ca-client register 命令或任何其他尝试使用步骤“a”中的 ECert 的命令。 在这种情况下,由于数据库不再包含 ECert,所以会出现“[ERROR] No certificate found for provided serial and aki”。
要解决此错误,您必须通过重复步骤“a”重新注册。 这将发出一个新的 ECert,该 ECert 将存储在当前数据库中。
-
当向使用共享 sqlite3 数据库的 Fabric CA 服务器集群发送多个并行请求时,服务器偶尔会返回“数据库锁定”错误。 这很可能是因为数据库事务在等待释放数据库锁(由另一个集群成员持有)时超时。 这是一个无效的配置,因为 sqlite 是一个嵌入式数据库,这意味着 Fabric CA 服务器集群必须通过共享文件系统共享相同的文件,这会引入 SPoF(单点故障),这与集群拓扑的目的相矛盾。 最佳实践是在集群拓扑中使用 Postgres 或 MySQL 数据库。
-
假设在使用 Fabric CA 服务器颁发的注册证书时,peer 或 orderer 返回类似于“无法反序列化创建者身份,err 提供的身份无效,Verify() 返回 x509: certificate signed by unknown authority”类似的错误 . 这表明 Fabric CA 服务器用于颁发证书的签名 CA 证书与用于进行授权检查的 MSP 的 cacerts 或 middlecerts 文件夹中的证书不匹配。
用于进行授权检查的 MSP 取决于发生错误时您正在执行的操作。 例如,如果您尝试在peer上安装链代码,则使用peer文件系统上的本地 MSP; 否则,如果您正在执行某些特定于通道的操作,例如在特定通道上实例化链码,则使用创世块中的 MSP 或通道的最新配置块。
要确认这是问题所在,请将注册证书的 AKI(授权密钥标识符)与相应 MSP 的 cacerts 和 middlecerts 文件夹中证书的 SKI(主题密钥标识符)进行比较。 命令 openssl x509 -in PEM 文件 -noout -text | grep -A1 “Authority Key Identifier” 将显示 AKI 和 openssl x509 -in PEM-file -noout -text | grep -A1 “Subject Key Identifier” 将显示 SKI。 如果它们不相等,则您已确认这是错误的原因。
发生这种情况的原因有多种,包括:
-
您使用 cryptogen 生成密钥材料,但没有使用 cryptogen 生成的签名密钥和证书启动 fabric-ca-server。
要解决(假设 FABRIC_CA_SERVER_HOME 设置为您的 fabric-ca-server 的主目录):
- 停止fabric-ca-server。
- 将 crypto-config/peerOrganizations/orgName/ca/*pem 复制到 $FABRIC_CA_SERVER_HOME/ca-cert.pem。
- 将 crypto-config/peerOrganizations/orgName/ca/*_sk 复制到 $FABRIC_CA_SERVER_HOME/msp/keystore/。
- 启动fabric-ca-server。
- 删除任何以前颁发的注册证书并通过再次注册来获取新证书。
-
您在生成创世块后删除并重新创建了 Fabric CA 服务器使用的 CA 签名密钥和证书。 如果 Fabric CA 服务器在 Docker 容器中运行,容器已重新启动,并且其主目录不在卷挂载上,则可能会发生这种情况。 在这种情况下,Fabric CA 服务器将创建一个新的 CA 签名密钥和证书。
假设您无法恢复原始 CA 签名密钥,那么从这种情况中恢复的唯一方法是将相应 MSP 的 cacerts(或中间证书)中的证书更新为新的 CA 证书。
-
评论区