目前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请求。
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进程的同一个目录下。
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!