TLS【Go】
TLSを使ったHTTPS通信を紹介します。
2015年にはGoogleがHTTPS通信を行うサイトを、検索結果において優遇すると宣言したように、どのサイトでもTLSを用いたHTTPS通信が要求される時代です。
証明書、秘密鍵の生成
TLSを使用するには、その方式で使われる証明書と秘密鍵が必要になります。
Goでは、標準で搭載されているgenerate_cert.goを使って、これらを生成することができます。
$ go run $(go env GOROOT)/src/crypto/tls/generate_cert.go --host=somedomainname.com
localhostをdomainnameとするならば、次のコマンドを実行します。
$ go run $(go env GOROOT)/src/crypto/tls/generate_cert.go --host=localhost
下記で紹介されているように、OpenSSLを使って生成することもできます。
https://www.kaihag.com/https-and-go/
コードの作成
main.goに次の通り記述します。
func main() { http.HandleFunc("/", index) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil) } func index(w http.ResponseWriter, req *http.Request) { fmt.Fprintln(w, "This is a sample page.") }
接続
先ほどのコードは接続先をlocalhostに指定していますので、下記にアクセスします。
https://localhost:10443
すると、赤い注意マークとともに「この接続ではプライバシーが保護されません」が表示されます。
証明書が第三者による検証を受けていないためです。あくまでローカル環境におけるテストなので、「詳細設定」をクリックし、「loclhostへ接続する」を選択します。
第三者機関による証明書の発行
商用環境ですと、もちろん先ほどの状態は適切ではありません。
第三者機関が発行する安全な証明書を使用することで、商用環境にも適した状態にすることができます。
証明書の発行は長らく寡占状態が続いており、利用金額も高額でした。それでも2016年に、無償で証明書を発行するLet's Encryptが登場してから、低価格なサービスが増えてきているようです。
Let's Encrypt - Free SSL/TLS Certificates
Let's Encrypt 総合ポータル
個人サイトが、先述のGoogleの動向に対応するために無償サービスを利用するのはよいと思いますが、ECサイトや企業運営サイトなどではより信頼性の高い証明書を利用した方が良いでしょう。
GoでLet's Encryptを使用する方法は下記で紹介されています。