ApacheをHTTPS化して通信を暗号化する

LABO

はじめに

ApacheをHTTP通信で行えていることが前提です。
また固定IPアドレスと、ドメインを所持している必要があります。
前提として以下の投稿の続きで説明しますが、上記が準備できているのであれば特に問題はありません。
また、固定IPはAWSサービスを前提に説明しているので持っていると思いますが、ドメインを所持している人はいないかもしれないのでその点は説明します。

なお、このページはPRを含みます。
また、厳密にはそうじゃないというところはありますが、初心者に向けていますので明らかな間違いでない場合は目をつぶってください。

はじめにすること

通信の暗号化のために必要な証明書と、ドメインの説明をまずしたいと思います。

証明書とは?

暗号化通信をするためには証明書が必要になります。
ここで証明書の説明に入ると長くなるので簡単に説明すると
ある信頼のおける人が「このサーバは大丈夫だよ」と言う証明をしてくれたものです。
証明書ってのが必要なんだなと思ってください。

この信頼のおける人と言うのが「公開鍵証明書認証局」(以降、認証局)です。
そこで、この認証局に証明書の発行をお願いしなければなりません。
そのためには認証局が証明するべきサーバを特定できなければならず、
ちょっとしたひと手間が必要になります。

証明書を取得するには

認証局がサーバを特定するためにはドメインが必要になります。
証明書には3タイプありますがいずれも必要です。

  • ドメイン認証
  • 企業実在認証
  • EV認証

企業実在認証/EV認証は法人向けですのでここでは扱いません。
ドメイン認証出来ることを目指します。
実際に仕事で証明書発行を企業の代理で行う場合などは知っている必要があります。

まずはドメインを取得して、自分の持っている固定IPがあればその紐づけをすることで、ドメイン名からIPを特定することが出来るようになり、認証局がサーバを認識できるようになります。

自分のドメインを持とう

ドメインは無料と言うわけにはいかないので権利を購入する必要があります。
(一部無料のキャンペーンなどはある)
AmazonではAmazon Route 53と言うサービスから購入することもできますし、有名なところではお名前.comや、バリュードメインと言ったものもありますので、お好みの所があればそこから取得してください。

ここからPRになりますが、私が使っているのはスタードメインです。

おすすめポイントは、比較的安価でドメインの取得ができることと、ドメインを取得すると簡易なサーバが無料でついてきます。
ドメインを取得すると

  • 自動的に20GBの容量を備えた簡易サーバがドメインを保持している間借りられる
  • メールサーバが最初からついてくる

のですぐに自分専用のドメインのメールアドレスなどが作れますし、WordPressもそのサービスの中で用意されているのですぐに自分のドメインでブログを開設することもできます。

例えば、イベントごとなどで一時的にPR用のウェブサーバとメールアドレスが欲しいなどと言った場合に便利です。
捨てアドが欲しいときなんかもかなり使えます。
なので、重宝して使っています。

値段も「.website」などでドメインを取得すれば100円で一年間そのドメインの権利を得ます。
簡易とはいえ1年間使えるサーバもついてくるのも嬉しいです。
※とはいえサーバの機能はかなり制限されており提供されたサービスのみが使用可能です。
(以降の金額も2024/05/22現在)

ドメイン取得後の注意点

安価でドメイン取得が出来るのですが、毎年(サービスによっては複数年権利取得可能)更新料と言うものが掛かってきます。
先ほどの「.website」も初年度(取得時)は100円でも、更新料が5,166円掛かってしまいます。
基本的に自動更新が多いのではないかと思いますので思わぬ出費とならないように注意しましょう。
先ほどのサイトのリンクの中に価格一覧と言うページがあるので確認してみてください。
一部ですが、こんな感じです。(2024/05/24調べ)

スタードメイン以外のサービスを使用する場合は、各サービスのサイトに同じような料金表があると思います。

