11.7 客户端命令剖析

fabric-ca-client命令可以跟服务端进行交互,包括enroll、getcacert、reenroll、register、revoke五个子命令,主要功能如下:

·enroll:登录获取ECert;

·getcacert:获取CA服务的证书链;

·reenroll:再次登录;

·register:注册用户实体;

·revoke:吊销签发的实体证书。

这些子命令在实现上都是通过服务端的RESTful接口来进行操作的,并且都支持一系列全局命令参数。

11.7.1 全局命令参数

包括通用参数、证书签名请求参数、Enroll、注册、吊销、TLS等多个方面的参数。

1.通用参数

通用参数都比较简单,所有命令都可以使用,如表11-6所示。

表11-6 通用参数

image.png

2.证书签名请求参数

证书签名请求(certificate signing request)文件十分重要,在enroll和reenroll相关过程需要提供给服务端,如表11-7所示。

image.png

3.登记相关参数

登记相关参数包括登记证书代表的主机列表、硬件安全模块操作标签、颁发证书的Profile等,如表11-8所示。

表11-8 登记相关参数

image.png

4.身份实体相关参数

身份实体相关参数主要应用于注册环节和登记,如表11-9所示。

表11-9 身份实体相关参数

image.png

5.吊销证书相关参数

吊销证书相关参数用于吊销证书操作环节,如表11-10所示。

表11-10 吊销证书相关参数

image.png

其中,证书颁发者的公钥标识号(AKI)代表了对该证书进行签发机构的身份,一般为上级证书的证书使用者密钥标识符(Subject Key Identifier)。

序列号信息则由CA维护,用来追踪到该证书,当该证书被撤销时,序列号会被放入证书撤销列表中。

AKI和序列号可以通过如下命令查看证书内容来获得:



$ openssl x509 -in msp/signcerts/cert.pem -text -noout
Certificate:
   Data:
       Version: 3 (0x2)
       Serial Number: // 下面的字符串就是序列号
           0e:ff:93:d8:eb:9f:03:d6:39:63:d7:50:e9:ed:27:60:69:5d:35:e1
   ...
       X509v3 extensions:
           ...
           X509v3 Authority Key Identifier: // keyid后的字符串就是AKI
               keyid:07:25:7E:6E:99:71:1C:40:32:1E:2C:E4:EE:E7:18:14:03:F3:3B:62
   Signature Algorithm: ecdsa-with-SHA256
        ...


也可以通过如下命令来快速提取AKI和序列号:



$ openssl x509 -in msp/signcerts/cert.pem -text -noout | awk '/keyid/ {gsub
   (/ *keyid:|:/,"",$1);print tolower($0)}'
07257e6e99711c40321e2ce4eee7181403f33b62
$ openssl x509 -in msp/signcerts/cert.pem -serial -noout | cut -d "=" -f 2
0EFF93D8EB9F03D63963D750E9ED2760695D35E1


6.TLS相关参数

TLS连接相关配置参数,如表11-11所示。

表11-11 TLS相关参数

image.png

11.7.2 enroll命令

命令格式为fabric-ca-client enroll-u http://user:userpw@serverAddr:serverPort 。该命令会向服务端申请签发ECert证书。

如采用下面命令获取证书文件保存到本地:



$ fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
[INFO] User provided config file: /.fabric-ca-client/fabric-ca-client-config.yaml
[INFO] Configuration file location: /.fabric-ca-client/fabric-ca-client-config.yaml
[INFO] generating key: &{A:ecdsa S:256}
[INFO] encoded CSR
[INFO] Stored client certificate at /.fabric-ca-client/msp/signcerts/cert.pem
[INFO] Stored CA certificate chain at /.fabric-ca-client/msp/cacerts/localhost-
      7054.pem


该命令会在默认的主配置目录(此处为/.fabric-ca-client)下创建msp目录,并存放证书相关文件:



msp
├── cacerts
│   └── localhost-7054.pem
├── keystore
│   └── 5515333745cdd8cca6bcb9e448129528665574a0311393e27140e0b58bdc2929_sk
└── signcerts
   └── cert.pem


其中cacerts目录下存放有服务端的证书,signcerts目录下存放有服务端签发的代表客户端身份的证书,keystore目录下的是对应客户端签名证书的私钥文件。

具体实现过程也十分简单。首先利用本地配置信息(主要是csr字段下信息)、生成的私钥和证书请求结构,构建EnrollmentRequestNet结构,之后通过RESTful接口/enroll发送给服务端。

EnrollmentRequestNet结构中将包括如下信息:

·CAName:服务的实例名称;

·SignRequest信息:

·Hosts:代表的主机列表;

·Request:CSR请求内容,包括通用名、名称、主机、生成私钥算法和大小、CA配置和序列号等信息;

·Subject:所签发对象的主体;

·Profile:服务端签发时采用的Profile;

·CRLOverride:覆盖撤销列表;

·Label:HSM操作中的标签;

·Serial:序列号信息,会出现在证书的DN字段中;

·Extensions:证书扩展域。

服务器返回消息包含有EnrollmentResponse结构信息,其中的数据有:

·Identity:代表所签发的ECert证书等信息;

·ServerInfo:服务器的信息,包括CAName、证书链信息。

客户端利用收到的EnrollmentResponse结构解析出相关的文件内容,并保存到本地。

