bsn-sdk-go

command
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 23, 2020 License: Apache-2.0 Imports: 5 Imported by: 0

README

SDK调用参考

Go语言SDK

1. 调用前准备
应用参数

应用参数是用户在参与应用成功之后在应用详情页面获取,或者由本地设置的一些参数,具体包含以下参数

  • 节点网关接口地址: 参与的城市节点的节点网关的调用地址
  • 用户编号: 用户的编号
  • 应用编号: 参与的应用的编号
  • 应用公钥: 用户参与成功之后下载的节点网关的应用公钥
  • 应用私钥: 托管类型应用再参与成功之后由BSN生成的应用公钥,非托管应用为在参与应用时上传的公钥所对应的私钥
  • Https证书: 调用https网关接口时使用的https证书
本地参数
  • 证书存储目录: 用来存储非托管应用在调用用户证书登记时生成的用户私钥和证书的目录
2. 准备调用
导入sdk包

需要引入下面的包

import (
    "hyperledger.abchain.org/adapter/hyfabric/bsnclient/bsn-sdk-go/pkg/client/fabric"
    "hyperledger.abchain.org/adapter/hyfabric/bsnclient/bsn-sdk-go/pkg/core/config"
	)
初始化config

可以初始化一个存储所有配置的对象,这些具体的配置信息应当由调用者根据各自的项目配置或者读取之后,在调用时传入,
在config的Init方法中实现了获取一个App基础信息的操作,该操作请不要频繁的调用,该接口将占用您的TPS和流量,可以在项目使用一个静态对象存储config在需要时使用。
值得注意的是,在配置证书的时候,应用的证书(即用来签名和验签的证书)是直接传证书内容,而Https的证书是证书对于项目根
目录的文件路径(这与之前的示例代码一致)。

	api:="" //节点网关地址
	userCode:="" //用户编号
	appCode :="" //应用编号
	puk :="" //应用公钥
	prk :="" //应用私钥
	mspDir:="" //证书存储目录
	cert :="" //证书
	config,err :=config.NewConfig(api, userCode, appCode, puk, prk, mspDir, cert )
	if err !=nil{
	    log.Fatal(err)
	}
初始化Client

使用已经生成的配置对象,调用以下代码可以创建一个Client对象,用来调用节点网关

	client,err :=fabric.InitFabricClient(config)
	if err !=nil{
	    log.Fatal(err)
	}
调用接口

每一个网关接口已经封装了请求和响应的参数对象,只需要赋值就可直接调用,方法内已经实现了签名和验签的操作。
以下为注册子用户的调用操作,其他类似。

	req :=user.RegisterReqDataBody{
	    Name:"abc",
	    Secret:"123456",
 	}
	
 	res,err :=client.RegisterUser(req)
 	if err !=nil{
	    log.Fatal(err)
 	}
	
 	if res.Header.Code != 0{
	    log.Fatal( res.Header.Msg)
 	}
3.一些其他说明
非托管应用的用户身份证书的说明

由于非托管的应用在调用网关进行交易的时候所需要的用户证书需要用户自己生成,其流程是:注册用户->登记用户证书 。在登记用户证书的操作中,会由本地生成一对秘钥,然后通过秘钥导出证书的CSR文件(证书申请文件),调用用户证书 登记接口获取一个有效的证书,使用该证书才能在通过托管应用交易处理接口中正常的发起交易。 需要注意的是在CSR文件中设置CN时,并不直接是注册的Name,而是由Name和AppCode拼接的名称,格式为Name@AppCode 。 该操作是在 FabricClientEnrollUser方法中实现的。

证书的存储 是通过 util中的keystoreuserstore实现的,该方法只存储本地文件形式的证书,如果需要其 他形式的证书存储方式。是需要实现具体的接口即可,详细请参考具体的代码。 keystore的实现参考了fabric-sdk-go中的实现方式,通过计算证书的SKI区分私钥,也可以通过其他方式区分证书和私钥的关系

关于加密

