Hyperledger Fabric CA 注册时报缺少 Enrollment 信息怎么办?
结论
VM 2 当前使用的 MSP 中缺少可用的注册者证书和私钥,或客户端正在错误的 MSP 目录中查找凭据。仅复制 tls-ca-cert.pem 并设置 FABRIC_CA_CLIENT_TLS_CERTFILES,无法提供执行 register 所需的身份凭据。
VM 0、VM 1 上执行 enroll 时,凭据会保存在各自机器的客户端目录中,不会自动同步到 VM 2。要在 VM 2 注册身份,需要先取得目标 CA 下有注册权限的身份凭据,并让 register 使用对应的 MSP。Fabric CA 要求发起注册的身份已完成 enroll,且具备相应权限。Fabric CA 用户指南
TLS 证书和管理员凭据有什么区别?
这次配置涉及两类用途不同的材料:
FABRIC_CA_CLIENT_TLS_CERTFILES指定用于验证 CA Server HTTPS 证书的信任材料。- 注册者 MSP 中的签名证书和对应私钥,用于证明请求者身份并签署注册请求。
报错指出,客户端在以下位置没有找到可用的 enrollment 信息:
/home/ggggg/fabric-ca-client/msp/signcerts/cert.pem
/home/ggggg/fabric-ca-client/msp/keystore/key.pem
FABRIC_CA_CLIENT_HOME 用于指定客户端工作目录,设置它不会自动生成证书和私钥。enroll 成功后,客户端才会将这些材料写入 MSP。Fabric CA 用户指南
应先排查本地凭据。当前错误不能证明 CA Server 的网络连接或注册授权已经通过。
如何在 VM 2 上完成注册?
1. 确认要操作哪个 CA
原命令指向:
https://hyprldgr-tls-ca:7054
如果要为 peer 申请 TLS 证书,应在 TLS CA 中注册该身份。如果要获取 peer 加入组织所需的 enrollment 身份证书,应使用 VM 1 上的 Enrollment/Org CA,以及该 CA 下的注册者凭据。
同一个 peer 可以分别在两个 CA 中注册,但两个 CA 的身份记录和注册权限需要分别配置。Fabric CA 身份注册与证书申请指南
2. 在 VM 2 上 enroll TLS CA 的注册者
以下示例继续操作原命令中的 TLS CA,假设该 CA 已有一个允许注册 peer 的管理员身份,且其 enrollment 次数限制允许再次申请证书。
将示例中的管理员 ID、secret 和证书路径替换为实际值:
export FABRIC_CA_CLIENT_HOME="$HOME/fabric-ca-client/tls-ca-admin"
export FABRIC_CA_CLIENT_TLS_CERTFILES='/absolute/path/to/tls-ca-cert.pem'
TLS_CA_ADMIN_ID='your-tls-ca-admin-id'
TLS_CA_ADMIN_SECRET='your-tls-ca-admin-secret'
fabric-ca-client enroll \
-u "https://${TLS_CA_ADMIN_ID}:${TLS_CA_ADMIN_SECRET}@hyprldgr-tls-ca:7054" \
--mspdir "$FABRIC_CA_CLIENT_HOME/msp"
这里 enroll 的是已有注册权限的管理员身份。不要将尚未注册的 peer1org1 用作注册者。
如果已有管理员 MSP,也可以让客户端使用该 MSP。它必须属于目标 CA,并包含有效的签名证书及匹配的私钥;只有公开的 CA 证书不够。
3. 使用同一个管理员 MSP 执行 register
fabric-ca-client register -d \
-u https://hyprldgr-tls-ca:7054 \
--mspdir "$FABRIC_CA_CLIENT_HOME/msp" \
--id.name peer1org1 \
--id.secret peer1org1pw \
--id.type peer
两条命令显式使用同一个 --mspdir,可以避免 enroll 写入一个目录,而 register 从另一个目录读取凭据。部署指南中的 --mspdir 同样用于指定有权执行注册的管理员凭据目录。Fabric CA 部署步骤
示例假设 fabric-ca-client 所在目录已加入 PATH。如果二进制文件位于当前目录,应使用 ./fabric-ca-client。原命令中的 . /fabric-ca-client 会让 shell 尝试加载文件,应改成实际的可执行文件调用方式。
也可以在已经拥有管理员凭据的 VM 0 上执行 register,再让 VM 2 使用注册得到的身份 ID 和 secret 执行 enroll。这样无需把管理员私钥复制到 VM 2。
bootstrap 身份为什么是 client?
bootstrap 身份显示为 client,不能据此判断它没有 CA 管理权限。Fabric CA 的配置示例中,bootstrap 身份可以使用 type: client,同时拥有 hf.Registrar.Roles 等管理属性。Fabric CA 用户注册表配置
对于本次 --id.type peer 请求,应检查:
- 注册者的
hf.Registrar.Roles是否包含peer,或具有允许该类型的通配权限。 - 注册者的 affiliation 是否允许管理待注册身份的 affiliation。
- 如果请求还携带身份属性,注册者是否有权分配这些属性。
把身份类型改为 admin,不会自动补齐注册权限,也不会解决 VM 2 缺少本地凭据的问题。Fabric CA 注册授权规则
后续仍报错时检查什么?
如果仍提示缺少 enrollment 信息,检查 enroll 的实际输出目录、--mspdir、当前运行用户,以及证书和私钥文件的读取权限。私钥文件名应以实际生成结果为准,不要仅为匹配报错而重命名文件。
如果错误变成授权失败,检查注册者属性和 affiliation。如果变成 TLS 或连接错误,检查主机名解析、端口、服务端证书及信任链。相互 ping 通只说明基本网络可达。
上述过程可直接使用 CA Server 和 CA Client 完成,无需引入 Docker 或 Kubernetes。
备注:内容仅供参考。