11.7.3 getcacert命令

命令格式为fabric-ca-client getcacert-u http://serverAddr:serverPort -M<MSP-directory>[flags]。该命令会向服务端申请根证书信息。

例如采用下面的命令获取服务端证书文件并保存到本地主配置目录的msp/cacerts路径下:



$ fabric-ca-client getcacert -u http://admin:adminpw@localhost:7054
[INFO] Stored CA certificate chain at /.fabric-ca-client/msp/cacerts/localhost-
      7054.pem


实现上,客户端封装了GetCAInfoRequest结构,其中包括CAName信息,发送到服务端的/cainfo 接口。服务端收到请求后返回GetServerInfoResponse结构,其中包括CAName和CAChain数据。客户端将收到的证书链 (CAChain)的第一个证书写到msp/cacerts路径下,命名为“服务器主机名-CA实例名.pem”。其他证书写到msp /intermediatecerts路径下。

11.7.4 reenroll命令

命令格式为fabric-ca-client reenroll[flags]。会利用本地配置信息再次执行enroll过程,生成新的签名证书材料。

执行过程如下所示,与enroll过程类似,获取新的证书文件:



# fabric-ca-client reenroll
[INFO] User provided config file: /.fabric-ca-client/fabric-ca-client-config.yaml
[INFO] Configuration file location: /.fabric-ca-client/fabric-ca-client-config.yaml
[INFO] generating key: &{A:ecdsa S:256}
[INFO] encoded CSR
[INFO] Stored client certificate at /.fabric-ca-client/msp/signcerts/cert.pem
[INFO] Stored CA certificate chain at /.fabric-ca-client/msp/cacerts/localhost-
      7054.pem


实现上,客户端首先要构造ReenrollmentRequest结构。其中包括:

·Label:HSM过程相关的标签;

·Profile:服务端签发采用的Profile;

·CSR:证书申请请求相关信息,包括通用名、名称、主机、生成私钥算法和大小、CA配置和序列号等信息;

·CAName:CA服务实例名称。

请求发送到服务端的/reenroll接口,服务端处理后返回EnrollmentResponse结构信息。客户端利用收到的EnrollmentResponse结构解析出相关的证书文件内容,并保存到本地。

11.7.5 register命令

命令格式为fabric-ca-client register[flags]。注册新的用户实体身份。

执行注册新用户实体的客户端必须已经通过登记认证,并且拥有足够的权限(所注册用户的hf.Registrar.Roles和affiliation都不能超出调用者属性)来进行注册。

例如通过如下命令来注册新的用户new_user,注册成功后系统会返回用来登记的密码:



$ fabric-ca-client register --id.name new_user --id.type user --id.affiliation
   org1.department1 --id.attr hf.Revoker=true
User provided config file: /.fabric-ca-client/fabric-ca-client-config.yaml
Configuration file location: /.fabric-ca-client/fabric-ca-client-config.yaml
Password: MzklQbeynSqa


当然,也可以通过--id.secret new_user_password来指定登记的密码。

实现过程:首先客户端构造RegistrationRequest结构发送到服务器/register接口。

RegistrationRequest结构包括:

·Name:实体名称;

·Type:实体类型,包括peer、app、user等;

·Secret:实体的登记密码,如果不提供,则服务端会自行生成随机密码;

·MaxEnrollment:该实体最多重复登记次数;

·Affiliation:实体所属机构;

·Attributes:实体的属性信息;

·CAName:CA服务实例名称。

服务端处理通过后,返回RegistrationResponse结构,其中只包括Secret信息。

11.7.6 revoke命令

命令格式为fabric-ca-client revoke[flags]。

revoke命令会吊销指定的证书或者指定实体相关的所有证书。执行revoke命令的客户端身份必须拥有足够的权限(hf.Revoker为true,并且被吊销者机构不能超出吊销者机构的范围)。

例如,通过如下命令吊销用户new_user,并通过-r指定原因:



$ fabric-ca-client revoke -e "new_user" -r "affiliationchange"
[INFO] User provided config file: /.fabric-ca-client/fabric-ca-client-config.yaml
[INFO] Configuration file location: /.fabric-ca-client/fabric-ca-client-config.yaml
Revocation was successful


实现上也是类似的过程,客户端构造RevocationRequest结构发送到服务器/revoke接口。

RevocationRequest结构包括:

·Name:所吊销实体名称,如不提供,则通过序列号和AKI来指定吊销某个证书;

·Serial:所吊销证书的序列号;

·AKI:所吊销证书的颁发者的公钥标识符;

·Reason:吊销的原因;

·CAName:CA服务实例名称。

服务端进行吊销,不返回内容。其中,吊销原因是枚举类型,遵循rfc5280规范:《InternetX.509 Public Key Infrastructure Certificate and Certificate Revocation List(CRL)Profile》。具体类型在http://godoc.org/golang.org/x/crypto/ocsp 中定义,包括如下合法取值:



const (
   Unspecified          = iota
   KeyCompromise        = iota
   CACompromise         = iota
   AffiliationChanged   = iota
   Superseded           = iota
   CessationOfOperation = iota
   CertificateHold      = iota

   RemoveFromCRL      = iota
   PrivilegeWithdrawn = iota
   AACompromise       = iota
)



来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=909

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值