为方便在进行数据交易的上链操作中对数据进行加密解密,SDK中实现了一种对称加密AES和一种非对称加密SM2算法
其中对称加密为AES具体调用如下

	data :=[]byte("abc")
	key :=[]byte("123456")

	//CBC模式,秘钥不足16位 PKCS7填充秘钥
	key = keystore.Pkcs7PaddingKey(key)
	//加密
	cr ,err :=keystore.AESCBCPKCS7Encrypt(key,data)
	if err !=nil{
	    t.Fatal(err)
	}

	//转hex输出
	fmt.Println("加密后:",hex.EncodeToString(cr))

	//解密
	data,err = keystore.AESCBCPKCS7Decrypt(key,cr)
	if err !=nil{
	    t.Fatal(err)
	}

	fmt.Println("解密后:",string(data))

非对称加密SM2,具体如下,在该方法中同时实现了SM2的签名和验签

非对称加密中由公钥加密,私钥进行解密

	puk := ``//公钥
	prik := ``//私钥
	sm, err := sm2.NewSM2Handle(puk, prik)
	if err != nil {
	    t.Fatal(err)
	}
	data :=[]byte("abc")
	cr ,err :=sm.Encrypt(data)
	if err != nil {
	    t.Fatal(err)
	}
	fmt.Println("加密后:",hex.EncodeToString(cr))
	data,err = sm.Decrypt(cr)
	if err != nil {
	    t.Fatal(err)
	}
	fmt.Println("解密后:",string(data))
关于秘钥生成

在BSN中,fabric框架的密钥格式为ECDSAsecp256r1曲线,而fisco-bcos框架的密钥格式为SM2 在用户参与非托管应用时需要生成对应格式的密钥并上传。
下面介绍这两种密钥的生成,秘钥的生成是使用openssl生成的,其中SM2秘钥的生成需要openssl1.1.1及以上版本

注:以下命令是在linux环境下执行的

1. ECDSA(secp256r1)的密钥生成
  • 生成私钥
openssl ecparam -name prime256v1 -genkey -out key.pem
  • 导出公钥
openssl ec -in key.pem -pubout -out pub.pem
  • 导出pkcs8格式私钥

由于部分语言中使用pkcs8格式的密钥比较方便,可以使用下面的命令导出pkcs8格式私钥
在本sdk中使用的私钥即为pkcs8格式

openssl pkcs8 -topk8 -inform PEM -in key.pem -outform PEM -nocrypt -out key_pkcs8.pem

通过以上命令可以生成三个文件
key.pem :私钥
pub.pem :公钥
key_pkcs8.pem :pkcs8格式私钥

2.SM2格式秘钥生成

首先需要检查openssl的版本是否支持SM2格式秘钥生成,可以使用下面的命令

openssl ecparam -list_curves | grep SM2

如果输出以下内容,则表示支持,

SM2       : SM2 curve over a 256 bit prime field

否则需要去官网下载1.1.1或者以上版本, 这是使用的为1.1.1d版本,
官网下载地址:https://www.openssl.org/source/openssl-1.1.1d.tar.gz

  • 生成私钥
openssl ecparam -genkey -name SM2 -out sm2PriKey.pem
  • 导出公钥
openssl ec -in sm2PriKey.pem -pubout -out sm2PubKey.pem
  • 导出pkcs8格式私钥

由于部分语言中使用pkcs8格式的密钥比较方便,可以使用下面的命令导出pkcs8格式私钥
在本sdk中使用的私钥即为pkcs8格式

openssl pkcs8 -topk8 -inform PEM -in sm2PriKey.pem -outform pem -nocrypt -out sm2PriKeyPkcs8.pem

通过以上命令可以生成三个文件
sm2PriKey.pem :私钥
sm2PubKey.pem :公钥
sm2PriKeyPkcs8.pem :pkcs8格式私钥

Documentation

Overview

*

  • @Author: Gao Chenxi
  • @Description:
  • @Date: 2020/4/1 4:35 PM
  • @File: main

Directories

Path Synopsis
pkg
third_party

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL