Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Go言語 ginでhttpsサーバとして扱う

今回は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です。

■最後に

今回はセキュリティも考慮してhttpsサーバを立ち上げる方法についてまとめてみました。
今度はログイン機能でも作ってみようかな?🤔