Как настроить все необходимые сертификаты для Node.js клиента Hyperledger с включенным взаимным TLS? - PullRequest
0 голосов
/ 01 апреля 2020

Любая помощь будет принята с благодарностью.

Я пытаюсь настроить клиент Node.js для выполнения транзакций. TLS полностью включен. У меня нет проблем с вызовом кода и выполнением транзакции с использованием контейнера fabri c -tools docker. Однако я не могу, не знаю, где и как установить ВСЕ параметры для моего Node.js клиента, который я установил в качестве переменных среды для своего контейнера fabri c -tools docker. Я постоянно получаю ошибку TLS Handshake. Я не смог найти какой-либо пример сопоставления, в котором один и тот же вызов цепного кода был выполнен с использованием контейнера fabri c -tools docker и с использованием Node.js ...

в Node.js примерах некоторые параметры устанавливаются в соединении. json, некоторые параметры устанавливаются непосредственно в коде JavaScript, имена параметров не соответствуют 100% именам переменных среды в контейнере docker, что делает поиск в Google также немного трудно для меня.

В моем docker -компонентном файле для CLI установлены следующие переменные env:

      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - FABRIC_LOGGING_SPEC=info
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=hyperledger_exchange_net
      - CORE_PEER_ID=cli-org1
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_MSPCONFIGPATH=/home/crypto/peerOrganizations/org1/users/Admin@org1/msp
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_TLS_CERT_FILE=/home/crypto/peerOrganizations/org1/peers/peer0.org1/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/home/crypto/peerOrganizations/org1/peers/peer0.org1/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/home/crypto/peerOrganizations/org1/peers/peer0.org1/tls/ca.crt
      - CORE_PEER_ADDRESS=peer0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer0:7052
      - CORE_CHAINCODE_KEEPALIVE=10

Работает следующий вызов с использованием fabri c -tools:

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" ^
-e "CORE_PEER_MSPCONFIGPATH=/home/crypto/peerOrganizations/org1/users/Admin@org1/msp" ^
-e "CORE_PEER_TLS_CERT_FILE=/home/crypto/peerOrganizations/org1/peers/peer0.org1/tls/server.crt" ^
-e "CORE_PEER_TLS_KEY_FILE=/home/crypto/peerOrganizations/org1/peers/peer0.org1/tls/server.key" ^
-e "CORE_PEER_TLS_ROOTCERT_FILE=/home/crypto/peerOrganizations/org1/peers/peer0.org1/tls/ca.crt" ^
-e "CORE_PEER_ADDRESS=peer0:7051" ^
-e "CORE_PEER_CHAINCODEADDRESS=peer0:7052" ^
b8fc94760932 peer chaincode invoke -o orderer1:7050 -C data-channel -n exchange-blockchain ^
-c "{\"function\":\"queryAllPressEntries\",\"Args\":[]}" ^
--tls --keyfile /home/crypto/peerOrganizations/org1/users/Admin@org1/msp/keystore/priv_sk --cafile /home/crypto/ordererOrganizations/exchange/tlsca/tlsca.exchange-cert.pem -o orderer1:7050

Как только я переключаюсь на Node.js, понятия не имею :) Вот как выглядит мое соединение. json для приложения Node.js прямо сейчас:

{
    "name": "exchange-blockchain",
    "version": "1.0.0",
    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300"
                },
                "orderer": "300"
            },
        "connection-options": {
        "grpc.max_receive_message_length": -1,
        "grpc.max_send_message_length": -1,
        "grpc.keepalive_time_ms": 120000, 
        "grpc.http2.min_time_between_pings_ms": 120000, 
        "grpc.keepalive_timeout_ms": 20000, 
        "grpc.http2.max_pings_without_data": 0, 
        "grpc.keepalive_permit_without_calls": 1 
    }
        }
    },
    "channels": {
        "data-channel": {
            "orderers": [
                "orderer1"
            ],
            "peers": {
                "peer0": {}
            }
        }
    },
    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0"
            ],
            "certificateAuthorities": [
                "ca-org1"
            ],
            "adminPrivateKey": {
                "path": "certs/admin/priv_sk"
                },
            "signedCert" : {
                "path" : "certs/admin/Admin@org1-cert.pem"
            }
    },
    "orderers": {
        "orderer1": {
            "url": "grpcs://ORDERER_IP:7050",
            "tlsCACerts": {
                "path": "certs/admin/orderer_ca.crt"
            },
            "grpcOptions": {
                "ssl-target-name-override": "orderer1"
            }
        }
    },
    "peers": {
        "peer0": {
            "url": "grpcs://PEER_IP:7051",
            "tlsCACerts": {
                "path": "certs/admin/tlsca-org1.org1-cert.pem"
            },
            "grpcOptions": {
                "ssl-target-name-override": "peer0"
            }
        }
    },
    "certificateAuthorities": {
        "ca-org1": {
            "url": "http://CA_IP:7054",
            "caName": "ca-org1"
        }
    }
}

Часть «тестового» сценария, которая завершается с ошибкой в ​​channel.getChannelConfig ():

