Nekoniumのパブリックノードを立ててみよう その2 SSL対応編


はじめに

前回は通常の「Nekonium」パブリックノードの構築方法を記載しましたが、今回はhttp-proxyを使ったSSL通信対応パブリックノードの構築方法を記載します。
その1にいくつか手順を加えたものになりますので、事前に一度ご覧頂けると幸いです。

手順

ドメインとSSL証明書の準備

ドメインの取得

ドメイン取得代行サイトで任意のドメインを取得してください。
なお、今回は既にバリュードメインで取得したドメイン「nekonium.site」のサブドメイン「www.nekonium.site」を使用します。

メールアドレスの取得

SSL証明書を発行するには事前にドメイン管理者のメールアドレスが必要になります。
今回はG Suiteで「[email protected]」というメールアドレスを作成します。

ドメインの確認とメール設定

ドメインの所有者であることを証明するために、今回はDNSのTXTレコードを使用します。
G Suiteの指示に従いながら、バリュードメイン側でDNSの設定をします。

メール設定の完了

ドメインの確認とメール設定が完了したら、メールの送受信をテストして下さい。

CSR・秘密鍵の生成

SSL証明書を発行するには事前にCSRと秘密鍵(プライベートキー)を用意する必要があります。
バリュードメインがオンラインでCSRと秘密鍵の生成と管理をするツールを提供していますので、そちらを利用します。
CSRとプライベートキー(パスフレーズあり)とプライベートキー(パスフレーズ無し)の3つが生成されます。

SSL証明書の発行

生成されたCSRと秘密鍵を使用してSSL証明書発行代行サイトよりSSL証明書を取得します。
今回はバリュードメインでそのままSSL証明書を発行します。
(生成されたCSRと秘密鍵は他の発行サイトでも使えます)
作成済のCSRを選択して、「[email protected]」に承認メールが来るようにします。

これでSSL証明書が発行されました。

サーバーの準備

サーバーの用意

Linuxサーバーを立ち上げます。
今回もAWSの「Ubuntu Server 16.04 LTS (HVM), SSD Volume Type」を選びました。
インスタンスタイプも同じく「t2.micro」にしておきます。

固定IPの取得

インスタンスが立ち上がったら、「Elastic IP」でグローバル固定IPを取得します。
今回は「52.10.12.170」が割り当てられました。

固定IPを関連付ける

「アクション」から、先ほど作成したインスタンスにグローバル固定IPを割り当てます。

ファイアウォールの設定

「セキュリティグループ」のインバウンド設定から、今回使用するTCPの「8293」ポートを空けておきます。

DNSの設定

今回割り当てられたグローバル固定IPをドメイン名に紐付けます。
バリュードメインのDNS設定からAレコードのwwwを「52.10.12.170」に設定します。
ドメイン確認に使用したTXTレコードの行は削除して構いません。

サーバーの設定

インスタンスへの接続

Windowsの場合は「PuTTY」を使用します。詳しい接続方法はAWSのページを参照してください。
Linux インスタンスへの接続 - AWS Documentation

Ubuntuのアップデート

ログインができたら、まずUbuntuをアップデートして再起動します。
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot

build-essentialのインストール

下記コマンドを実行してbuild-essentialをインストールします。
sudo apt-get install build-essential make

Goのインストール

下記コマンドを実行してGoをインストールします。
wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz
sudo tar -xvf go1.9.2.linux-amd64.tar.gz
sudo mv go /usr/local
export GOROOT=/usr/local/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
export GOPATH=$HOME/go
go version と入力してgo version go1.9.2 linux/amd64と出力されればインストール成功です。

gnekoniumのインストール

下記コマンドを実行してgnekoniumをインストールします。
mkdir nekonium
cd nekonium
git clone https://github.com/nekonium/go-nekonium
※もしgitがインストールされていない場合は、sudo apt-get install gitを実行して下さい。
cd go-nekonium
export GOROOT=/usr/local/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
export GOPATH=$HOME/go
make gnekonium

nodejsのインストール

下記コマンドを実行してnodejsをインストールします
cd
sudo apt-get install nodejs
sudo ln -s `which nodejs` /usr/bin/node
nodejs -vと入力すると、バージョンが確認できます。

npmのインストール

