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

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

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

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

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

### 1. OpenSSLのインストール
  まずは、OpenSSLをインストールします。
  Mac OSなら下記コマンドでインストールします。
  <code>brew install openssl</code>

### 2. 秘密鍵とSSL証明書ファイルの作成
  OpenSSLをインストールしたら下記コマンドを実行して秘密鍵と証明書ファイルを作成いたします。
  <code>openssl req -x509 -newkey rsa:2048 -keyout privatekey.pem -out cert.pem -nodes -days 1095</code>
 
  ↑ 今回は、公開鍵暗号アルゴリズムとして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}`)
 });
```

### 起動後の確認

起動して、<a href="https://localhost:3001/">https://localhost:3001/</a>にアクセスすると
下記のようにhttpsでアクセスできるようになる。
<img src="https://user-images.githubusercontent.com/44923695/152635758-1c20d8e2-fa09-4988-84a1-5ee4eade4564.png" />

※ 最初にアクセスした時は、エラー画面に遷移するので、ブラウザにフォーカスした状態で、「thisisunsafe」と打ち込むと遷移できます。(スペースなし)

### 証明書の中身

<img src="https://user-images.githubusercontent.com/44923695/152635894-accf03a2-7940-48d2-94d3-d213c217a94a.png" />
↑ルートCAによって署名されていないので証明書が無効だと言われます。
開発用なので一旦はこれで問題ないですが、商用で本格的なTLS設定をする場合は認証局を運用している企業にお願いして
署名してもらわないとダメですね。。

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

https://www.secomtrust.net/

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

https://jp.globalsign.com/

### 最後に

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