【Go実践】net/httpパッケージでオレオレ証明書を使用してHTTPS(SSL)サーバを立てる

シェアする

これまでGoのWEB開発について解説してきましたが、通信はすべてHTTPで行ってきました。
今回は、これまで通りにnet/httpパッケージでWEBサーバを起動しつつ、HTTPS通信を行う方法を解説します。

HTTPSサーバを立ち上げる方法

GoでHTTPSサーバを立ち上げる方法は簡単で、今までHTTPサーバの軌道に使用していたListenAndServe関数の代わりに、ListenAndServeTLSを使用するだけです。

func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error

ListenAndServeTLSは、 HTTPS接続を想定していることを除いて、ListenAndServeと同じように機能します。

第1引数には、ListenAndServeと同様にTCPネットワークアドレスを指定します。
つまり、現在の開発環境ならこれまで通りポート番号を指定すれば問題ありません。

そして第2引数と第3引数には、それぞれSSL証明書ファイルと秘密鍵ファイルを指定する必要があります。
つまり、証明書ファイルと鍵ファイルさえ用意できれば、すぐにHTTPSサーバを立ち上げることができるというわけです。

オレオレ証明書の発行

さて、証明書をどう調達するかですが、ここでは自己署名証明書、いわゆるオレオレ証明書を発行したいと思います。
もちろん認証局から発行された正規の証明書を使用できればそれに越したことは有りませんが、あくまで学習目的でローカル環境でしか使用しない前提なら、オレオレ証明書を使用しても問題ありません。

以下にオレオレ証明書の発行手順を記載しますが、インターネット上に公開するWEBサーバには絶対に使用しないでください

OpenSSLの入手

証明書の発行にはOpenSSLが必要です。
Mac OSを使用しているかLinux環境をお持ちなら問題ありませんが、Windowsの場合は以下のサイトからバイナリ形式のOpenSSLをダウンロードしインストールしてください。

https://slproweb.com/products/Win32OpenSSL.html

有効期間10年のSSL証明書を発行

まず、以下のコマンドで、localhost.keyという名前の秘密鍵ファイルを作成します。
秘密鍵のビット長は2048です。

$ openssl genrsa 2048 > localhost.key

次に、証明書の発行に必要な署名リクエストファイルを作成します。
ファイル名はlocalhost.csrとします。

$ openssl req -new -key localhost.key > localhost.csr

このコマンドを実行すると、署名情報の入力が求められます。
今回は正式な署名ではありませんので、以下の例の通りに入力してください。(太字が入力部分)

Country Name (2 letter code) []:JP
State or Province Name (full name) []:都道府県名をローマ字で入力(例:Tokyo)
Locality Name (eg, city) []:市区町村名をローマ字で入力(例:Minato-ku)
Organization Name (eg, company) []:任意の組織名(例:Sample inc.)
Organizational Unit Name (eg, section) []:空白でOK
Common Name (eg, your website’s domain name) []:localhost

最後に、この署名ファイルを元に証明書ファイルを発行します。
ファイル名はlocalhost.crtとします。

$ openssl x509 -days 3650 -req -signkey localhost.key localhost.crt

-daysオプションで有効期間を日数で指定可能できます。
当分更新しなくて済むよう、今回は有効期間を10年としました。

以上で証明書の作成は完了です。
作成した証明書ファイルlocalhost.crtと秘密鍵ファイルlocalhost.keyは、Goプログラムから参照可能な場所に格納してください。

証明書をクライアントにインストールする

さて、ここまでの手順でHTTPSサーバを立ち上げる準備は整いました。
しかし、サーバの証明書がオレオレ証明書である場合、クライアントからアクセスした際に証明書エラーが表示されます。

証明書エラーを無視することはセキュリティ上問題ですので、証明書エラーを表示させないよう、作成したオレオレ証明書を信頼できる証明書としてクライアントにインポートする必要があります。

以下に、WindowsとMacの証明書インポート手順をそれぞれ記載します。

Windowsの場合
  1. タスクバーの検索ボックスに「Certlm.msc」と入力して検索(Windows7/8の場合はスタートメニューから検索)
  2. 「証明書 – ローカルコンピュータ」→「信頼されたルート証明機関」→「証明書」を選択し、右クリック
  3. コンテキストメニューから「すべてのタスク」→「インポート」をクリック
  4. インポートウィザードが起動するので、作成したlocalhost.crtファイルを選択しインポート実行
Mac OSの場合
  1. 作成したlocalhost.crtファイルをダブルクリック
  2. 証明書の追加ダイアログが表示されるので、「キーチェーン」に「システム」を選択肢「追加」をクリック
  3. アプリケーションの「ユーティリティ」フォルダ内から「キーチェーンアクセス」アプリを起動
  4. キーチェーンアクセスの「システム」内に、追加した「localhost」証明書があるので、ダブルクリックして開く
  5. 証明書の詳細が表示されるので、「信頼」タブを開き、「この証明書を使用するとき」の選択値を「常に信頼する」に変更する

HTTPSサーバを起動する

以上でサーバ/クライアントともにすべての準備が整いましたので、いよいよHTTPSサーバを立ち上げてみましょう。

main.goファイルのhttp.ListenAndServeをコメントアウトし、http.ListenAndServeTLSに変更します。

    // サーバーを起動
    //http.ListenAndServe(":8080", nil)
    err := http.ListenAndServeTLS(":10443", "crt/localhost.crt", "crt/localhost.key", nil)
    if err != nil {
        fmt.Printf("ERROR : %s", err)
    }
}

ポート番号は、デフォルトポートの443と競合しないように10443としています。
証明書ファイルと秘密鍵ファイルのパスは、ファイルを格納した場所に応じて書き換えてください。

コード修正が終わったら、ブラウザでhttps://localhost:10443/user-listにアクセスしてください。
証明書エラーが表示されずにHTTPSで接続でき、また証明書情報を表示して画像のように正しく接続保護されていれば成功です。

終わりに

現在ではWEBサイトは常時SSL化が当然になっていますので、GoでWEBサーバを構築する際も当然HTTPSに対応することが求められます。繰り返しますが、今回作成したオレオレ証明書はローカル環境以外では使用しないでください。

無事に通信の暗号化もできましたので、次回以降はログインページの実装やセッションの取り扱いなどを解説していきたいと思います。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

フォローする

スポンサーリンク
スポンサーリンク