Hyperledger Fabric Node.js SDK注册失败:CA 'my-ca'不存在求助
我在运行Hyperledger Fabric网络的环境中,尝试集成balance transfer node app示例,执行下面的curl命令时遇到了错误:
curl -s -X POST http://localhost:4000/users -H "content-type: application/x-www-form-urlencoded" -d 'username=Jim&orgName=Org1'
返回的错误信息:
[2018-05-16 08:11:43.689] [ERROR] Helper - Failed to get registered user: Jim with error: Error: Enrollment failed with errors [[{"code":19,"message":"CA 'my-ca' does not exist"}]]
我的network-config.yaml里已经配置了相关参数:
... organizations: Org1: mspid: org1MSP peers: - peer0 certificateAuthorities: - my-ca adminPrivateKey: path: $PATH_TO_KEYSTORE signedCert: path: $PATH_TO_SIGNED_CERTS ... certificateAuthorities: my-ca: httpOptions: verify: false tlsCACerts: path: $PATH_TO_CA_CERT ...
而且我已经通过FABRIC_CA_SERVER_CA_NAME在Fabric CA容器中定义了CA名称,请问问题出在哪里?
排查与解决方法
这个错误核心是应用无法匹配到你配置的CA实例,结合你的设置,我推荐从这几个方向排查:
1. 严格校验CA名称的一致性
虽然你设置了FABRIC_CA_SERVER_CA_NAME,但一定要确认这个环境变量的值完全等于network-config.yaml里的my-ca——Fabric CA对名称的匹配是大小写敏感的,也容不下多余的空格或特殊字符。比如如果容器里设置的是My-CA或者my_ca,哪怕只是大小写不一样,都会触发这个“CA不存在”的错误。
你可以通过查看CA容器的环境变量来确认实际的CA名称:
# 查看CA容器的环境变量 docker exec <your-ca-container-name> env | grep FABRIC_CA_SERVER_CA_NAME
2. 确认network-config.yaml的加载与路径正确性
balance transfer应用可能没有正确加载你修改后的配置文件,或者配置里的路径占位符没替换成实际值:
- 检查应用启动时的日志,确认它加载的是你修改的那个
network-config.yaml文件,而不是默认的副本; - 把配置里的
$PATH_TO_KEYSTORE、$PATH_TO_SIGNED_CERTS、$PATH_TO_CA_CERT替换成服务器上的实际文件路径(比如/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/xxx_sk),如果路径错误,应用无法读取CA的证书,也会导致无法识别CA。
3. 验证CA容器的可达性
先确认CA容器是否正常运行,以及应用能否访问到它:
- 用
docker ps查看CA容器的状态,确保它处于Up状态; - 直接访问CA的端点测试连通性,比如:
如果返回CA的信息,说明CA本身是正常的;如果无法访问,检查容器的端口映射是否正确,或者应用和CA是否在同一个Docker网络中。curl http://<ca-container-ip>:<ca-port>/cainfo
4. 检查CA服务器的配置文件冲突
如果你的CA容器启动时使用了自定义的fabric-ca-server-config.yaml,要注意配置文件里的ca.name字段会覆盖FABRIC_CA_SERVER_CA_NAME环境变量。你可以进入CA容器查看这个配置文件:
docker exec <your-ca-container-name> cat /etc/hyperledger/fabric-ca-server/fabric-ca-server-config.yaml
确认里面的ca.name值也是my-ca,如果不是,修改后重启CA容器即可。
内容的提问来源于stack exchange,提问作者Adriano V. dos Santos

