プリザンターをhttps(TLS)化する方法を解説します。
ここでは以下の記事で作成した環境を元に説明します。Webサーバーにはnginxを利用し、自己証明書(オレオレ証明書)を使用します。
暗号鍵、CSR(証明書署名要求)、CRT(TLS証明書)の作成
https通信を行うには以下の3つが必要になります。
1.暗号鍵
2.CSR ※Certificate Signing Request(証明書署名要求)
3.CRT ※X.509 Certificate(TLS証明書)
https化を行うための大きな流れは以下のようになります。本来は外部の認証局を介してTLS証明書を発行しますが、オレオレ証明書では名前の通り自分自身で証明書を発行します。
1.暗号鍵からCSRを作成
2.CSRを認証局(CA)に提出(TLS証明書の発行申請)
3.認証局が署名し、CRT(TLS証明書)を発行
4.TLS証明書をサーバーにインストール
暗号鍵の作成
opensslコマンドを利用し、2048ビットのRSA暗号鍵を作成します。「server.key」が暗号鍵です。
sudo mkdir /etc/nginx/ssl
sudo openssl genrsa -out /etc/nginx/ssl/server.key 2048
CSRの作成
暗号鍵「server.key」からCSR「server.csr」を作成します。
sudo openssl req -new -key /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.csr
上記コマンドを実行すると、以下のような質問が出てくるので入力していきます。今回はテスト用なので以下の必要最低限な2つだけ入力します。その他は未入力でデフォルトのままでもOKです。
Common Nameは一致していないと、正しいサーバーとして認識されないので注意してください。
Country Name:JP
Common Name:nginxをインストールしたサーバーのホスト名またはIPアドレス
Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: nginxサーバーのホスト名 または IPアドレス
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
作成したCSRの中身を確認してみます。
sudo openssl req -text -in /etc/nginx/ssl/server.csr -noout
CRTの作成
秘密鍵とCSRを利用し、自己証明書「server.crt」を作成します。有効期限は-daysオプションで365日に設定しています。
sudo openssl x509 -days 365 -req -signkey /etc/nginx/ssl/server.key -in /etc/nginx/ssl/server.csr -out /etc/nginx/ssl/server.crt
作成した自己証明書の中身を確認します。
sudo openssl x509 -text -in /etc/nginx/ssl/server.crt -noou
nginxのTLS設定
リバースプロキシの設定変更
/etc/nginx/conf.d/pleasanter.conf の「listen」のポート番号を80→443に変更し、サーバー証明書の設定を追加します。
「ssl_protocols TLSv1.2 TLSv1.3;」で利用可能なTLSバージョンを指定しています。
「ssl_ciphers HIGH:!aNULL:!MD5;」では利用可能な暗号化アルゴリズムを指定しています。”HIGH”は強度の高い暗号化のみを許可、”!aNUZLL”は認証なしの暗号化を許可しない、”!MD5″はMD5を許可しない設定になります。このあたりは必要に応じて利用したい内容に変更してください。
server {
listen 443 ssl;
server_name <サーバーのホスト名またはIPアドレス>;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 100M;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
ポート(443)の開放
httpsに利用するポート(443)を開放します。httpのポート(80)をオープンしている場合は閉じておきます。nginxをインストールしているEC2インスタンスのセキュリティグループもhttps(443)を許可するよう変更しておきます。
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --remove-port=80/tcp
sudo firewall-cmd --reload
最後にnginxとプリザンターサービスを再起動します。
sudo systemctl restart nginx
sudo systemctl restart pleasanter
「https://サーバーのIPアドレスまたはホスト名」にアクセスし、https通信できれば完了です。自己証明書なので何もしないとブラウザに「保護されていない通信」と表示されますが、これはブラウザが信頼するCAから発行された証明書ではないため表示される警告です。消したい場合は作成した証明書をブラウザが信頼するように設定してください。
Windowsの場合はCRTファイルをダブルクリックし、証明書のインストールで「信頼されたルート証明機関」に追加することで消すことができます。
以上