将区块链节点的RPC访问协议由HTTP修改为HTTPS

目标

目前DAPP应用对同步节点的访问都是通过http协议进行的,为了提高RPC接口访问的安全性,可以考虑将HTTP协议替换为HTTPS协议。本文的主要目的是介绍如何将RPC的访问协议由HTTP修改为HTTPS。

准备工作

本文测试用例以高性能区块链项目HPB为例。
1、下载代码:代码路径 https://github.com/hpb-project/go-hpb

2、安装openssl : 代码路径 https://github.com/openssl/openssl ,也可以到官网下载安装包。安装OpenSSL主要是用于证书测试。

3、编译go-hpb,搭建hpb私链并测试http请求。

HTTP测试

1、启动私链节点(启动参数需要添加rpc,rpcport)

2、执行查询块高度的请求

执行:curl -H “Content-Type:application/json” -X POST --data ‘{“jsonrpc”:“2.0”,“method”:“hpb_blockNumber”,“id”:1}’ http://127.0.0.1:8545

返回:{“jsonrpc”:“2.0”,“id”:1,“result”:“0x21c9”}

以上执行查询区块高度请求,返回区块高度为0x21c9。请求成功

此时将上述的http替换为https 再次进行请求是失败的,返回curl: (35) gnutls_handshake() failed: An unexpected TLS packet was received.的错误提示。

修改代码

1、由于HTTPS协议的使用涉及到证书,因此这里使用OpenSSL生成测试证书。

​ a、生成2048位私钥:openssl genrsa -out server.key 2048

​ b、生成公钥:openssl rsa -in server.key -out server.key.public

​ c、生成数字证书:openssl req -new -x509 -key server.key -out server.crt -days 365

以上执行完毕,会生成3个文件:私钥文件server.key ,公钥文件server.key.public,经私钥签名的证书文件:server.crt ,证书有效期为365天。

2、修改go-hpb节点代码,编译go-hpb/network/rpc/rpcmanager.go文件,将StartHTTPEndpoint函数进行修改。

修改前:

func StartHTTPEndpoint(endpoint string, apis []API, modules []string, cors []string, vhosts []string, timeouts config.HTTPTimeouts) (net.Listener, *Server, error) {
	
	......
	go NewHTTPServer(cors, vhosts, timeouts, handler).Serve(listener)
	return listener, handler, err
}

修改后

func StartHTTPEndpoint(endpoint string, apis []API, modules []string, cors []string, vhosts []string, timeouts config.HTTPTimeouts) (net.Listener, *Server, error) {
	
	......
	//go NewHTTPServer(cors, vhosts, timeouts, handler).Serve(listener)
	currentpath, _ := filepath.Abs(filepath.Dir(os.Args[0]))
	certFile := currentpath + "/server.crt"
	keyFile := currentpath + "/server.key"
	go NewHTTPServer(cors, vhosts, timeouts, handler).ServeTLS(listener, certFile, keyFile) //主要是将Serve函数替换为ServeTLS函数,同时增加证书和私钥路径。
	return listener, handler, err
}

3、编译go-hpb, 然后将证书server.crt,私钥server.key放到go-hpb/build/bin目录下。

​ 根据上述修改代码,要将证书,私钥放到ghpb进程的同一个目录下。

HTTPS测试

1、启动私链节点(启动参数需要添加rpc,rpcport)

2、执行HTTP请求查询块高度的请求

执行:curl -H “Content-Type:application/json” -X POST --data ‘{“jsonrpc”:“2.0”,“method”:“hpb_blockNumber”,“id”:1}’ http://127.0.0.1:8545

此时HTTP请求无任何结果返回。

3、执行HTTPS请求查询块高度的请求,将上述指令中http替换为https,同时添加-k参数即可。

执行:curl -k -H “Content-Type:application/json” -X POST --data ‘{“jsonrpc”:“2.0”,“method”:“hpb_blockNumber”,“id”:1}’ https://127.0.0.1:8545

返回:{“jsonrpc”:“2.0”,“id”:1,“result”:“0x21c9”} 。执行成功

备注

上述生成的证书仅为测试使用,如有必要,可以找具有CA资质的机构申请证书。

THE END!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章