【ドメイン設定】VPSにSSL対応ドメインを設定する

確定申告が無事終わりました。
改めて、お金について考える良いきっかけになりました。
なるべく、コストを把握するように心がけるようにしたいですね。

さて、
コスト意識を持つようになってから、サーバーの運用費がちょっと高いかなと感じる事がありました。
EC2で稼働しているコンテンツがあるのですが、ランニングコストが割りに合わないと感じました。
そんなこんなで、EC2からVPSに引越しました。

その際、ドメインの設定とSSLの対応を行いましたので、その方法について記載します。

イントロダクション

この記事で得られること

  • VPSのドメイン設定方法がわかる
  • Let's encliptの設定方法がわかる

所要時間

30分から1時間程度

環境

サーバーはCooHaのVPSを使用します。

www.conoha.jp

サーバーの構成は下記です。

種類 名前 バージョン
os centos 7.0
webサーバー apache 2.4.6

今回の構成

下記のような構成を考えています。

f:id:nakahashi_h:20180407171838p:plain

また、記事内で記載する情報はそれぞれ下記にしますので、それぞれの環境に合わせて調整をお願いします。

項目
ドメイン sub.example.com
webサーバーのドキュメントルート /var/www/html

DNSの設定について

今回は、ドメイン管理会社のNSを使う想定で構成しました。
もちろん、ドメイン管理会社のDNSでIPを直接指定する事も可能です。

f:id:nakahashi_h:20180407171900p:plain

webで公開する程度であれば、経験上どちらで設定しても問題ありません。
今回は、ホスティング会社のドキュメンテーションに準じました。

この2つの違いは何か?

DNSの設定できる内容が違います。
ホスティング会社とドメイン管理会社では、設定の自由度が異なります。
制限について、本記事では触れませんが、知識として持っておくと良いかもしれません。

ConohaのDNS設定

ConohaのDNSにドメインを登録する手順を記載します。

DNSにドメインを登録

Conohaのコントロールパネルにログインします。
サイドメニューから「DNS」を選択します。

ドメインリストが表示されますので、右上の「+ドメイン」を選択してください。
選択すると、新しくドメインを入力するフォームが表示されますので、次のように設定してください。

f:id:nakahashi_h:20180407172153p:plain

項目名 設定値
ドメイン名 sub.example.com

入力を終えたら「保存」を選択してください。 保存が終わると、入力したドメインと紐づくNSレコードが表示されます。

f:id:nakahashi_h:20180407172339p:plain

NSで指定されているIPはRoute53の設定で使いますので、メモしておいてください。

ドメインとサーバーの紐づけ

このままだと、ドメイン名だけ宙に浮いたような状態です。
ドメインにサーバーを紐づけます。

ConoHaのVPSのIPの調べ方については触れませんが、簡単に手順だけ記載しますと次のように調べます。

  1. サイドメニューから「サーバー」を選択
  2. サーバー一覧が表示されますので、対象のサーバーを選択
  3. 選択したサーバーの詳細情報が見れますので、ネットワーク情報の「IPアドレス」に書いているIPを取得

それでは、設定の手順です。
前項で、ドメインリストにドメインが設定されるところまでできたかと思います。

f:id:nakahashi_h:20180407172339p:plain

右上の鉛筆ボタンを選択ます。
すると、新しくレコードが追加できるようになります。

左下にある「+」を選択します。
すると、新しくDNSのレコードを追加できるようになります。

f:id:nakahashi_h:20180407172610p:plain

AレコードにVPSのIPを設定します。
次のように設定してください。
下記以外の値は空欄で構いません。

項目名 設定値
タイプ A
<VPSのIP>

入力を終えたら「保存」を選択してください。 これで、ドメインとVPSのサーバーが紐づきました。

以上で、ConoHa側の設定は終わりです。

Route53の設定

次に、AWSのRoute53の設定をします。
今回は、既に所持しているドメインを使用しますので、ドメインの購入方法は他のサイトを参考にしてください。

AWSにログインして、Route53のページに遷移します。
Route53のダッシュボードに遷移したら、サイドメニューから「Hosted zones」を選択します。

所持しているドメインの一覧が表示されますので、対象のドメインを選択します。

ドメインが設定しているレコード一覧が表示されますので、ページ上部にある「Create Record Set」を選択します。
f:id:nakahashi_h:20180407172802p:plain

「Create Record Set」の画面が表示されたら、次のように設定します。
他の項目は初期値で構いません。

f:id:nakahashi_h:20180407172853p:plain

項目名 設定値
Name sub
Type NS
Value <ConoHaのNSのIP>

設定が終わったら、下にある「Create」を選択します。
これで、数分後には「sub.example.com」でアクセスできるようになります。

以上で、Route53の設定は終わりです。

SSLの設定

最後に、SSLの設定を行います。

証明書を発行する認証局は、GlobalSignや、GeoTrustが有名です。
また、Route53で購入したドメインであれば、AWSで無料で証明書を作ることができます。

ただ、
前者は値段が高く本格的な商業目的でなければ手が出しにくいですし、
後者は別サーバーにしているので、調査に時間がかかってしまいます。

手っ取り早く設定したかったので、今回は「Let's Encrypt」で証明書を発行します。

letsencrypt.jp

「Let's Encrypt」は無料で証明書を発行してくれる認証局です。
無料と言えど、特に機能的にも知名度的にも問題はありません。
ただ、無償であるが故のデメリットもあります。

もし、気になるようであれば、下記のページをご確認ください。

ssl.sakura.ad.jp

