テスト用にGoでオレオレ証明書を発行

ローカルな環境で、WebアプリケーションにSSL/TLS証明書を利用したい時があるかと思います。

なんとGoの標準パッケージにオレオレSSL/TLS証明書を生成する機能があったので、試してみました。

cryptoパッケージの確認

Linuxだと、 /usr/local/go/src/ に証明書関連のパッケージがあります。環境によって異なる場合があるので、そこは適宜確認します。

ls -la /usr/local/go/src/crypto/tls

SSL/TLS証明書の発行

cryptoパッケージの場所がわかったら、下記のコマンドでパスを指定し、SSL/TLS証明書を発行できます。

go run /usr/local/go/src/crypto/tls/generate_cert.go --rsa-bits=2048 --host=localhost

--host= の部分にホスト名を記述します。

上記コマンドを実行すると、 key.pemcert.pem の証明書が発行されます。

発行された証明書は、信頼された認証局によって署名されたものではないので、そのままブラウザでアプリケーションを開くとエラーとなります。しかしそれ以外は通常のTLS証明書と同じです。

証明書の適用

LBにアタッチしたり、Nginxに設定したり、いろんな適用方法があるかと思いますが、Go標準の net/http パッケージの使う場合、 ListenAndServeTLS メソッドを使って次のように設定できます。

err := http.ListenAndServeTLS(":1313", "./tls/cert.pem", "./tls/key.pem", nil)

ListenAndServeTLS メソッドの詳細は 公式ドキュメント を参照のこと。

ブラウザで無効な証明書があてられているlocalhostへのリクエストを許可

オレオレ証明書は信頼された認証局によって署名されていないため、アプリケーションに設定しても、ブラウザで開くとエラーになります。

Chromeの場合は chrome://flags/#allow-insecure-localhost をURL部分に入力して、 Allow invalid certificates for resources loaded from localhost の設定を有効にすると、ローカルホストの証明書が許可されます。

まとめ

localhostでSSL/TLS証明書が必要なケースは稀ですが、たまにテストをしたいときなど、この方法は使えるかと思います。