Fabric-CA-001: Fabric-CA基本介绍

Fabric-CA-001:Fabric-CA基本介绍

先附上一份通用的fabric网络配置文件:

version: '2'

networks:
  fabric-ca:

services:
  ca-tls:
    container_name: ca-tls
    image: hyperledger/fabric-ca:latest
    command: sh -c 'fabric-ca-server start -d -b tls-ca-admin:tls-ca-adminpw --port 7052'
    environment:
        - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
        - FABRIC_CA_SERVER_TLS_ENABLED=true
        - FABRIC_CA_SERVER_CSR_CN=tls-ca
        - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
        - FABRIC_CA_SERVER_DEBUG=true
    volumes:
        - /tmp/hyperledger/tls-ca:/tmp/hyperledger/fabric-ca
    networks:
        - fabric-ca
    ports:
        - 7052:7052

  rca-org0:
    container_name: rca-org0
    image: hyperledger/fabric-ca:latest
    command: sh -c 'fabric-ca-server start -d -b rca-org0-admin:rca-org0-adminpw --port 7053'
    environment:
        - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
        - FABRIC_CA_SERVER_TLS_ENABLED=true
        - FABRIC_CA_SERVER_CSR_CN=rca-org0
        - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
        - FABRIC_CA_SERVER_DEBUG=true
    volumes:
        - /tmp/hyperledger/org0/ca:/tmp/hyperledger/fabric-ca
    networks:
        - fabric-ca
    ports:
        - 7053:7053

  rca-org1:
    container_name: rca-org1
    image: hyperledger/fabric-ca:latest
    command: sh -c 'fabric-ca-server start -d -b rca-org1-admin:rca-org1-adminpw --port 7054'
    environment:
        - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
        - FABRIC_CA_SERVER_TLS_ENABLED=true
        - FABRIC_CA_SERVER_CSR_CN=rca-org1
        - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
        - FABRIC_CA_SERVER_DEBUG=true
    volumes:
        - /tmp/hyperledger/org1/ca:/tmp/hyperledger/fabric-ca
    networks:
        - fabric-ca
    ports:
        - 7054:7054

  rca-org2:
    container_name: rca-org2
    image: hyperledger/fabric-ca:latest
    command: /bin/bash -c 'fabric-ca-server start -d -b rca-org2-admin:rca-org2-adminpw --port 7055'
    environment:
        - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
        - FABRIC_CA_SERVER_TLS_ENABLED=true
        - FABRIC_CA_SERVER_CSR_CN=rca-org2
        - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
        - FABRIC_CA_SERVER_DEBUG=true
    volumes:
        - /tmp/hyperledger/org2/ca:/tmp/hyperledger/fabric-ca
    networks:
        - fabric-ca
    ports:
        - 7055:7055

  peer1-org1:
    container_name: peer1-org1
    image: hyperledger/fabric-peer:latest
    environment:
        - CORE_PEER_ID=peer1-org1
        - CORE_PEER_ADDRESS=peer1-org1:7051
        - CORE_PEER_LOCALMSPID=org1MSP
        - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
        - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca
        - FABRIC_LOGGING_SPEC=info
        - CORE_PEER_TLS_ENABLED=true
        - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/signcerts/cert.pem
        - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer1/tls-msp/keystore/key.pem
        - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
        - CORE_PEER_GOSSIP_USELEADERELECTION=true
        - CORE_PEER_GOSSIP_ORGLEADER=false
        - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org1:7051
        - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer1
    volumes:
        - /var/run:/host/var/run
        - /tmp/hyperledger/org1/peer1:/tmp/hyperledger/org1/peer1
    ports:
        - 7051:7051
    networks:
        - fabric-ca

  peer2-org1:
    container_name: peer2-org1
    image: hyperledger/fabric-peer:latest
    environment:
        - CORE_PEER_ID=peer2-org1
        - CORE_PEER_ADDRESS=peer2-org1:8051
        - CORE_PEER_LOCALMSPID=org1MSP
        - CORE_PEER_LISTENADDRESS=0.0.0.0:8051
        - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer2/msp
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca
        - FABRIC_LOGGING_SPEC=info
        - CORE_PEER_TLS_ENABLED=true
        - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/signcerts/cert.pem
        - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer2/tls-msp/keystore/key.pem
        - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
        - CORE_PEER_GOSSIP_USELEADERELECTION=true
        - CORE_PEER_GOSSIP_ORGLEADER=false
        - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2-org1:8051
        - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
        - CORE_PEER_GOSSIP_BOOTSTRAP=peer1-org1:7051
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer2
    volumes:
        - /var/run:/host/var/run
        - /tmp/hyperledger/org1/peer2:/tmp/hyperledger/org1/peer2
    ports:
        - 8051:8051      
    networks:
        - fabric-ca

  peer1-org2:
    container_name: peer1-org2
    image: hyperledger/fabric-peer:latest
    environment:
        - CORE_PEER_ID=peer1-org2
        - CORE_PEER_ADDRESS=peer1-org2:9051
        - CORE_PEER_LOCALMSPID=org2MSP
        - CORE_PEER_LISTENADDRESS=0.0.0.0:9051
        - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer1/msp
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca
        - FABRIC_LOGGING_SPEC=info
        - CORE_PEER_TLS_ENABLED=true
        - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/signcerts/cert.pem
        - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer1/tls-msp/keystore/key.pem
        - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
        - CORE_PEER_GOSSIP_USELEADERELECTION=true
        - CORE_PEER_GOSSIP_ORGLEADER=false
        - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org2:9051
        - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer1
    volumes:
        - /var/run:/host/var/run
        - /tmp/hyperledger/org2/peer1:/tmp/hyperledger/org2/peer1
    ports:
        - 9051:9051
    networks:
        - fabric-ca

  peer2-org2:
    container_name: peer2-org2
    image: hyperledger/fabric-peer:latest
    environment:
        - CORE_PEER_ID=peer2-org2
        - CORE_PEER_ADDRESS=peer2-org2:10051
        - CORE_PEER_LOCALMSPID=org2MSP
        - CORE_PEER_LISTENADDRESS=0.0.0.0:10051
        - CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer2/msp
        - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
        - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca
        - FABRIC_LOGGING_SPEC=info
        - CORE_PEER_TLS_ENABLED=true
        - CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/signcerts/cert.pem
        - CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer2/tls-msp/keystore/key.pem
        - CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
        - CORE_PEER_GOSSIP_USELEADERELECTION=true
        - CORE_PEER_GOSSIP_ORGLEADER=false
        - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2-org2:10051
        - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
        - CORE_PEER_GOSSIP_BOOTSTRAP=peer1-org2:9051
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer2
    volumes:
        - /var/run:/host/var/run
        - /tmp/hyperledger/org2/peer2:/tmp/hyperledger/org2/peer2
    ports:
        - 10051:10051
    networks:
        - fabric-ca

  orderer1-org0:
    container_name: orderer1-org0
    image: hyperledger/fabric-orderer:latest
    environment:
        - ORDERER_HOME=/tmp/hyperledger/orderer
        - ORDERER_HOST=orderer1-org0
        - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
        - ORDERER_GENERAL_GENESISMETHOD=file
        - ORDERER_GENERAL_GENESISFILE=/tmp/hyperledger/org0/orderer/genesis.block
        - ORDERER_GENERAL_LOCALMSPID=org0MSP
        - ORDERER_GENERAL_LOCALMSPDIR=/tmp/hyperledger/org0/orderer/msp
        - ORDERER_GENERAL_TLS_ENABLED=true
        - ORDERER_GENERAL_TLS_CERTIFICATE=/tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
        - ORDERER_GENERAL_TLS_PRIVATEKEY=/tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem
        - ORDERER_GENERAL_TLS_ROOTCAS=[/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem]
        - ORDERER_GENERAL_LOGLEVEL=debug
        - ORDERER_DEBUG_BROADCASTTRACEDIR=data/logs
    volumes:
        - /tmp/hyperledger/org0/orderer:/tmp/hyperledger/org0/orderer/
    ports:
        - 7050:7050
    networks:
        - fabric-ca

