本文面向以太坊智能合約應(yīng)用程序開(kāi)發(fā)人員,并討論如何在密碼保護(hù)后趾撵,安全地運(yùn)行你的以太坊節(jié)點(diǎn),以便通過(guò)Internet進(jìn)行安全輸出。
Go Ethereum(geth)是以太坊節(jié)點(diǎn)最受歡迎的軟件湃密。其他流行的以太坊實(shí)現(xiàn)是Parity和cpp-ethereum等。分布式應(yīng)用程序(Dapps)是JavaScript編碼的網(wǎng)頁(yè)四敞,通過(guò)JSON-RPC API協(xié)議連接到任何這些以太坊節(jié)點(diǎn)軟件泛源,該協(xié)議是在HTTP協(xié)議之上自行運(yùn)行的。
geth或沒(méi)有節(jié)點(diǎn)軟件本身不提供安全網(wǎng)絡(luò)忿危。將Ethereum JSON-RPC API暴露給公共Internet是不安全的达箍,因?yàn)榧词菇盟接蠥PI,這也會(huì)為瑣碎的拒絕服務(wù)攻擊打開(kāi)一扇門(mén)铺厨。節(jié)點(diǎn)軟件本身不需要提供安全的網(wǎng)絡(luò)原語(yǔ)缎玫,因?yàn)檫@種內(nèi)置功能會(huì)增加復(fù)雜性并為關(guān)鍵區(qū)塊鏈節(jié)點(diǎn)軟件增加攻擊面。
Dapps本身是純客戶端HTML和JavaScript解滓,不需要任何服務(wù)器赃磨,它們可以在任何Web瀏覽器中運(yùn)行,包括移動(dòng)和嵌入式瀏覽器洼裤,如Mist錢(qián)包內(nèi)的一個(gè)邻辉。
使用Nginx代理作為HTTP基本身份驗(yàn)證器
有幾種方法可以保護(hù)對(duì)HTTP API的訪問(wèn)。最常見(jiàn)的方法包括HTTP頭中的API令牌腮鞍,基于cookie的身份驗(yàn)證或HTTP基本訪問(wèn)身份驗(yàn)證值骇。
HTTP基本身份驗(yàn)證是HTTP協(xié)議的一個(gè)非常古老的功能,其中Web瀏覽器打開(kāi)一個(gè)本機(jī)彈出對(duì)話框移国,詢問(wèn)用戶名和密碼吱瘩。它本質(zhì)上的保護(hù)是有限的,但非常容易實(shí)現(xiàn)迹缀,非常適合需要為有限的互聯(lián)網(wǎng)受眾暴露私有Dapp的用例搅裙。這些用例包括顯示Dapp演示,私有和許可的區(qū)塊鏈應(yīng)用程序或?qū)⒁蕴还δ茏鳛檐浖捶?wù)解決方案的一部分裹芝。
Nginx
Nginx是最受歡迎的開(kāi)源Web服務(wù)器應(yīng)用程序之一部逮。我們將展示如何設(shè)置Nginx Web服務(wù)器,以便它使用HTTP Basic Auth私下為你的Dapp(HTML文件)和geth JSON-RPC API提供服務(wù)嫂易。
我們假設(shè)Ubuntu 14.04更新的Linux服務(wù)器兄朋。文件位置可能取決于使用的Linux發(fā)行版。
安裝Nginx
在Ubuntu Linux 14.04或更高版本上安裝Nginx:
sudo apt install nginx apache2-utils
配置Nginx
我們假設(shè)我們編輯默認(rèn)的網(wǎng)站配置文件/etc/nginx/sites-enabled/default
。我們使用proxy_pass指令與在localhost:8545
中運(yùn)行的geth進(jìn)行通信:
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;
}
}
使用密碼創(chuàng)建HTTP Basic Auth用戶演示:
sudo htpasswd -c /etc/nginx/protected.htpasswd demo
配置geth
開(kāi)始使用geth守護(hù)進(jìn)程的最簡(jiǎn)單方法是在UNIX screen中運(yùn)行它:
screen
geth # Your command line parameters here
退出screen
使用CTRL+A, D
颅和。
請(qǐng)參閱geth private testnet說(shuō)明
配置Dapp
在你的Dapp中傅事,使web3.js使用/eth
端點(diǎn):
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
將DApp文件復(fù)制到服務(wù)器上的/usr/share/nginx/html
。這包括index.html以及相關(guān)的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 -e
set -u
# The remote server we are copying the files using ssh + public key authentication.
# Specify this in .ssh/config
REMOTE="nordledger-demo"
# Build dist folder using webpack
npm 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
為Nginx做一次硬重啟:
service nginx stop service nginx start
測(cè)試并迭代
訪問(wèn)網(wǎng)站蹭越,看看您的Dapp是否連接到代理的Geth。
檢查/var/log/nginx/error.log
以獲取詳細(xì)信息教届。
如果從/eth
端點(diǎn)獲得502 Bad Gateway响鹃,請(qǐng)確保geth正在作為服務(wù)器上的后臺(tái)進(jìn)程正常運(yùn)行。
======================================================================
分享一些以太坊案训、EOS买置、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:
- java以太坊開(kāi)發(fā)教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的web3j詳解强霎。
- python以太坊忿项,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的詳解。
- php以太坊城舞,主要是介紹使用php進(jìn)行智能合約開(kāi)發(fā)交互轩触,進(jìn)行賬號(hào)創(chuàng)建、交易家夺、轉(zhuǎn)賬脱柱、代幣開(kāi)發(fā)以及過(guò)濾器和交易等內(nèi)容。
- 以太坊入門(mén)教程秦踪,主要介紹智能合約與dapp應(yīng)用開(kāi)發(fā)褐捻,適合入門(mén)。
- 以太坊開(kāi)發(fā)進(jìn)階教程椅邓,主要是介紹使用node.js柠逞、mongodb、區(qū)塊鏈景馁、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn)板壮,適合進(jìn)階。
- C#以太坊合住,主要講解如何使用C#開(kāi)發(fā)基于.Net的以太坊應(yīng)用绰精,包括賬戶管理、狀態(tài)與交易透葛、智能合約開(kāi)發(fā)與交互笨使、過(guò)濾器和交易等。
- EOS教程僚害,本課程幫助你快速入門(mén)EOS區(qū)塊鏈去中心化應(yīng)用的開(kāi)發(fā)硫椰,內(nèi)容涵蓋EOS工具鏈、賬戶與錢(qián)包、發(fā)行代幣靶草、智能合約開(kāi)發(fā)與部署蹄胰、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開(kāi)發(fā)奕翔。
- java比特幣開(kāi)發(fā)教程裕寨,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念派继,例如區(qū)塊鏈存儲(chǔ)宾袜、去中心化共識(shí)機(jī)制、密鑰與腳本互艾、交易與UTXO等试和,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能讯泣,例如創(chuàng)建地址纫普、管理錢(qián)包、構(gòu)造裸交易等好渠,是Java工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程昨稼。
- php比特幣開(kāi)發(fā)教程,本課程面向初學(xué)者拳锚,內(nèi)容即涵蓋比特幣的核心概念假栓,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制霍掺、密鑰與腳本匾荆、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能杆烁,例如創(chuàng)建地址牙丽、管理錢(qián)包、構(gòu)造裸交易等兔魂,是Php工程師不可多得的比特幣開(kāi)發(fā)學(xué)習(xí)課程烤芦。
匯智網(wǎng)原創(chuàng)翻譯,轉(zhuǎn)載請(qǐng)標(biāo)明出處析校。這里是原文