const walletPath = 'wallet';
const user = 'Admin';
const userCertPath = 'certs/admin/ca-org1.org1-cert.pem';
const userKeyPath = 'certs/admin/priv_sk';
const clientKeyPath = 'certs/admin/client.key';//fs.readFileSync(path.join(__dirname, 'somepath/tls/client.key'));
const clientCertPath = 'certs/admin/client.crt'; //fs.readFileSync(path.join(__dirname, 'somepath/tls/client.crt'));
const serverCertPath = 'certs/admin/tlsca-org1.org1-cert.pem';
const mspID = 'Org1MSP';
...
        const walletPath = path.join(process.cwd(), 'wallet');
        const wallet = new FileSystemWallet(walletPath);
        console.log(`Wallet path: ${walletPath}`);
        let identity;
        let userCertPemRead = fs.readFileSync(userCertPath).toString('utf8');
        let userPrvKeyPemRead = fs.readFileSync(userKeyPath).toString('utf8');
        let clientKey = fs.readFileSync(clientKeyPath);
        let clientCert = fs.readFileSync(clientCertPath);
        let serverCert = fs.readFileSync(serverCertPath);
        //client.setTlsClientCertAndKey(Buffer.from(clientCert).toString(), Buffer.from(clientKey).toString());
        identity = X509WalletMixin.createIdentity(mspID, userCertPemRead, userPrvKeyPemRead);
        await wallet.import(user, identity);
        // Create a new gateway for connecting to our peer node.
        const gateway = new Gateway();
        const opts = {
            wallet: wallet,
            identity: 'Admin',
            discovery: {enabled: false, asLocalhost: false},
            clientTlsIdentity: 'Admin'
        };
        await gateway.connect(ccp, opts);
        const client = await gateway.getClient();
        client.setTlsClientCertAndKey(Buffer.from(clientCert).toString(), Buffer.from(clientKey).toString());
        const channel = client.getChannel("data-channel");
        await channel.getChannelConfig();

Ошибка в CLI:

E0401 16:58:23.845000000  7572 ssl_transport_security.cc:1245] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
Failed to evaluate transaction: Error: 14 UNAVAILABLE: failed to connect to all addresses

Ошибка в одноранговом узле:

2020-04-01 15:03:39.659 UTC [core.comm] ServerHandshake -> ERRO 6ef38 TLS handshake failed with error EOF server=PeerServer remoteaddress=

Каковы имена соответствующих конфигов, переменных, объектов, которые в моем случае нужно настроить Node.js на работу?

1 Ответ

0 голосов
/ 08 апреля 2020

Это была моя собственная проблема. Я работал над несколькими версиями кода одновременно. Я менял connection_config в одном приложении, но тестировал его с другим. Рабочий профиль подключения и Node.js выглядят так:

{
    "name": "my-blockchain",
    "version": "1.0.0",
    "client": {
        "organization": "org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300"
                },
                "orderer": "300"
            },
        "connection-options": {
        "grpc.max_receive_message_length": -1,
        "grpc.max_send_message_length": -1,
        "grpc.keepalive_time_ms": 120000, 
        "grpc.http2.min_time_between_pings_ms": 120000, 
        "grpc.keepalive_timeout_ms": 20000, 
        "grpc.http2.max_pings_without_data": 0, 
        "grpc.keepalive_permit_without_calls": 1 
    }
        }
    },
    "channels": {
        "data-channel": {
            "orderers": [
                "orderer1"
            ],
            "peers": {
"peer0" : {},"peer1" : {}
            }
        }
    },
    "organizations": {
        "org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0","peer1"
            ],
            "certificateAuthorities": [
                "ca-org1"
            ]
        }
    },
    "orderers": {

            "orderer1": {
            "url": "grpcs://ORDERER_IP:7050",
            "tlsCACerts": {
                "path": "certs/orderer_ca.crt"
            },
            "grpcOptions": {
                "ssl-target-name-override": "orderer1"
            }}
    },
    "peers": {

                "peer0": {
            "url": "grpcs://PEER_0_IP:7051",
            "tlsCACerts": {
                "path": "certs/org1/peer_ca.crt"
            },
            "grpcOptions": {
                "ssl-target-name-override": "peer0"
            }
        },
                "peer1": {
            "url": "grpcs://PEER_1_IP:7051",
            "tlsCACerts": {
                "path": "certs/org1/peer_ca.crt"
            },
            "grpcOptions": {
                "ssl-target-name-override": "peer1"
            }
        }
    },
    "certificateAuthorities": {
"ca-org1": { "url": "http://CA_IP:7054", "caName": "ca-org1" }
    }
}

и

...
    let userCertPemRead = fs.readFileSync(userCertPath).toString('utf8');
    let userPrvKeyPemRead = fs.readFileSync(userKeyPath).toString('utf8');
    let clientKey = fs.readFileSync(clientKeyPath);
    let clientCert = fs.readFileSync(clientCertPath);
    identity = X509WalletMixin.createIdentity(mspID, userCertPemRead, userPrvKeyPemRead);
    await wallet.import(user, identity);
    console.log("Gateway connect");
    let startTime = new Date();
    console.log(gateway);
    await gateway.connect(ccp, { wallet, identity: user, discovery: { enabled: false } });
    const client = await gateway.getClient();
    client.setTlsClientCertAndKey(Buffer.from(clientCert).toString(), Buffer.from(clientKey).toString());
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...