Expressを使ったWebサーバーにTLSの設定を追加してみる。
Node.js Expressを使って開発していたWebサーバーにSSLの設定を追加できたのでその方法について投稿いたします。
流れ
1. OpenSSLのインストール
2. 秘密鍵とSSL証明書ファイルの作成
3. サーバー設定ファイルにTLS有効化の設定を追加
OpenSSLのバージョンについて
OpenSSLのバージョンは、LibreSSL 2.8.3 で設定いたしました。
ソースコードとプルリクエストについては、下記の通りです。
1. OpenSSLのインストール
まずは、OpenSSLをインストールします。
Mac OSなら下記コマンドでインストールします。
brew install openssl
2. 秘密鍵とSSL証明書ファイルの作成
OpenSSLをインストールしたら下記コマンドを実行して秘密鍵と証明書ファイルを作成いたします。
openssl req -x509 -newkey rsa:2048 -keyout privatekey.pem -out cert.pem -nodes -days 1095
↑ 今回は、公開鍵暗号アルゴリズムとしてRSA(鍵長:2048ビット)を使用しました。
アウトプットとしてprivatekey.pemとcert.pemが実行ディレクトリ配下に生成されます。
証明書ファイルの中身の例
-----BEGIN CERTIFICATE-----
MIIDazCCAlOgAwIBAgIURpu0TxVthNEWC38f8BZeFREMGjMwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCSlAxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMjAyMDUwOTAxMTBaFw0yMzAy
MDUwOTAxMTBaMEUxCzAJBgNVBAYTAkpQMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQCMqIHSJkeCVcFVR6pXuH3hWyVG9Vus4iUd/nBZckUO
Prpd676wuRMBGjy7Ecr4kFaH4a+a44UKbV8C68lhjENPyCy20GR/o5tKgrT8WuCq
Art6wnIZxykH8sBKOOpHeYy1rs4Q7rliiaKcwtJ7oLBuvdJtKLtvV7YuuGjJoxlg
7ICvtUjezlO7rJPzMOdRurqVM7X2uhQpFkUrfx0iX/NvwbaLzJWoR/kJsuj8CTEB
TX6SwNWltR/1v3i8dS+jW8lN0Oz5RWg0wzmJfrInIQh0SZISW48t6+YgHCQRx/tF
ZLCorXtZyJmgbGkiMYeh2Y8UDWAequ5RhzD5voiBV9ThAgMBAAGjUzBRMB0GA1Ud
DgQWBBSvD3FSPrNocjKcZvng+u6JHKpZ2zAfBgNVHSMEGDAWgBSvD3FSPrNocjKc
Zvng+u6JHKpZ2zAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBV
eNNdd2YCgP01SjOp8F7mZ7hbDMLr57m6HMyq3AFwLvHnRy/hHIkBuVu8cQnhJ/AM
uZ8dTfI0CpDYlN0v+dqv7kNFPyUV2t07OkXYxH9Z+DbT6IU2Q6L7gmFUX+CDo/TL
XLfaT5Quuz2c9KNUnk7ggvm/nfk0hawhmM8kKvmAAkbln/lG6wIvGeyi2C4D5v1+
nco1lBkWm3IWgQR+3TzPS7xQnQp9Am6KZL7t6gR+PdBlkgCLMMc9C/UrT3z3B5W+
aG0PXHeMG8ObTHbKz6AmJC6PADXLoqHzcUAzso+Ijxo0C2hBI3/xiVaubZVNperQ
37rKXnM0xT2QcYcNISIZ
-----END CERTIFICATE-----
3. サーバー設定ファイルにTLS有効化の設定を追加
サーバーの設定ファイルに下記の内容を追加して、サーバーを起動するようにする。
// HTTPS通信に対応するための設定
const server = require('https').createServer({
key: fs.readFileSync('./server/tls/privatekey.pem'),
cert: fs.readFileSync('./server/tls/cert.pem'),
}, app);
// 起動
server.listen(portNo, () => {
console.log('起動しました', `http://localhost:${portNo}`)
});
起動後の確認
起動して、 https://localhost:3001/ にアクセスすると
下記のようにhttpsでアクセスできるようになる。
※ 最初にアクセスした時は、エラー画面に遷移するので、ブラウザにフォーカスした状態で、「thisisunsafe」と打ち込むと遷移できます。(スペースなし)
証明書の中身
↑ルートCAによって署名されていないので証明書が無効だと言われます。
開発用なので一旦はこれで問題ないですが、商用で本格的なTLS設定をする場合は認証局を運用している企業にお願いして
署名してもらわないとダメですね。。
国内だと下記のような企業が挙げられます。
最後に
今回は、OpenSSLを使ってお手軽にTLSの設定を追加することを実践してみました。
httpsは、現代では当たり前のように使われているプロトコルなのでしっかりと理解できるようにしたいと思います。
ありがとうございました。
Discussion