里面的目录都可以自己更改。

 

1: rca-org1容器举例说明

docker-compose up -d rca-org1

目录信息:

两个文件: ca-cert.pem 和 tls-cert.pem, 查看一下具体的文件信息:

ca-cert.pem: 

openssl x509 -in .\ca-cert.pem -noout -subject -issuer
>>
subject=C = US, ST = North Carolina, O = Hyperledger, OU = Fabric, CN = rca-org1
issuer=C = US, ST = North Carolina, O = Hyperledger, OU = Fabric, CN = rca-org1

tls-cert.pem:

openssl x509 -in .\tls-cert.pem -noout -subject -issuer
>>
subject=C = US, ST = North Carolina, O = Hyperledger, OU = Fabric, CN = 5dc1c0eb3394
issuer=C = US, ST = North Carolina, O = Hyperledger, OU = Fabric, CN = rca-org1

ca-cert.pem 是org1的身份根证书,是自签名的证书(issuer = subject),所有被发布和被签名(由rca-org1的私钥)的证书都可以被根证书进行验证。从而验证已有证书的合法性。

tls-cert.pem 由rca-org1发布的,是一个TLS服务器级的证书,仅用于其他服务和这个rca-org1的通讯。 具体的说,当客户机访问rca-org1时,rca-org1将向客户机提供这个服务器证书。客户端将使用颁发者(即根CA证书 【是ca-cert.pem】)来验证此服务器证书,并确认客户端正在与正确的服务器(rca-rg1)通信,并且客户端与rca-org1之间的通信是加密的。

 

