geth的rpc采用加密访问方式

以太坊 区块链

原因:geth给用户暴露了很多Json-RPC接口API,可以让web3.js或web3j库来通过这些接口来访问geth节点,可以实现远程查询转账等功能。但是geth暴露的这些接口是未经过任何加密处理的不安全接口。如果geth使用这种方式启动RPC:

$ geth — rpc — rpcaddr 0.0.0.0 — rpcport 8545 — rpcapi “db, eth, net, web3, personal” — ipcapi “admin,eth,debug,personal,web3” 

–rpcaddr 0.0.0.0 这个允许所有用户都访问rpc端口。

解决方案

   1、 可以通过ip进行限制访问

   2、通过Nginx Basic HTTP Authentication原理


本文重点讲述Nginx Basic HTTP Authentication的实现

找到Nginx配置文件添加

location /eth {
    	#try_files $uri $uri/ =404;
    	auth_basic "Restricted Area";
    	auth_basic_user_file /etc/nginx/geth.htpasswd;
		proxy_pass http://localhost:8100;
  	}

密钥文件的创建

htpasswd -c /etc/nginx/geth.htpasswd nginx

通过apache工具htpasswd创建密

重启Nginx后就可以了

1、http访问:浏览器输入url

2、采用web3j访问

private static OkHttpClient buildBasicAuthClient() {
        return new OkHttpClient.Builder().authenticator(new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                String credential = okhttp3.Credentials.basic(Define.userName, Define.passwd);
                return response.request().newBuilder().header("Authorization", credential).build();
            }
        }).build();
 }
 
Admin ethClient;
ethClient = Admin.build(new HttpService(url,buildBasicAuthClient(),false));

发表评论