2. CA服务器部署:搭建Fabric CA服务器,注册与登记身份,生成TLS证书,配置中间CA

说实话,很多团队在Fabric网络搭建初期,最容易被忽视的就是CA这一层。大家总觉得「证书嘛,用openssl随便签一个就行」。嗯,我早期也这么干过,结果在扩展节点时被折腾得够呛——证书链对不上、身份重复注册、吊销后无法追溯……从那以后,我老老实实把Fabric CA的部署流程固定下来,每次新项目都按这套走。

这一章,我们就来把CA服务器彻底搞定。包括服务端搭建、身份注册、TLS证书生成,以及中间CA的配置。你跟着走一遍,后面所有节点的证书问题都会清爽很多。

2.1 为什么需要Fabric CA?

Fabric CA本质上是一个证书颁发机构,但它不是普通的CA。它专门为Fabric网络设计,能直接管理组织、节点、用户、管理员这些身份。说白了,它就是整个网络的「身份证办理中心」。

我自己总结过,不用Fabric CA而用手动证书,会踩三个坑:

  • 证书管理混乱——每个节点手动生成,没有统一吊销机制
  • 扩展困难——加一个新peer,得重新生成一整套证书,还得手动同步
  • 安全审计缺失——谁注册了谁、什么时候注册的,完全没有日志

Fabric CA把这些都解决了。它提供RESTful API,支持身份注册、证书续期、吊销,还能配置中间CA做层级化信任链。我个人习惯,只要网络超过3个节点,就一定上Fabric CA。

2.2 整体架构:CA在Fabric网络中的位置

先看一张图,帮你理解CA在整个网络里的角色。这张图我每次培训都会画,因为它把「谁信任谁」的关系讲得很清楚。

Fabric CA 架构与信任链 Fabric CA 架构与信任链 根CA (Root CA) 中间CA (Org1) 中间CA (Org2) 中间CA (Orderer) Peer节点 Peer节点 Orderer节点 客户端用户 信任链说明: • 根CA自签名,是整个网络的信任锚点 • 每个组织拥有自己的中间CA,由根CA签发证书 • 节点和用户的证书由所属组织的中间CA签发 • 验证时逐级回溯到根CA,形成完整的信任链

你看,根CA在最上层,它只做一件事:为中间CA签发证书。中间CA才是真正干活的——为每个组织的Peer、Orderer、客户端签发身份证书和TLS证书。这样做的好处是,根CA的私钥可以离线保存,安全性大大提高。

核心原则:根CA的私钥永远不要放在生产服务器上。我见过有人图方便把根CA和中间CA跑在同一台机器上,结果根私钥泄露,整个网络都得重建。记住,根CA只用来签发中间CA,签完就下线。

2.3 部署Fabric CA服务器

好,开始动手。我们先部署根CA服务器,再部署中间CA。

2.3.1 下载与初始化

Fabric CA的二进制文件可以从官方仓库下载,也可以用Docker镜像。我个人习惯用二进制,调试起来更直观。