それでは手順について記載していきます。
以降の作業はターミナルになりますので、接続する準備をして下さい。

webサーバーの設定

webサーバー側でSSLで接続できるように準備をします。

余談ですが、
この設定を省略して進めると、いざ証明書を作ろうとした時に次のようなエラーが発生します。

Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to  the CA that you control your domain. Please add a virtual host for port 80.

VartualHostの設定

VartualHostの設定がまだの場合は、設定ファイルを追加します。
既存のconfファイルを変更するでも良いですが、今回は分けています。

$ touch /etc/httpd/conf.d/virtual.conf
$ vim /etc/httpd/conf.d/virtual.conf

apacheのVartualHostの設定をします。

/etc/httpd/conf.d/virtual.conf

Listen 80
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName sub.example.com
</VirtualHost>

設定後は、apacheを再起動します。

また、上記のconfに記述したListen 80は、他のconfで設定している場合は消してください。
もし、既にどこかのファイルで記述していた場合は、apacheが起動できない原因になります。

httpsのポート開放

サーバーを引っ越した際に、http(80番)ポートの開放は済ませていましたが、https(443番)ポートは開放していませんでした。
そのため、このままSSLの設定をしても接続できません。

$ firewall-cmd --list-all
public (active)
 ...
  services: dhcpv6-client ssh http
  ...

httpsの場合は443ポートでアクセスするで開放します。

$ firewall-cmd --permanent --add-service=https --zone=public
$ firewall-cmd --reload

これで、httpsで接続できるようになります。

$ firewall-cmd --list-all
public (active)
  ...
  services: dhcpv6-client ssh http https
  ...

Certbotの設定

「Let's Encrypt」の証明書発行、および、管理は「Certbot」と言うクライアントツールを使用します。
この項では、クライアントツールの設定を行います。

Certbotのインストール

まずは、webサーバーにクライアントツールをインストールします。
今回は、CentOS7+apacheの環境に沿ったインストール手順で解説します。

Certbot クライアントのインストール - Let's Encrypt 総合ポータル

もし、別のOSだった場合は、別途確認してください。

ユーザーガイド - Let's Encrypt 総合ポータル

sshでサーバーにアクセスして、rootアカウントに変わります。
Certbotをインストールします。

$ sudo yum install epel-release
$ sudo yum install certbot python-certbot-apache

Certbotにドメインを登録

Certbotに証明書を発行するドメインを設定します。

$ sudo certbot run -d sub.example.com --apache

実行すると、いくつか対話形式で設定する項目が出てきますので、次のように設定します。

証明書に関するメールの通知先

証明書の更新や、情報を通知するためのメールアドレスを設定します。
連絡がつくメールアドレスを設定してください。

Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): <メールアドレス>
メーリングリストへの登録

「Let's Encrypt」のメーリングリストへの参加有無を聞かれます。
加入すれば有益な情報を得られるかもしれませんが、ここに関しては任意で入力してください。

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let\'s Encrypt project and the non-profit
organization that develops Certbot? We\'d like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
------------------------------------------------------
(Y)es/(N)o: <任意>
「Let's Encrypt」の利用規約への同意

「Let's Encrypt」の利用規約への同意を求められますので、問題がなければaを入力してください。

Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a
httpプロトコルによるアクセスの許可

httpでアクセスさせるかどうかの設定を行います。
1は、httpのアクセスを許可します。
2は、httpでアクセスされたら、httpsにリダイレクトさせます。

今回は、常時SSLにしたいので、2を選択します。

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

選択すると、「Certbot側でリダイレクト設定を行った」という主旨のメッセージが表示されます。  

Redirecting vhost in /etc/httpd/conf.d/virtual.conf to ssl vhost in /etc/httpd/conf.d/virtual-le-ssl.conf

実際には、次のような事が自動で行われています。

  • リダイレクトさせる設定にした場合、VirtualHostで追加した設定ファイル(virtual.conf)にリダイレクト設定を追加 。
  • https用の設定ファイル、virtual-le-ssl.confを追加。

Certbotの設定完了

以上で設定が終われば、あとは自動的に証明書の発行と設定をしてくれます。
全て完了すると次のようなメッセージが出力されます。

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled https://sub.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=sub.example.com
-------------------------------------------------------------------------------

このメッセージの後に表示される「IMPORTANT NOTES」には、作成した証明書の場所や、更新方法が書いています。
確認してみてください。

Cerbotの更新準備(未確認)

(ここの記事投稿時はまだ更新不要なので検証はしていません。 ご了承ください。)

上記まで実施すれば、sslの調整は終わりです。
しかし、「Let's Encrypt」で作られた証明証の有効期限は3ヶ月と短いです。
そのため、都度更新する必要があります。

更新の方法は、サーバーに接続して、次のコマンドを実行します。

$ certbot renew

自動更新の準備

有効期限が近くなると、登録したメールアドレスに通知が来ます。
更新手順も決まっているので、自動で更新したいものです。
CentOSで時限処理を行う場合は、crontabの設定を行います。

crontabに、次のタスクを登録します。

$ crontab -e
00 04 01 * * root /bin/certbot renew --webroot-path /var/www/html --post-hook "systemctl reload httpd"

上記の設定により、毎月1日の4時に更新が実行されます。

参考URL

qiita.com



以上です。
これで、年で見れば数万円のコスト削減になるので早いうちに手を打てたのは良かったです。
SSLの設定自体も割と簡単にできるので、ちょっと時間を取ってやるだけの意味はあるかと思います。