meshplus/pier

json-rpc supports https

DiyiWi opened this issue · 1 comments

赛题5:网关接入中继链证书准入机制

在联盟链场景下,需要对接入的成员有相应的准入许可。在跨链场景下也是类似,网关代表应用链接入到跨链系统中时,必须获取到中继链联盟的许可,才可以获取相应的跨链交易数据。

解题思路:

增加准入机制时,主要涉及到两个部分:客户端SDK和中继链。跨链网关在中继模式启动时需要向中继链请求许可,中继链收到SDK/跨链网关的请求时,也必须检查相应的许可是否正确。这里许可机制一般采用证书来实现。

  1. 参考meshplus/bitxhub项目中cmd-client模块的HTTPS客户端实现

bitxhub/cmd/bitxhub/client/http.go

func getHttpsClient(ctx *cli.Context, certPath string) (*http.Client, error) {
	caCert, err := ioutil.ReadFile(certPath)
	if err != nil {
		return nil, err
	}

	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)
	cert, err := tls.LoadX509KeyPair(ctx.GlobalString("cert"), ctx.GlobalString("key"))
	return &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				ServerName:   "BitXHub",
				RootCAs:      caCertPool,
				Certificates: []tls.Certificate{cert},
			},
		},
	}, nil
}
  1. 实现pier的json-rpc客户端TLS配置

git checkout feat/support-swap

./internal/syncer/jsonrpc_client.go

func InitializeJsonRpcClient(pierId string, url string, grpcClient rpcx.Client, opts ...Option) (*Client, error) {
	c := &Client{}
	cfg, err := GenerateConfig(opts...)
	if err != nil {
		return nil, err
	}
	c.logger = cfg.logger
	etherCli, err := ethclient.Dial(url)
	if err != nil {
		return nil, err
	}
  • 更换ethclient.Dial代码,深入eth-client源码找到init-client的部分;
  • 结合bitxhub的cmd-client实现,为pier添加配置可开启双向TLS。