查看私钥(secret keys) ,对应上面的两个证书,存储在msp/keystore

从私钥中导出公钥,并和证书中的公钥进行对比,确定密钥对。

openssl ec -in .\msp\keystore\293779faeff36adfcf3b396f3356c1cb514124af328431f24a48e678d8e6f047_sk -pubout
>>
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnIDJa3ZohFnzMtqY+HOQofPj8+Ry
IuVmcb72Bl4j8jagDO7PC4ToCF7Zlp/0TZd+VKH7f6NKBEPbuEz8BBsIpQ==
-----END PUBLIC KEY-----


openssl x509 -in .\ca-cert.pem -noout -pubkey
>>
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnIDJa3ZohFnzMtqY+HOQofPj8+Ry
IuVmcb72Bl4j8jagDO7PC4ToCF7Zlp/0TZd+VKH7f6NKBEPbuEz8BBsIpQ==
-----END PUBLIC KEY-----

tls-cert.pem

最后再说明一下上面tls-cert.pem 文件,它是fabric-ca服务器签发的第一个证书,在fabric-ca-server.db中查看:

数据库中对应的证书id: 5dc1c0eb3394, 和上面tls-cert.pem是一致的。 所以tls-cert.pem是ca签发的第一个证书,用于端对端通信。

 

2 TLS的一些补充

TLS协议的主要目的是保证通信双方的安全。这包括端点身份验证(确保与正确的目标通信)和消息安全性(确保消息被加密和身份验证)。

这里有一些关于TLS的历史。TLS 1.0由SSL发展而来,于1999年发布。由于TLS 1.1在2006年的短暂寿命,TLS 1.2在2008年发布,它是当今互联网上最常用的版本。Fabric支持v2.2之前的TLS 1.2。TLS 1.3于2018年发布,并在最新发布的Fabric v2.2(2020年7月)中得到支持。

TLS同时使用对称和非对称加密。

  • 对称加密:双方使用相同的密钥(通常称为共享密钥)对消息进行加密/解密和身份验证。
  • 非对称密码学通常称为公钥密码学,它不同于对称密码学,因为它涉及多个密钥。在这种情况下,每一方都有一个密钥对。这个密钥对在数学上是相关的,用一个密钥加密的消息只能由密钥对中的另一个密钥解密。在实际使用中,密钥对中的一个密钥被指定为私有密钥,由密钥所有者保存,而另一个密钥被指定为公开密钥,为公众所知。公钥密码学的名称就是从这个名称而来的。

 

乍一看,非对称密码学似乎更先进,但实际上它的操作成本非常高。在TLS上下文中,消息加密使用对称密码学完成,而非对称密码学用于密钥交换/生成和证书(身份)验证。

 

证书认证

可以将证书视为公钥和身份的关联,由某些权威机构证明,称为证书颁发机构,CAs

首先看一下tls-cert.pem文件,里面有一些重要信息

  • subject's identity
  • subject's public key
  • issuer's (CA's) identity
  • issuer's (CA's) digital signature of this certificate

当我们得到这样一份证书,需要去验证是否有效。 一个最简单并且最基础的方式是使用CA's public key 去验证 signature,如果验证通过,则我们信任这份证书中的身份和public key.

但是现在还需要 CA's public key ,在tls-ca证书中没有,那么就是在ca-cert.pem文件中了。 

由CA根证书提供的 public key 去验证由CA签发的证书。

Fabric中的TLS 和 身份系统之间存在混淆,因为两者都是通过证书颁发机构(CA)实现的,事实上,身份部分,或者称为MSP,是Fabric网络中一个重要得多的元素,作为一个被许可的区块链环境。 TLS 在技术上是一个选项,甚至可以在不影响Fabric操作的情况下关闭。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值