LoginSignup
1
1

More than 5 years have passed since last update.

Nekoniumのパブリックノードを立ててみよう その3 Let's Encrypt+Nginxで簡単にSSL対応編

Last updated at Posted at 2018-01-28

はじめに

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

手順

ドメインの準備

ドメインの取得

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

サーバーの準備

サーバーの用意

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

6c6f74d298db3a429170ea318c1c0f79.png

7d7f92cd7b6508e061f3359b66d8f7e7.png

固定IPの取得

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

25c3837c292cd288d1cb3764e591a67e.png

a6367dbb078f45d5aa3ea0d36ae4fa41.png

固定IPを関連付ける

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

7f3926a7bf56f47cf02e5184963253fd.png

7621fc71fba839a3e5d30a01e1f3f7f1.png

ファイアウォールの設定

「セキュリティグループ」のインバウンド設定から、今回使用するTCPの「8293」と、SSL証明書取得に必要な「80」「443」ポートを空けておきます。

fc94efd8a8d97c5f51fcd88aeade4e5c.png

4341d22a8dcbb8a2d42babd16953b181.png

DNSの設定

今回割り当てられたグローバル固定IPをドメイン名に紐付けます。
バリュードメインのDNS設定からAレコードのsslを「52.198.87.166」に設定します。
db1440cdbdb624b3bb36ea3dedc17d5d.png

サーバーの設定

インスタンスへの接続

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

b70d4341c63c3f5a400cf33942f7ad34.png

ab7c4cc2774f32febd5961a870c946ef.png

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と出力されればインストール成功です。

Let's Encryptとnginxのインストールと設定

letsencryptのインストール

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

SSL証明書の発行

下記コマンドを実行してSSL証明書の発行の手続きを行います。
sudo letsencrypt certonly --standalone -d ssl.nekonium.site

UIが立ち上がりますので、普段使用している自分のメールアドレスを入力し、規約に同意して下さい。

24a9cb1b352652d270ef5574c76b55f1.png

f32ffd4945031b00708305fbd5ccba80.png

Congratulations!と表示されればSSL証明書の発行成功です。

SSL証明書の自動更新設定

下記コマンドでcronを立ち上げてSSL証明書を自動更新できるようにします。
sudo crontab -e エディタを聞かれるので好きなものを選んで下さい。以下を書き込み保存します。

00 05 01 * * sudo systemctl stop nginx; sudo letsencrypt renew; sudo systemctl start nginx

毎月1日の朝5時にSSL証明書を自動更新する設定になります。

nginxのインストール

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

設定の前に

nginxconfig.io
上記のサイトでnginxの最適な設定を簡単に取り出すことが出来ます。
今回こちらをベースに設定をしていきます。 → 設定例

nginxの設定

nginxのコンフィグファイルを下記のように設定します。ドメイン名は適宜読み替えて下さい。
sudo vi /etc/nginx/nginx.conf

nginx.conf
user ubuntu;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 409600;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    proxy_set_header Host $http_host;   
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    charset utf-8;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;
    server_tokens off;
    log_not_found off;

    client_max_body_size 50M;
    client_body_buffer_size 128k;

    # mime
    include mime.types;
    default_type application/octet-stream;

    # logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;

    # include configs
    include /etc/nginx/conf.d/*.conf;

    # ssl.nekonium.site
    server {
        listen 8293 ssl http2;
        listen [::]:8293 ssl http2;

        server_name ssl.nekonium.site;

        ssl_certificate /etc/letsencrypt/live/ssl.nekonium.site/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ssl.nekonium.site/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/ssl.nekonium.site/fullchain.pem;

        include _ssl.conf;

        location / {
        proxy_pass http://localhost:8292/;
        proxy_redirect default;
        }
    }

    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name ssl.nekonium.site;
        root /var/www/ssl.nekonium.site/public;

        ssl_certificate /etc/letsencrypt/live/ssl.nekonium.site/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ssl.nekonium.site/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/ssl.nekonium.site/fullchain.pem;

        include _ssl.conf;

        # ACME-challenge
        location ^~ /.well-known/acme-challenge/ {
            default_type "text/plain";
            root /var/www/_letsencrypt;
        }

        # headers
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-UA-Compatible "IE=Edge" always;
        add_header Cache-Control "no-transform" always;

        # . files
        location ~ /\. {
            deny all;
        }

        # assets, media
        location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
            expires 7d;
            access_log off;
        }

        # svg, fonts
        location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
            add_header Access-Control-Allow-Origin "*";
            expires 7d;
            access_log off;
        }

        # gzip
        gzip on;
        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
    }

    server {
        listen 80;
        listen [::]:80;

        server_name ssl.nekonium.site;

        # ACME-challenge
        location ^~ /.well-known/acme-challenge/ {
            default_type "text/plain";
            root /var/www/_letsencrypt;
        }

        return 301 https://ssl.nekonium.site$request_uri;
    }
}

SSL用のコンフィグファイルも作成しておきます。
sudo vi /etc/nginx/_ssl.conf

_ssl.conf
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.10.3&openssl=1.1.0g&hsts=yes&profile=intermediate
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

# Diffie-Hellman parameter for DHE ciphersuites
ssl_dhparam /etc/nginx/dhparam.pem;

# intermediate configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

# HSTS
add_header Strict-Transport-Security "max-age=15768000" always;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;

resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
resolver_timeout 2s;
DHパラメーターファイルの生成

下記コマンドを実行してDHパラメーターファイルを生成します。
sudo openssl dhparam -dsaparam -out /etc/nginx/dhparam.pem 4096

nginxの再起動

下記コマンドでnginxを再起動します。
sudo nginx -s reload

これでnginxの設定は完了です。

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

gnekoniumの初回起動

ブロックチェーンの同期

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

同期終了

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

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

新しいセッションでgnekoniumを起動します。ポート番号は8292を指定しています。
tmux new -s gnekonium
cd nekonium/go-nekonium
build/bin/gnekonium -rpc --rpcaddr 0.0.0.0 --rpcport 8292

動作確認

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

おわりに

以上でメールアドレスとSSL証明書の維持費用がかからない、「Nekonium」のSSL通信対応パブリックノードの構築が完了しました。
/var/www/ドメイン名/public 以下にhtmlファイルを設置してサイトとしても機能できるようになっております。

参考サイト

Let's Encrypt の使い方 - Let's Encrypt 総合ポータル
How To SSL Ethereum Geth Node? - Stack Exchange
letsencryptをUbuntu16.04 + Nginxで使ってみた - Qiita

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1