Webは用いる人のリテラシーで決まる ウェブ運用と開発現場を経験したエンジニアのTIPS
TOP > BLOG > IT記事

CentOS7にSSLを設定しよう nginx編

早川朋孝 早川朋孝
EC専門のSE

NginxのインストールされたCentOS7を利用したサーバーに有償のSSL証明書を設定する手順を紹介する。さくらインターネットにはSSL証明書のインストールを2万円で依頼できるが、なぜかapacheのみが対象でnginxの場合は依頼できない。そのため、nginxの場合の手順をここに紹介する。

環境

  • さくらVPS
  • CentOS7系
  • nginx

SSLを導入する大まかな流れ

  • パケットフィルタの確認
  • 秘密鍵とCSRの作成
  • 証明書をサービス事業者に申し込む
  • 認証ファイルをサーバーに設置する
  • 証明書と中間証明書と秘密鍵をサーバーに設置する
  • nginx の設定ファイルを書き換える
  • SSLポートを開放する
  • httpからhttpsに転送設定する
  • nginxを再起動する
  • フロントの確認をする

パケットフィルタの確認

さくらVPSやその他VPSサービスにはパケットフィルタがデフォルトで設定されている場合がある。そのためコントールパネルにログインして443ポートが利用可能か事前に確認する。443が開いていない場合は、当然開ける必要がある。

秘密鍵とCSRの作成

秘密鍵とCSRを作成する。一般に公開されている生成ツールを使ってもいいし、OpenSSLを使ってサーバー内で生成してもいい。参考(https://qiita.com/dribble13/items/52372ffbd218d2b019f8)。なお、秘密鍵にパスワードを設定する必要は基本的にないと思う。もし運用上必要ならパスワードを設定すればいい。

秘密鍵とCSRはテキストファイルで必ず保存しておく。秘密鍵を紛失するとやり直しとなり、かなり面倒なことになる。

証明書をサービス事業者に申し込む

FuiSSLとかさくらインターネットの証明書を購入しよう。申し込みの際には上の手順で作成したCSRが必要となる。

またサブドメインで複数のウェブサイトを同一サーバーで運用している場合には、ワイルドカードというプランもあるので選択肢に入れるといいだろう。ワイルドカードの場合はコモンネームが 「*.hogehoge.com」のようになるので注意のこと。

認証ファイルをサーバーに設置する

証明書の発行には認証が必要となる。認証には段階があり、高額な証明書ほど認証が厳格である。ここではドメイン認証レベルという前提で手順を紹介する。

簡単なのはサーバーに認証ファイルを設置することだ。サーバーの公開ディレクトリに、「 .well-known/pki-validation/認証ファイル.txt」のように設置すればOK。証明書が発行されない場合はhogehoge.jp/.well-known/pki-validation/認証ファイル.txtで認証ファイルにアクセスできるか確認しよう。ちゃんとアクセス出来るのに発行されない場合は、サービス提供元に問い合わせるといい。

証明書と中間証明書と秘密鍵をサーバーにインストールする

証明書が発行されたら証明書と中間証明書を結合し、サーバーの任意のディレクトリに設置する。任意といっても、公開ディレクトリ配下には置かないこと。同じディレクトリに秘密鍵も設置しよう。

nginxの設定ファイルを書き換える

まず、設定ファイルは必ずサーバー内にバックアップをとること。間違えも戻せるので。

SSLを新規で追加する場合は、443ディレクティブそのものがないはず。以下のような記述を追加する。80ポートの記述をコピーして、SSLに関係する記述を追加すればいい。証明書と秘密鍵の設置場所は、上の手順で設置した任意のディレクトリである。

server {
   listen 443;
   server_name localhost;
   ssl on;
   ssl_certificate /home/user/ssl/certs.pem; 
   ssl_certificate_key /home/user/ssl/private.key; 
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
   }

設定ファイルを書き換えたら、以下のコマンドで設定の確認をする。

$ nginx -t

以下のようにsuccessfulと表示があれば問題なし。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

エラーが出る場合はエラーメッセージをよく確認しよう。やっかいなのはkey value miss matchだ。秘密鍵の値が違っている場合、なんらかの不手際があったことを意味し、たいていは最初からやり直しである。なお証明書の再発行は、サービス提供元に依頼すれば対応してくれると思う。

SSLポートを開放する

SSLポート、すなわち443を開放する。CentOS7の場合はFirewallを設定すればいい。dockerを使用している場合は状況は違うかもしれないので、確認のうえ設定するといい。

$ sudo service firewalld status
$ sudo systemctl start firewalld
$ sudo firewall-cmd --list-all
$ sudo firewall-cmd --zone=public --add-service=https --permanent
$ sudo firewall-cmd --zone=public --add-service=http --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all

最後にnginxを再起動する。

$ sudo systemctl restart nginx.service

以上の手順が問題なくできれば、httpsでアクセスできるようになっている。

httpからhttpsに転送設定する

最後に必要に応じてhttpからhttpsへ転送する。なお、ステータスコードを301にするかどうかは目的による。

server {
        listen         80;
        server_name    hogehoge.jp www.hogehoge.jp;
        return 301 https://$host$request_uri;
        }

フロントの確認をする

念のためフロントの表示に問題ないか確認しよう。サーバーの設定に問題がないのに、ブラウザのアドレスバーにエラー表示がある場合は、フロントに問題がある場合がある。画像やcssのパスを絶対パスで記述し、読み込み先がhttpの場合はエラーが出る。他にもcssの背景などに絶対パスが紛れている場合もある。そういう場合はしらみつぶしに一つずつ修正していくしかない。chromeの検証のネットワークを使って絞り込みをすると簡単に探せる。

以上でSSLの新規設定は終了である。有償の証明書は1年おきに更新が発生するので、更新時期に証明書と秘密鍵の再発行が必要となる。

今回は有償の証明書を前提としてSSLの設定手順を紹介したが、無償のLet’s Encryptという証明書もあるので、そちらをVPSに導入したい場合はLet’s encryptをサーバーにインストールしてcronで自動更新すればSSLはずっと無料を参照されたし。

×
このブログを書いてる人
早川 朋孝 EC専門のSE
IT業界歴20年のエンジニアです。ネットショップ勤務で苦労した経験から、EC・ネットショップ事業者に向けて、バックオフィス業務の自動化・効率化を提案するSEをしています。
プロフィール
API連携の相談にのります
趣味は読書、ピアノ、マリノスの応援など
PAGE TOP