今回はgo言語でのhttpsサーバ立ち上げ方法についてまとめたいと思います!!
今までhttpアクセスができるようにサーバ立ち上げておりましたが、セキュリティに配慮するならhttpsも扱えた方がいいよな🤔
と思い、試しにginで実現させてみました。
■環境
今回httpsサーバ立ち上げで実施した環境はこちら。
・OS:Ubuntu20.04
・言語:go言語(1.13.8)
・ツール:gin
■オレオレ証明書
httpsサーバを立ち上げるにあたり、SSL証明書が必要になります。
今回は自己署名を用いることにします。
自分の環境で試しに動かすなら自己署名でよいですが、
不特定多数が使用する場合や企業等ちゃんとした環境で動作させたい場合には正規の認証局が発行する証明書を利用ください。
では自己署名の作成していきます。
まずは秘密鍵を生成します。
秘密鍵を生成するにあたってOpenSSLを用います。
OpenSSLをインストールする場合はこちらのコマンドを実行すればOKです。
apt-get install openssl
ではOpenSSLで秘密鍵を生成します。
コマンドはこちら。
openssl genrsa -aes128 -out server.key 2048
こちらを実行すると下記メッセージが出力され、パスフレーズの入力が求められるため入力を行います。
Enter pass phrase for server.key: Verifying - Enter pass phrase for server.key:
もしパスフレーズが不要の場合には下記を実行してパスフレーズの削除を行います。
openssl rsa -in server.key -out server.key
次に証明書署名要求(CSR / Certificate Signing Request)を作成します。
証明書署名要求とは、認証局にサーバの公開鍵に電子署名してもらうよう要求するメッセージのことを指します。
コマンドはこちら。
openssl req -new -days 3650 -key server.key -out server.csr
こちらの通り、location等の入力が求められるので各項目を入力していきます。
Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
そして、最後にサーバ証明書の作成を行います。
コマンドはこちら。
openssl x509 -in server.csr -out server.pem -req -signkey server.key -days 3650
これで証明書の作成が完了です。
こちらを実行することにより、
server.crt server.csr server.key
というファイルが生成されているかと思います。
■httpsサーバを立ち上げる
ではhttpsサーバを立ち上げていきます。
まずはサーバであるgo ginを用いたコードです。
こちら!!
package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func Index(ctx *gin.Context) { fmt.Println("Index") ctx.HTML(http.StatusOK, "test.html", gin.H{}) } func main() { r := gin.Default() r.LoadHTMLGlob("html/*") r.GET("/", Index) // ログイン画面(GET処理) r.RunTLS(":8080", "./Certificate/server.pem", "./Certificate/server.key") }
こちらのコードを実行すれば、
httpsでアクセスするとtest.htmlのページが表示されるようになるかと思います。
httpsサーバとして立ち上げるためには、
r := gin.Default() r.RunTLS(":8080", "./Certificate/server.pem", "./Certificate/server.key")
と定義すればOKです。
RunTLSがhttpsサーバを立ち上げるためのコードで引数に先ほど生成した秘密鍵や証明書を指定します。
■ついでに
ginで表示させたページに対してjavascriptファイルやimageファイルなどの静的ファイルにアクセスするためには、
r.Static("/Certificate", "./Certificate")
というようにStaticで利用したいファイルが格納されたフォルダを指定すればOKです。