🌍

Expressを使ったWebサーバーにTLSの設定を追加してみる。

2022/02/05に公開

Node.js Expressを使って開発していたWebサーバーにSSLの設定を追加できたのでその方法について投稿いたします。

流れ

1. OpenSSLのインストール
2. 秘密鍵とSSL証明書ファイルの作成
3. サーバー設定ファイルにTLS有効化の設定を追加

OpenSSLのバージョンについて

OpenSSLのバージョンは、LibreSSL 2.8.3 で設定いたしました。

ソースコードとプルリクエストについては、下記の通りです。
https://github.com/mashharuki/iroha/
https://github.com/mashharuki/iroha/issues/1

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設定をする場合は認証局を運用している企業にお願いして
署名してもらわないとダメですね。。

国内だと下記のような企業が挙げられます。

https://www.secomtrust.net/

https://www.cybertrust.co.jp/

https://jp.globalsign.com/

最後に

今回は、OpenSSLを使ってお手軽にTLSの設定を追加することを実践してみました。
httpsは、現代では当たり前のように使われているプロトコルなのでしっかりと理解できるようにしたいと思います。
ありがとうございました。

Discussion