# 下载Fabric CA二进制(以1.5.x为例)
wget https://github.com/hyperledger/fabric-ca/releases/download/v1.5.7/hyperledger-fabric-ca-linux-amd64-1.5.7.tar.gz
tar -xzf hyperledger-fabric-ca-linux-amd64-1.5.7.tar.gz
sudo cp bin/* /usr/local/bin/

# 验证安装
fabric-ca-server version
fabric-ca-client version

初始化根CA服务器:

# 创建根CA工作目录
mkdir -p ~/fabric-ca/root-ca
cd ~/fabric-ca/root-ca

# 初始化根CA
fabric-ca-server init -b admin:adminpw --port 7054

# 查看生成的配置文件
ls -la
# 你会看到: ca-cert.pem, ca-key.pem, fabric-ca-server-config.yaml, msp/

这里有个细节:-b admin:adminpw 指定了引导管理员账号。这个账号是CA的第一个身份,用来注册其他所有身份。密码在生产环境一定要改复杂,我一般用32位随机字符串。

2.3.2 配置根CA

编辑 fabric-ca-server-config.yaml,重点关注这几个参数:

参数 说明 我的建议值
port CA服务监听端口 7054(根CA),7055(中间CA)
tls.enabled 是否启用TLS true(生产环境必须开)
ca.registry 身份注册配置 保留admin,删除默认的test用户
ca.affiliations 组织归属配置 按实际组织名配置,如org1, org2
signing.default.expiry 证书默认有效期 87600h(10年,根CA可以长一些)

小技巧:根CA的证书有效期我习惯设10年,中间CA设5年,节点证书设1年。这样既保证长期稳定性,又能定期轮换节点证书降低风险。

2.3.3 启动根CA

# 启动根CA(前台模式,方便看日志)
fabric-ca-server start -b admin:adminpw --port 7054

# 或者用systemd管理(生产环境推荐)
# 创建systemd服务文件 /etc/systemd/system/fabric-ca-root.service
[Unit]
Description=Fabric CA Root Server
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/fabric-ca/root-ca
ExecStart=/usr/local/bin/fabric-ca-server start -b admin:adminpw --port 7054
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

# 启动服务
systemctl daemon-reload
systemctl enable fabric-ca-root
systemctl start fabric-ca-root
systemctl status fabric-ca-root

启动后,用客户端验证一下:

# 设置客户端环境
export FABRIC_CA_CLIENT_HOME=~/fabric-ca/client

# 登录admin
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

# 查看已注册的身份
fabric-ca-client identity list

# 你应该能看到admin身份,类型为client

2.4 注册与登记身份

CA服务器跑起来了,接下来就是注册各种身份。这个过程分两步:注册(register)和登记(enroll)。注册是在CA上创建一个身份记录,登记是实际生成证书。

我打个比方:注册就像去公安局录入个人信息,登记就像拿着身份证去领护照。注册只需要管理员操作,登记可以由用户自己完成。

2.4.1 注册组织管理员

先为每个组织注册一个管理员身份,这个管理员后续可以注册该组织下的所有节点和用户。

# 注册org1的管理员
fabric-ca-client register \
  --id.name org1-admin \
  --id.secret org1-adminpw \
  --id.type client \
  --id.affiliation org1 \
  --id.attrs 'hf.Registrar.Roles=peer,user,client:hf.Registrar.Attributes=*' \
  -u http://admin:adminpw@localhost:7054

# 注册org2的管理员
fabric-ca-client register \
  --id.name org2-admin \
  --id.secret org2-adminpw \
  --id.type client \
  --id.affiliation org2 \
  --id.attrs 'hf.Registrar.Roles=peer,user,client:hf.Registrar.Attributes=*' \
  -u http://admin:adminpw@localhost:7054

注意 hf.Registrar.Roles 这个属性,它决定了这个管理员能注册什么类型的身份。我给了 peer,user,client,这样组织管理员就能注册节点和普通用户了。

2.4.2 注册Peer节点身份

# 用org1管理员注册peer0
fabric-ca-client register \
  --id.name peer0.org1.example.com \
  --id.secret peer0pw \
  --id.type peer \
  --id.affiliation org1 \
  --id.attrs 'hf.IntermediateCA=false' \
  -u http://org1-admin:org1-adminpw@localhost:7054

# 注册peer1
fabric-ca-client register \
  --id.name peer1.org1.example.com \
  --id.secret peer1pw \
  --id.type peer \
  --id.affiliation org1 \
  --id.attrs 'hf.IntermediateCA=false' \
  -u http://org1-admin:org1-adminpw@localhost:7054

2.4.3 登记身份并获取证书

注册完成后,需要登记才能拿到证书文件。登记通常在目标节点上执行,但这里我们先在CA客户端演示:

# 登记org1管理员
fabric-ca-client enroll \
  -u http://org1-admin:org1-adminpw@localhost:7054 \
  -M ~/fabric-ca/client/org1-admin/msp

# 登记peer0
fabric-ca-client enroll \
  -u http://peer0.org1.example.com:peer0pw@localhost:7054 \
  -M ~/fabric-ca/client/peer0.org1.example.com/msp

# 查看生成的证书
ls ~/fabric-ca/client/peer0.org1.example.com/msp/
# signcerts/  - 签名证书(身份证书)
# keystore/   - 私钥
# cacerts/    - 根CA证书
# intermediatecerts/ - 中间CA证书(如果有)

重要提醒:登记时生成的私钥文件一定要妥善保管。我曾经遇到一个项目,运维人员把peer节点的私钥直接放在共享目录里,结果被内部人员拷贝走了。私钥泄露意味着身份可以被冒用,整个通道的信任都会被破坏。建议用HSM(硬件安全模块)或至少加密存储。

2.5 生成TLS证书

Fabric网络中的节点间通信默认使用gRPC,而gRPC需要TLS加密。所以每个节点除了身份证书,还需要TLS证书。

TLS证书和身份证书是两套东西,千万别搞混。身份证书用于「你是谁」,TLS证书用于「通信是否加密」。我见过有人图省事用同一套证书,结果安全审计时被打了回来。

2.5.1 为CA服务器启用TLS

首先,CA服务器本身也要启用TLS,否则客户端和CA之间的通信是明文的。修改根CA的配置文件:

# fabric-ca-server-config.yaml 中TLS部分
tls:
  enabled: true
  certfile: /root/fabric-ca/root-ca/tls-cert.pem
  keyfile: /root/fabric-ca/root-ca/tls-key.pem

生成CA自己的TLS证书:

# 生成TLS证书(自签名,仅用于CA服务器)
fabric-ca-server init -b admin:adminpw --port 7054 --tls.enabled

# 或者手动生成
openssl req -x509 -newkey rsa:4096 -keyout tls-key.pem -out tls-cert.pem -days 3650 -nodes -subj "/CN=ca-root"

# 重启CA
systemctl restart fabric-ca-root

2.5.2 为节点生成TLS证书

节点的TLS证书可以通过CA的TLS CA功能来签发。Fabric CA内置了TLS CA,专门用来签发TLS证书。

# 注册TLS身份(与身份证书分开)
fabric-ca-client register \
  --id.name peer0-tls \
  --id.secret peer0-tls-pw \
  --id.type peer \
  --id.affiliation org1 \
  --id.attrs 'hf.IntermediateCA=false' \
  -u http://org1-admin:org1-adminpw@localhost:7054

# 登记TLS证书(注意--enrollment.profile指定为tls)
fabric-ca-client enroll \
  -u http://peer0-tls:peer0-tls-pw@localhost:7054 \
  --enrollment.profile tls \
  -M ~/fabric-ca/client/peer0.org1.example.com/tls-msp

# TLS证书文件位置
ls ~/fabric-ca/client/peer0.org1.example.com/tls-msp/
# signcerts/  - TLS证书
# keystore/   - TLS私钥

这里的关键是 --enrollment.profile tls,它告诉CA我要签发的是一张TLS证书,而不是身份证书。CA会使用不同的证书链来签发,确保两类证书完全隔离。

2.6 配置中间CA

根CA一般不直接给节点发证书,而是由中间CA来做。中间CA可以部署在每个组织内部,实现证书管理的自治。

2.6.1 在根CA上注册中间CA身份

# 注册中间CA身份(类型为intermediate)
fabric-ca-client register \
  --id.name intermediate-org1 \
  --id.secret intermediate-org1-pw \
  --id.type intermediate \
  --id.affiliation org1 \
  --id.attrs 'hf.IntermediateCA=true' \
  -u http://admin:adminpw@localhost:7054

2.6.2 初始化中间CA

# 创建中间CA工作目录
mkdir -p ~/fabric-ca/intermediate-ca-org1
cd ~/fabric-ca/intermediate-ca-org1

# 初始化中间CA(需要指定父CA信息)
fabric-ca-server init \
  -b intermediate-admin:intermediate-adminpw \
  --port 7055 \
  --ca.name intermediate-org1 \
  --ca.chainfile /root/fabric-ca/root-ca/ca-cert.pem

# 编辑中间CA配置文件
# 关键配置:parent部分指向根CA
# parent:
#   url: http://admin:adminpw@localhost:7054
#   tls:
#     enabled: false

2.6.3 启动中间CA并获取证书链

# 启动中间CA
fabric-ca-server start \
  -b intermediate-admin:intermediate-adminpw \
  --port 7055

# 在另一个终端,用中间CA的管理员登记
fabric-ca-client enroll \
  -u http://intermediate-admin:intermediate-adminpw@localhost:7055 \
  -M ~/fabric-ca/client/intermediate-admin/msp

# 查看证书链
cat ~/fabric-ca/client/intermediate-admin/msp/cacerts/localhost-7055.pem
# 这个文件应该包含中间CA证书和根CA证书(串联在一起)

验证证书链:用openssl验证中间CA证书是否由根CA签发:

openssl verify -CAfile /root/fabric-ca/root-ca/ca-cert.pem \
  ~/fabric-ca/client/intermediate-admin/msp/cacerts/localhost-7055.pem

如果输出 ... OK,说明证书链完整。如果报错,检查根CA的证书和中间CA的签发请求是否匹配。

2.7 实战:完整的CA部署脚本

上面步骤比较多,我整理成一个完整的部署脚本。这个脚本我每次搭建新环境都会用,你直接改参数就能跑。

#!/bin/bash
# fabric-ca-deploy.sh - 一键部署根CA + 中间CA

# ===== 配置参数 =====
ROOT_CA_PORT=7054
INT_CA_PORT=7055
ROOT_CA_ADMIN=admin
ROOT_CA_PW=AdminP@ssw0rd!2024
ORG1_INT_ADMIN=org1-admin
ORG1_INT_PW=Org1P@ssw0rd!2024

# ===== 1. 部署根CA =====
echo ">>> 部署根CA..."
mkdir -p /root/fabric-ca/root-ca
cd /root/fabric-ca/root-ca
fabric-ca-server init -b ${ROOT_CA_ADMIN}:${ROOT_CA_PW} --port ${ROOT_CA_PORT}

# 启动根CA
nohup fabric-ca-server start -b ${ROOT_CA_ADMIN}:${ROOT_CA_PW} --port ${ROOT_CA_PORT} > root-ca.log 2>&1 &
sleep 3

# ===== 2. 注册中间CA身份 =====
echo ">>> 注册中间CA身份..."
export FABRIC_CA_CLIENT_HOME=/root/fabric-ca/client
fabric-ca-client enroll -u http://${ROOT_CA_ADMIN}:${ROOT_CA_PW}@localhost:${ROOT_CA_PORT}
fabric-ca-client register \
  --id.name ${ORG1_INT_ADMIN} \
  --id.secret ${ORG1_INT_PW} \
  --id.type intermediate \
  --id.affiliation org1 \
  --id.attrs 'hf.IntermediateCA=true' \
  -u http://${ROOT_CA_ADMIN}:${ROOT_CA_PW}@localhost:${ROOT_CA_PORT}

# ===== 3. 部署中间CA =====
echo ">>> 部署中间CA..."
mkdir -p /root/fabric-ca/intermediate-ca-org1
cd /root/fabric-ca/intermediate-ca-org1
fabric-ca-server init -b ${ORG1_INT_ADMIN}:${ORG1_INT_PW} --port ${INT_CA_PORT}

# 配置父CA连接(写入配置文件)
cat > fabric-ca-server-config.yaml << EOF
port: ${INT_CA_PORT}
ca:
  name: intermediate-org1
parent:
  url: http://${ROOT_CA_ADMIN}:${ROOT_CA_PW}@localhost:${ROOT_CA_PORT}
  tls:
    enabled: false
signing:
  default:
    expiry: 43800h
  profiles:
    ca:
      expiry: 43800h
      caconstraint:
        isca: true
        maxpathlen: 0
    tls:
      expiry: 8760h
EOF

# 启动中间CA
nohup fabric-ca-server start -b ${ORG1_INT_ADMIN}:${ORG1_INT_PW} --port ${INT_CA_PORT} > int-ca.log 2>&1 &
sleep 3

echo ">>> 部署完成!"
echo "根CA: localhost:${ROOT_CA_PORT}"
echo "中间CA: localhost:${INT_CA_PORT}"

2.8 常见问题与避坑

最后,分享几个我实际踩过的坑:

  • 证书过期导致网络瘫痪——我曾经有一个生产网络,所有节点的证书在同一天过期,整个网络瞬间不可用。从那以后,我强制要求证书有效期错开,并且提前30天设置告警。
  • 中间CA证书链不完整——Peer节点启动时报错 certificate signed by unknown authority,八成是中间CA的证书链没配全。检查 cacerts 目录下是否有根CA证书。
  • 端口冲突——根CA和中间CA默认都用7054端口,部署中间CA时一定要改端口,否则启动失败。
  • 密码强度不够——admin密码用 adminpw 这种,扫描工具几分钟就能爆破。生产环境至少16位,包含大小写字母、数字和特殊字符。

我的习惯:每次部署完CA,我会立即做三件事:1)备份根CA的私钥到离线U盘;2)用openssl验证所有证书链;3)写一个简单的测试脚本,用CA客户端注册一个测试用户并登记,确认全流程通顺。这三步做完,后面基本不会出证书相关的问题。

好了,CA服务器部署这部分就到这里。你跟着把根CA和中间CA搭起来,把身份注册和TLS证书生成跑通,后面所有节点的证书问题都会变得非常清晰。记住,CA是整个网络的信任基石,这一层稳了,上层才能放心扩展。