如何使用密碼保護以太坊JSON-RPC的API?

malakashi發表於2019-01-19

本文面向以太坊智慧合約應用程式開發人員,並討論如何在密碼保護後,安全地執行你的以太坊節點,以便通過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

Nginx是最受歡迎的開源Web伺服器應用程式之一。我們將展示如何設定Nginx Web伺服器,以便它使用HTTP Basic Auth私下為你的Dapp(HTML檔案)和geth JSON-RPC API提供服務。

我們假設Ubuntu 14.04更新的Linux伺服器。檔案位置可能取決於使用的Linux發行版。

安裝Nginx

在Ubuntu Linux 14.04或更高版本上安裝Nginx:

sudo apt install nginx apache2-utils

配置Nginx

我們假設我們編輯預設的網站配置檔案/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

開始使用geth守護程式的最簡單方法是在UNIX screen中執行它:

screen

geth  # Your command line parameters here

退出screen 使用CTRL+A, D

請參閱geth private testnet說明

配置Dapp

在你的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

將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 -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

測試並迭代

訪問網站,看看您的Dapp是否連線到代理的Geth。

檢查/var/log/nginx/error.log以獲取詳細資訊。

如果從/eth端點獲得502 Bad Gateway,請確保geth正在作為伺服器上的後臺程式正常執行。

======================================================================

分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:

  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。

這裡是原文

相關文章