准备应用程序
fabric-ca包括两个应用程序,一个是fabric-ca-client, 一个是fabric-ca-server。
我们这里使用docker镜像,编译好后看镜像hyperledger/fabric-ca
docker image ls|grep fabric-ca
镜像里面同时包含fabric-ca-client和fabric-ca-server程序
1. 启动fabric-ca-server
在hyperledger/fabric-ca镜像中启动fabric-ca-server程序。使用以下yaml文件,通过docker-compose启动,注意的是FABRIC_CA_SERVER_CSR_HOSTS变量,需要设置为实际运行fabric-ca-server的主机名
$ cat tls-server-compose.yaml version: "3.9" services: ca-tls: container_name: ca-tls image: hyperledger/fabric-ca command: sh -c 'fabric-ca-server start -d -b ca-tls-admin:ca-tls-adminpw --port 7052' environment: # CA Server的工作路径 - FABRIC_CA_SERVER_HOME=/tmp/tls # 启动fabric-ca-server和fabric-ca-client之间的tls通讯 - FABRIC_CA_SERVER_TLS_ENABLED=true # 证书中的CN字段 - FABRIC_CA_SERVER_CSR_CN=ca-tls # 证书适用范围 - FABRIC_CA_SERVER_CSR_HOSTS=localhost - FABRIC_CA_SERVER_DEBUG=true volumes: - ca-tls:/tmp/tls ports: - 7052:7052 volumes: ca-tls:
第一次启动server后,在FABRIC_CA_SERVER_HOME下面有server的配置文件:fabric-ca-server-config.yaml。
我们可根据实际需要修改即可,本例中相关的修改如下:
csr: names: - C: CN ST: "Cheng Du" L: O: MHTech OU: # 开启这个功能,允许fabric-ca-sever删除已经注册的用户,一般在开发环境中使用 cfg: identities: allowremove: true
修改后,把FABRIC_CA_SERVER_HOME目录下除fabric-ca-server-config.yaml的所有文件都删掉,重新启动server。
启动后,我们可以看到FABRIC_CA_SERVER_HOME目录下有以下文件:
# ls -1 IssuerPublicKey IssuerRevocationPublicKey ca-cert.pem fabric-ca-server-config.yaml fabric-ca-server.db msp tls-cert.pem
我们只需要关注几个文件:
- ca-cert.pem。是自签名的根证书文件,本ca的根证书 ,就是它,fabric-ca-server启动时生成
- tls-cert.pem。由ca-cert.pem签发的证书,是fabric-ca-server的tls通讯证书,当fabric-ca-client向fabirc-ca-server发起tls通讯请求时,fabric-ca-server就展示tls-cert.pem证书,fabric-ca-client接下来验证该证书的有效性即可(fabric-ca-client持有ca-cert.pem根证书即可验证)
我们看看证书的内容是否符合预期,尤其关注下我们自己修改的那部分
$ keytool -printcert -file ca-cert.pem Owner: CN=ca-tls, O=MHTech, ST=Cheng Du, C=CN Issuer: CN=ca-tls, O=MHTech, ST=Cheng Du, C=CN Serial number: 60bfcf507e7a22ab875415593e0b47132acf8ef5 Valid from: Mon Oct 04 16:02:00 CST 2021 until: Tue Sep 30 16:02:00 CST 2036 Certificate fingerprints: MD5: F9:21:E0:81:8C:DB:4C:55:7D:D3:C5:68:81:17:16:6A SHA1: 0C:0D:E3:C8:86:03:92:8A:0D:95:9B:3A:EF:46:08:29:7C:68:2E:0E SHA256: B8:2F:B6:10:7C:D0:0D:1D:9A:1A:1B:D1:84:32:50:F7:EE:9E:CD:7A:41:92:AB:51:12:3B:15:E4:36:A0:63:40 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 Extensions: #1: ObjectId: 2.5.29.19 Criticality=true BasicConstraints:[ CA:true PathLen:1 ] #2: ObjectId: 2.5.29.15 Criticality=true KeyUsage [ Key_CertSign Crl_Sign ] #3: ObjectId: 2.5.29.17 Criticality=false SubjectAlternativeName [ IPAddress: 0.0.0.0 ] #4: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: D4 9E B9 03 A1 4E 70 49 01 24 94 28 9B A7 F7 D0 .....NpI.$.(.... 0010: 5E 17 FE 9C ^... ] ]
2. 颁发admin证书
申请证书由fabric-ca-client发起。
fabric-ca-client也可以由镜像启动,但在实际过程中,由于需要频繁操作fabric-ca-client。本文中直接使用二进制方式启动。
证书的申请过程一共经过两个步骤:register和enroll
fabric-ca-client register ... fabric-ca-client enroll ...
- register是登记注册用户的过程
- enroll是实际颁发用户证书的过程
但并不是任何人都可以发起register和enroll命令的,必须得是admin账户。
在启动server的时候,我们注意到命令为:
fabric-ca-server start -d -b admin-ca-orgA:admin-ca-orgApw --port 7152
其中-b参数指定了初始的admin账户。即server启动的时候,已经通过命令行register了初始admin账户:用户名为admin-ca-orgA,密码为admin-ca-orgApw。
我们接下来得获得admin的实际证书,即enroll过程
2.1 设置FABRIC_CA_CLIENT_HOME路径
在使用fabric-ca-client之前,得先设置FABRIC_CA_CLIENT_HOME变量,用于指定fabric-ca-client的工作路径。
export FABRIC_CA_CLIENT_HOME=$PWD
2.2 准备tls通讯证书
之前提到server和client之前开启了tls通讯,server的证书文件是tls-cert.pem。当client发起tls通讯的时候,需要认证server所提供的tls-cert.pem证书的有效性。这就要求client端拥有ca的根证书ca-cert.pem
把fabric-ca-server中FABRIC_CA_SERVER_HOME目录下的ca-cert.pem拷贝到fabic-ca-client端指定目录下,如果是想从server的docker镜像中拷贝出来,则使用
docker cp <server path> <client path>
2.3 获取admin的证书
创建tls-admin目录,发起enroll动作
./fabric-ca-client enroll -d -u https://admin-ca-orgA:admin-ca-orgApw@127.0.0.1:7152 --tls.certfiles ./admin-ca/orgA/root-orgA.crt --mspdir ./admin-ca/orgA/msp
- tls.certfiles指定了从server端获取的ca-cert.pem,在本地重命名为root-orgA.crt
- mspdir指定即将获取的证书保存路径
查看client端证书保存目录,注意新生成的admin证书。其中的keystore目录,保存着证书私钥。signcerts目录,保存着证书文件
orgA ├── msp │ ├── IssuerPublicKey │ ├── IssuerRevocationPublicKey │ ├── cacerts │ │ └── 127-0-0-1-7152.pem │ ├── keystore │ │ └── ea095793e88af32fee9c0e7d3e2b11387933abbb44c66b97ce6e9414ed1c7d10_sk │ ├── signcerts │ │ └── cert.pem │ └── user └── root-orgA.crt
查看下证书内容,可能有些内容并不符合你需要,修改FABRIC_CA_CLIENT_HOME目录下的fabric-ca-client-config.yaml文件,添加一下内容,注意其中hosts尤其关键,该字段描述生成的证书能在哪些机器使用,具体就不展开讲了,感兴趣的同学可以自行搜索x509的SubjectAlternativeName字段含义
tls: certfiles: ./tls-root-cert.pem csr: names: - C: CN ST: Cheng Du L: O: MHTech OU: hosts: - localhost
如果修改了fabric-ca-client-config.yaml文件,需要重新执行enroll, 获取证书
./fabric-ca-client enroll -d -u https://admin-ca-orgA:admin-ca-orgApw@127.0.0.1:7152 --tls.certfiles ./admin-ca/orgA/root-orgA.crt --mspdir ./admin-ca/orgA/msp
检查下最终生成的证书
$ keytool -printcert -file cert.pem Owner: CN=ca-tls-admin, OU=client, O=MHTech, ST=Cheng Du, C=CN Issuer: CN=ca-tls, O=MHTech, ST=Cheng Du, C=CN Serial number: 349def492795485465b1144db4fbede63173521 Valid from: Mon Oct 04 16:55:00 CST 2021 until: Tue Oct 04 17:24:00 CST 2022 Certificate fingerprints: MD5: 47:62:B5:CF:A1:B3:4F:4F:33:10:F7:82:A3:2A:CE:71 SHA1: 66:FE:30:8F:D5:08:58:CC:CC:F5:30:4A:81:CF:FA:4E:4D:5D:F5:81 SHA256: 15:8F:1A:F7:6F:F4:C1:F7:47:DD:BF:44:0B:89:E7:56:24:04:04:98:B9:EA:66:19:7A:B0:CF:6F:F2:A1:CB:96 Signature algorithm name: SHA256withECDSA Subject Public Key Algorithm: 256-bit EC key Version: 3 Extensions: #1: ObjectId: 2.5.29.35 Criticality=false AuthorityKeyIdentifier [ KeyIdentifier [ 0000: D7 6D 43 EC 23 28 88 41 10 44 43 24 94 C2 EB 83 .mC.#(.A.DC$.... 0010: F3 95 CA F1 .... ] ] #2: ObjectId: 2.5.29.19 Criticality=true BasicConstraints:[ CA:false PathLen: undefined ] #3: ObjectId: 2.5.29.15 Criticality=true KeyUsage [ DigitalSignature ] #4: ObjectId: 2.5.29.17 Criticality=false SubjectAlternativeName [ DNSName: localhost ] #5: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 8E DF ED 55 F9 57 80 2B 8F 7C 0B F7 4F 6A 22 59 ...U.W.+....Oj"Y 0010: 58 96 97 9A X... ] ]
3. 颁发orderer, peer, user证书
admin证书到手,那我们就可以通过admin颁发证书了。在fabric环境中,orderer, peer和user都需要颁发证书,操作过程都是一样的
我们通过admin颁发一个orderer证书为例:
./fabric-ca-client register -d --id.name orderer1-orgA --id.secret orderer1-orgAPW --id.type orderer -u https://127.0.0.1:7152 --tls.certfiles ./admin-ca/orgA/root-orgA.crt --mspdir ./admin-ca/orgA/msp ./fabric-ca-client enroll -d -u https://orderer1-orgA:orderer1-orgAPW@127.0.0.1:7152 --tls.certfiles ./admin-ca/orgA/root-orgA.crt --mspdir ./tmp
小结
要正确使用fabirc-ca, 需要对证书格式,CA的工作原理有所了解。本文篇幅有限,不可能面面俱到,建议大家先去了解PKI的相关背景知识,尤其是证书的工作原理,再来操作fabric-ca, 则会顺利很多
Ref
- https://hyperledger-fabric-ca.readthedocs.io/en/latest/deployguide/cadeploy.html#deploy-the-tls-ca
- https://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html#fabric-ca-client
- https://stackoverflow.com/questions/64483724/hyperledger-fabric-network-sdk-code56-messageidentity-removal-is-disab
回复 Jesse Larabell 取消回复