通过Nginx用密码保护以太坊JSON-RPC API
Posted 区块链兄弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Nginx用密码保护以太坊JSON-RPC API相关的知识,希望对你有一定的参考价值。
▲点击蓝字,轻松关注
来源:简书
原文链接:http://t.cn/EwLeIAh
本文约3500字+,阅读(观看)需要20分钟
本文面向以太坊智能合约应用程序开发人员,并讨论如何在密码保护后,安全地运行你的以太坊节点,以便通过Internet进行安全输出。
Go Ethereum(geth)是以太坊节点最受欢迎的软件。其他流行的以太坊实现是Parity和cpp-ethereum等。分布式应用程序(Dapps)是javascript编码的网页,通过JSON-RPC API协议连接到任何这些以太坊节点软件,该协议是在HTTP协议之上自行运行的。
geth或没有节点软件本身不提供安全网络。将Ethereum JSON-RPC API暴露给公共Internet是不安全的,因为即使禁用私有API,这也会为琐碎的拒绝服务攻击打开一扇门。节点软件本身不需要提供安全的网络原语,因为这种内置功能会增加复杂性并为关键区块链节点软件增加攻击面。
Dapps本身是纯客户端html和JavaScript,不需要任何服务器,它们可以在任何Web浏览器中运行,包括移动和嵌入式浏览器,如Mist钱包内的一个。
使用nginx代理作为HTTP基本身份验证器
有几种方法可以保护对HTTP API的访问。最常见的方法包括HTTP头中的API令牌,基于cookie的身份验证或HTTP基本访问身份验证。
HTTP基本身份验证是HTTP协议的一个非常古老的功能,其中Web浏览器打开一个本机弹出对话框,询问用户名和密码。它本质上的保护是有限的,但非常容易实现,非常适合需要为有限的互联网受众暴露私有Dapp的用例。这些用例包括显示Dapp演示,私有和许可的区块链应用程序或将以太坊功能作为软件即服务解决方案的一部分。
Nginx是最受欢迎的开源Web服务器应用程序之一。我们将展示如何设置Nginx Web服务器,以便它使用HTTP Basic Auth私下为你的Dapp(HTML文件)和geth JSON-RPC API提供服务。
我们假设Ubuntu 14.04更新的Linux服务器。文件位置可能取决于使用的Linux发行版。
在Ubuntu Linux 14.04或更高版本上安装Nginx:
sudo apt install nginx apache2-utils
我们假设我们编辑默认的网站配置文件/etc/nginx/sites-enabled/default。我们使用proxy_pass指令与在localhost:8545中运行的geth进行通信:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name demo.example.com; # Geth proxy that password protects the public Internet endpoint
location /eth {
auth_basic "Restricted access to this site";
auth_basic_user_file /etc/nginx/protected.htpasswd; # Proxy to geth note that is bind to localhost port
proxy_pass http://localhost:8545;
} # Server DApp static files
location / {
root /usr/share/nginx/html;
index index.html
auth_basic "Restricted access to this site";
auth_basic_user_file /etc/nginx/protected.htpasswd;
}
}
使用密码创建HTTP Basic Auth用户演示:
sudo htpasswd -c /etc/nginx/protected.htpasswd demo
开始使用geth守护进程的最简单方法是在UNIX screen中运行它:
screen
geth # Your command line parameters here
退出screen 使用CTRL+A, D。
请参阅geth private testnet说明
在你的Dapp中,使web3.js使用/eth端点:
function getRPCURL() { // ES2016
if(window.location.href.includes("demo.nordledger.com")) {
// Password protected geth deployment
return "http://demo.nordledger.com/eth"
} else { // Localhost development
return "http://localhost:8545";
}
} // ...
web3.setProvider(new web3.providers.HttpProvider(getRPCURL()));
将DApp文件复制到服务器上的/usr/share/nginx/html。这包括index.html以及相关的JavaScript和CSS资源。
Bonus - 部署shell脚本示例:
#!/bin/bash## A simple static HTML + JS deployment script that handles Nginx www-data user correclty.# Works e.g. Ubuntu Linux Azure and Amazon EC2 Ubuntu server out of the box.#set -eset -u# The remote server we are copying the files using ssh + public key authentication.# Specify this in .ssh/configREMOTE="nordledger-demo"# Build dist folder using webpacknpm run build# Copy local dist folder to the remote server Nginx folder over sudoed# Assum the default user specified in .ssh/config has passwordless sudo# https://crashingdaily.wordpress.com/2007/06/29/rsync-and-sudo-over-ssh/rsync -a -e "ssh" --rsync-path="sudo rsync" dist/* --chown www-data:www-data $REMOTE:/usr/share/nginx/html/
为Nginx做一次硬重启:
service nginx stop service nginx start
访问网站,看看您的Dapp是否连接到代理的Geth。
检查/var/log/nginx/error.log以获取详细信息。
如果从/eth端点获得502 Bad Gateway,请确保geth正在作为服务器上的后台进程正常运行。
文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。
猜猜你喜欢
点击“阅读原文”参与区块链问题讨论
以上是关于通过Nginx用密码保护以太坊JSON-RPC API的主要内容,如果未能解决你的问题,请参考以下文章