下記コマンドを実行してnpmをインストールします
sudo apt-get install npm

http-proxyのインストール

下記コマンドを実行してhttp-proxyをインストールします
mkdir tools
mkdir tools/proxy
cd tools/proxy
npm init 途中で止まりますが、Is this ok? (yes)までEnterキーで進んでいきます。
npm install http-proxy --save
npm install fs --save
touch stop.sh
vi stop.sh stop.shに下記のように書き込みます。

stop.sh
 #!/bin/bash
 ps aux | grep 'node index.js' | grep -v grep | awk '{print $2}' | xargs kill -9 

vi package.json package.jsonを下記のように編集します。

package.json
{
   "name": "proxy",
   "version": "1.0.0",
   "description": "Proxy server for ethereum node",
   "main": "index.js",
   "scripts": {
      "start": "node index.js &",
      "stop": "./stop.sh"
   },
   "author": "Robert Lie",
   "license": "ISC",
   "dependencies": {
      "fs": "0.0.1-security",
      "http-proxy": "^1.16.2"
   }
} 

touch index.js
vi index.js index.jsに下記内容を書き込みます。

index.js
var httpProxy = require('http-proxy');
var fs = require('fs'); 

httpProxy.createServer({
  target: {
    host: 'localhost',
    port: 8292
 },
 ssl: {
    key: fs.readFileSync(
    '/home/ubuntu/tools/proxy/ssl/www.nekonium.site.key', 'utf8'),
    cert: fs.readFileSync(
    '/home/ubuntu/tools/proxy/ssl/www.nekonium.site.pem', 'utf8')
 }
}).listen(8293); 
SSL証明書のインストール

mkdir ssl
cd ssl
touch www.nekonium.site.key
touch www.nekonium.site.pem
touch www.nekonium.site.ca.pem
vi www.nekonium.site.key 取得したSSL秘密鍵(プライベートキー パスフレーズ無し)の内容を書き込みます。

www.nekonium.site.key
-----BEGIN RSA PRIVATE KEY-----

中略

-----END RSA PRIVATE KEY-----

vi www.nekonium.site.pem 取得したSSL証明書の内容を書き込みます。

www.nekonium.site.pem
-----BEGIN CERTIFICATE-----

中略

-----END CERTIFICATE-----

vi www.nekonium.site.ca.pem 取得したSSL中間証明書の内容を書き込みます。

www.nekonium.site.ca.pem
-----BEGIN CERTIFICATE-----

中略

-----END CERTIFICATE-----

cat www.nekonium.site.ca.pem >> www.nekonium.site.pem 2つの証明書を結合します。

これでhttp-proxyの準備が出来ました。

gnekoniumの初回起動

ブロックチェーンの同期

下記コマンドを実行してブロックチェーンの同期を行います。
cd
cd nekonium/go-nekonium
build/bin/gnekonium --fast --cache=256 console
少し時間がかかります。(15分くらい)
※注意 --cache=512だとインスタンスのメモリ容量が足りず失敗します。

同期終了

Fast sync complete, auto disablingと表示されれば同期が成功したことになります。

http-proxyの開始

新しいセッションを開き、下記コマンドを実行してhttp-proxyを開始します。
cd tools/proxy
npm start

SSL通信対応パブリックノードの開始

cd
tmux new -s gnekonium
cd nekonium/go-nekonium
build/bin/gnekonium -rpc --rpcaddr 0.0.0.0 --rpcport 8292 今回はポート8293ではなく8292で起動します

動作確認

ノードが動作しているか確認するには別セッションで下記コマンドを実行します。
curl -s -X POST --data '{"jsonrpc":"2.0","id":0,"method":"eth_getBalance","params":["アドレス","latest"]}' https://www.nekonium.site:8293/
アドレスにはNekoniumのアカウントを入力して下さい。
16進数でアカウントの残高が表示されれば無事SSL通信で動作していることになります。

おわりに

これでSSL通信対応のパブリックノードの構築が完了しました。
しかし、SSL証明書やメールアドレスの維持費が気になりますね。
次回はもっと安上がりで簡単なSSL通信対応パブリックノードの構築方法を投稿したいと思います。

参考サイト

How to make geth support SSL - mobilefish.com

How To Install Node.js on Ubuntu 16.04 - DigitalOcean