go_server_kill_conf

さくらのVPSにGoの環境を構築してみた


先日、さくらのVPSを借りて、Goで書いたWebアプリを公開してみたのですが、

Goといえば、httpsから始まるURLを開くだけでHTTP/2になるという超素敵な仕様があり、

(GoでHTTP/2が標準実装になったのはバージョン1.6からです)

HTTP/2 - Wikipedia


是非ともHTTP/2で運営してみたいということで、


go_plus_let_encrypt3


ちょうど先日正式公開となったMozillaのLet's Encryptを利用してみた。

Mozilla Japan

Let's Encrypt - Free SSL/TLS Certificates


院生の頃から、Mozillaとはなにかとお世話になっており、

今回もMozillaさまさまだわ。


で、設定はというと




端末を開き、サーバにログインして下記のコマンドを打った。

(Gitのインストールは必須です。)

(ドメイン名にはhttpsで開きたいサイトのドメインを入力する:今回はsoil2.net)


sudo apt-get update
sudo apt-get upgrade

#optディレクトリにLet's Encryptを配置
cd /opt
sudo git clone https://github.com/letsencrypt/letsencrypt

#アプリのプロセスがある場合はkillしておく。下記のコマンドでプロセスを調べる
ps -ef
kill -KILL プロセスID

cd letsencrypt
./letsencrypt-auto certonly -a standalone -d ドメイン名

メールアドレスの入力画面が表示されるので、メールアドレスを登録し、

利用規約にAgreeすると


#下記が表示されたら終了
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/ドメイン名/fullchain.pem. Your cert will
expire on 期限. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.

こんな画面が表示されて終了です。

有効期限には気をつけてください。


各種証明書は下記のパスにありました


#下記のパスが証明書の実体 N.pemのNには整数が入ります

サーバ証明書(公開鍵)
/etc/letsencrypt/archive/ドメイン名/certN.pem
中間証明書
/etc/letsencrypt/archive/ドメイン名/chainN.pem
サーバ証明書と中間証明書が結合されたファイル
/etc/letsencrypt/archive/ドメイン名/fullchainN.pem
秘密鍵
/etc/letsencrypt/archive/ドメイン名/privkeyN.pem

同時に各証明書に対してシンボリックリンクも張られていました。


#下記のパスに証明書類のシンボリックリンクが生成されている

サーバ証明書(公開鍵)
/etc/letsencrypt/live/ドメイン名/cert.pem
中間証明書
/etc/letsencrypt/live/ドメイン名/chain.pem
サーバ証明書と中間証明書が結合されたファイル
/etc/letsencrypt/live/ドメイン名/fullchain.pem
秘密鍵
/etc/letsencrypt/live/ドメイン名/privkey.pem



証明書ができたら、Goのコードの方に証明書のパスを入れます。


httpで開いているコードが


func main() {
//ハンドラ周りのコードは省略

if err := http.ListenAndServe(":80", nil); err != nil {
log.Fatal("ListenAndServe:", err)
}
}

だとすると、

httpsで開きたい場合は


func main() {
//ハンドラ周りのコードは省略

crtPath = "/etc/letsencrypt/live/ドメイン名/fullchain.pem";
keyPath = "/etc/letsencrypt/live/ドメイン名/privkey.pem";

if err := http.ListenAndServeTLS(":443", crtPath, keyPath, nil); err != nil {
log.Fatal("ListenAndServe:", err)
}
}

メソッド名の変更と、各証明書のパスを指定すればOKです。


ここで注意するのは、サーバ証明書(crt)の指定は、

サーバ証明書単体ではなく、中間証明書が結合されているものを指定します。

そうでないと権限エラーでサイトが開きません。




ここまで出来たらコンパイルしてサーバを立ち上げみます。


go_plus_let_encrypt


アドレスバーに鍵マークが付き、

セキュリティの認証局がLet's Encryptになりました。


プロトコルはどうなっているかを調べてみると、


go_plus_let_encrypt2


バージョンのところがHTTP/2.0になってた!


これでファイルが並行送信できる様になったぞ。