ドメインは一度気に入ってしまうと(メールなどで使用し始めると)長く使いたくなると思うので、その場合は更新料で考えるのも良いかもしれません。
私はイベントドメインとして.monsterを購入しましたが気に入ってしまって捨てられなくなってしまいました(^-^;
いずれにせよ、テストで使いたいだけであれば100円で用意できるという事です。

と、PRはここまでにして何らかの手段でドメインの取得を行ってください。
なお、ドメインの取得から使えるようになるまで少し時間のかかる場合もあるので、それも各サイトの説明を読んでください。

ドメインとIPアドレスを紐づけよう

ここからは、私の使っているスタードメインのイメージで説明します。
他のサービスも同じような設定が行えるところがあると思います。

ドメイン管理ツールから

DNSレコード編集に行きます

レコード追加を押します。

ここではタイプAとなっていると思いますが、Aレコードといいます。
他のサービスではそう呼んでいるところが多いかもしれません。
(すみません最近スタードメインしか使っていないので)
AはAddressのAで、ホスト名をIPアドレスに変換してくれるレコードです。

この例では、「sample.domain1.net」というホスト名を「Aレコード」として、コンテンツ(IPアドレス)「XXX.XXX.XXX.003」に変換できるようにするという設定です。
これを登録することで、DNSサーバにレコードが登録されます。

これをすると何がいいのか?
先の投稿(以下のリンクを参照)で、「http://パブリックIPアドレス」でアクセスしてくださいとしていたと思いますが、たとえば上記のAレコードを登録したドメインを持っていれば「http://sample.domain1.net」とすることで、自動的にsample.domain1.netパブリックIPアドレスに変換されるので、「http://パブリックIPアドレス」と同じ結果でアクセスができます。

自分のお気に入りの名前で、自分のサーバにアクセスできるわけです。

証明書を発行してもらおう

まずは、サーバにアクセスしましょう。
SSHクライアントで、サーバに接続です。
でも、もうIPアドレスで接続しなくてもホスト名で接続できるはず!
こっちのほうが何か格好いいし自分一人のサーバ感が増す!(個人の感想です)

いつも通りroot権限にスイッチ
ここからはroot権限であることを前提にコマンドは実行されます。

まずは、証明書を発行するために必要なOpenSSLと、ApacheでHTTPSプロトコルで通信を行うためのmod_sslをインストールします。
それぞれのコマンドでComplete!のメッセージがでれば成功です。

Let’s Encryptにお願いしよう!

証明書を発行してもらうためには、先に説明した通り「公開鍵証明書認証局」ってところにお願いして証明書を発行してもらう必要があります。
認証局でネットを調べると色々出てきます。
「どうせお高いんでしょう?」そう思ったあなた!
そんなあなたに「Let’s Encrypt」!
無料で証明書の発行を行ってくれます。
但し証明書の有効期間は90日と短いのですが、自動更新の仕組みなどを作っておけばそこは大丈夫です。

また、Let’s EncryptはCertbotという公式のクライアントツールを提供してくれており、簡単な手順で証明書の発行、自動更新などを行ってくれます。
まさに、至れり尽くせりの親切な認証局なのです。

certbotをインストールしよう!

certbotをインストールするのですが、certbotは標準のパッケージではありません。
CentOSやRHELの標準リポジトリには含まれていないため、EPELリポジトリからインストールする必要があります。
そこでまずはepel-releaseをインストールすることになります。

epel-releaseとは、EPEL (Extra Packages for Enterprise Linux) は、Fedoraプロジェクトによって管理されている追加パッケージリポジトリです。
早速コマンドを実行してみましょう。

これでcertbotがパッケージからインストールできるようになったのでインストールしましょう。

依存するパッケージが多いので少しかかりますが、Complete!の結果を待ちましょう。

前回からの続きで行っている人へ

すみません、前回とは以下の投稿です。
今回の前提にもなっていますが、一点設定を変える必要があります。

以下のコマンドでapacheの設定ファイルを開いてください。

設定ファイルの最後に以下の行を書いて貰ったと思います。

この最後の二行を一旦コメント化してください。

# Supplemental configuration
#
# Load config files in the “/etc/httpd/conf.d” directory, if any.
IncludeOptional conf.d/*.conf

#ProxyPass / ajp://localhost:8009/
#ProxyPassReverse / ajp://tomcat:8009/

何故かというと、今この設定のままだとapacheへのhttp通信はすべてtomcatにスルーされてしまうからです。
何故スルーされるとまずいかというと、certbotを使用して証明書を発行してもらう際にLet’s Encryptからサーバの存在確認のためにhttp通信であるファイルを参照しに来ますが、それが外から見えなくなってしまうからです。(全部tomcatにスルーされてしまうから)
なので、一旦tomcatにアプリを配置するまでコメント化しときましょう。

設定を変えたらapacheを再起動しましょう。

これで準備は整いました。

certbotを使ってみよう!

まずはお試しで行きましょう。
certbotには証明書発行などがうまくいくかシミュレーションする機能が付いています。
というか、何度か連続でコマンドを実行すると制限がかかって今うようなので、まずはシミュレーションしてうまくいくことを確かめましょう。

コマンドはこうです。

[root:~]$ certbot --dry-run certonly --webroot -w /var/www/html/ -d sample.domain1.net

各オプションの意味はこんな感じです。

–dry-run実際の証明書の発行や変更を行わずに、プロセス全体をシミュレーションします。
certonly証明書の取得のみを行い、ウェブサーバーの設定変更は行いません。
–webrootこのプラグインは、ウェブサーバーのドキュメントルートに特定のファイルを配置することでドメインの所有権を確認します。
-w /var/www/html/Webrootのディレクトリパスを指定します。ここに、所有権確認のためのファイルが配置されます。
sample.domain1.net先ほどドメイン取得後にAレコード登録したドメイン名に対して証明書を発行します。

これを実行するといくつかメールアドレスを聞かれたり、本当に登録していいの?など聞かれますが英語を翻訳しながら回答していってください。(^-^;

最後にこんなメッセージで成功したことが通知されたら成功です。

では、成功したことを確認出来たら、–dry-runオプションを取り除いて実行しましょう。
certonlyオプションのほかに自動で設定してくれるオプションもあるのですが、折角なので証明書のファイル指定などは自分で行うこととして、このまま実行してみましょう。
Let’s Encrypt以外で証明書を発行してもらった時もここに記述すればいいんだなと応用が利くので。

こんな感じのメッセージが表示されたら成功です。

ここ!の「Certificate 」が証明書のことです。
証明書のファイルを「/etc/letsencrypt/live/sample.domain1.net/fullchain.pem」ここに作ったという事です。

そして、この部分が秘密鍵となります。
そして、先の証明書の中には公開鍵と言う情報が含まれています。
公開鍵・秘密鍵とは何?ってなるかもしれませんのでHTTPS通信の暗号化の仕組みを軽く説明すると
このサイトにアクセスする人は次の手順で安全な通信をするわけです。

  1. Aさんがサーバに問い合わせ
  2. サーバは証明書をAさんに渡し暗号化通信することを伝える
  3. Aさんは証明書が本物か発行した認証局に問い合わせる
  4. 認証局が大丈夫だよと結果をAさんにつたえる
  5. Aさんは証明書が大丈夫とわかったので証明書から共通鍵を作成する
  6. ただ共通鍵を送ると他者に読み取られてしまうので証明書についていた公開鍵で暗号化する
  7. 公開鍵で暗号化した共通鍵をサーバに送る
  8. サーバはAさんからもらった共通鍵を秘密鍵で複合化する。
  9. サーバは問い合わせの内容が分かったので以降の通信を共通鍵で行う。

ここで共通鍵と言うのが出てきましたが、これは通信の間だけ使用されるキーで使い捨てのキーです。
ですので盗聴されたとして後で盗聴した人が通信を複合化しようとしまっても、この通信時に一時的に作成されたキーがなければ複合が出来ないわけです。
しかも、通信が終わるたびにキーが変わるので簡単に複合化することはできません。
まぁセッションキーと言った方が耳になじみがあるかもしれません。
(全然軽くじゃなかった…)

なお、ファイルが生成されたフォルダ「/etc/letsencrypt/live/sample.domain1.net/」を覗くと他にも二つあってトータルで以下の4ファイル(正しくはシンボリックリンク)あります。

  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem

cert.pemはサーバ証明書、chain.pemは中間証明書で、これを合わせたものがfullchain.pem完全な証明書チェーンとなりますので、apacheに設定するものはfullchain.pemと、privkey.pemの二つで良いことになります。

Apacheに証明書を登録しよう!

暗号化通信をするための設定ファイルがある場所に移動しましょう。

ここにあるファイルの編集を行います。
ssl.confと言うファイルに証明書のファイルの参照先などが記載されています。

まずは「SSLCertificateFile」という設定のある場所を探しましょう。
こんな感じになっていると思います。

「SSLCertificateFile /etc/pki/tls/certs/localhost.crt」を以下の様に書き換えてください。

次に「SSLCertificateKeyFile」という設定のある場所を探しましょう。
(多分すぐ下のブロックにあると思います)

「SSLCertificateKeyFile /etc/pki/tls/private/localhost.key」を以下の様に書き換えてください。

ファイルを保存したら、Apacheを再起動です。

これで無事Apacheの行う通信を暗号化することが出来ました。

AmazonLightsailの設定変更

AmazonLightsailのネットワークですが、デフォルトではHTTPS通信が有効になっていません。
これではせっかく設定してもHTTPS通信が出来なくなってしまいますので、ネットワークの設定変更をします。
以下のページのネットワーキングを選択してください。

ネットー話キングのタブの中のファイアウォール設定に以下の様にHTTPSを許可する様に設定してください。

HTTPSでアクセスしてみよう!

http://sample.domain1.netでアクセスしてみましょう。
(実際には自分のサイトのアドレスで試しています)

無事にこの接続は保護されているというメッセージの元接続されています。

さいごに

HTTPSで接続できるようになると、なんかちょっとしっかりしたサイト感がでるので是非証明書を取得して対応してみましょう。
前回せっかくAJP接続しましたが、今回連携を解除してしまったのでちょっと煩雑になってしまいました。
どこかでちゃんと整理しよう…

関連投稿

もしよければこちらも試してみてください


コメント

タイトルとURLをコピーしました