こんにちは、あいおんです。
長い間更新していませんでしたが、このブログには広告が入ることはありません。
# もう最近の人にはこのネタもわからないんですかね。。。FC○ブログ。。。
さて、証明書と言えば、SSHだったりHTTPSだったりと大活躍ですよね。
とはいうものの実際使う時にWebでコマンド検索してそれで終わってしまうことが多いと思います。
今回は、”オレオレ証明書(自己証明書)から脱却する!”ということをテーマに、証明書や鍵について説明していきます。
証明書とは、自身の身分を保証するもの、といった意味合いが強いかなと思っています。
この顔が見えないWebでそれを証明することは非常に大切であり、意味のあることです。
いやまぁこのサイトに来ていただけるということはそんなことは百も承知だということだと思いますので、前提はこの辺にしておきます。
今回の主題は、Apacheで使うSSL証明書を誰かに署名してもらう!ということのメカニズムの説明をしていきます。
基本的にApacheでHTTPS通信をしようと思った時には、おそらく、以下の手順で実施することでしょう。
- OpenSSLを使用して鍵と証明書ファイルを作る
- その証明書に自分で署名する。
- それをサーバーに配置する。
この2番の項目について、自分で証明書を作って、自分で署名をするので、”オレオレ証明書”(自己証明書)と呼ばれているんですね。
そもそもこの作業、多分Webで書いてあるからそのまま入力して、やってみたらできたからおっけー!とかやっている人も多いんじゃないかなと。
# 実際私がそうでしたし。
そこで、今回はコマンドと共に、これっていったい何をやっているのか考えてみましょう。
-
OpenSSLを使用して鍵(秘密鍵と公開鍵)と証明書ファイルを作る
まず、OpenSSLを使用して、以下コマンドを実行すると思います。
1 |
openssl genrsa -aes128 1024 > server.key |
これは何をやっているかというと、”秘密鍵”を生成している作業になります。
もう少し細かく言うと、AES128という方法で、1024文字の秘密鍵を作るといった意味です。
その鍵の名前は今回は”server.key”として生成しています。
そして次に、以下コマンドを実行します。
1 |
openssl req -new -key server.key > server.csr |
このコマンドは、その秘密鍵に対して、誰かに証明してもらうための同意書を作っているイメージです。
その同意書の名前は”server.csr”として生成しています。
このコマンドを打つと、国名とか組織名とか聞かれると思いますが、サーバーの情報となります。
このCSRですが、概念が非常に分かりづらいのですが、英語にすると、”Certificate Signing Request”になります。
つまり、”証明書に署名してもらうリクエスト(要求)”になります。
ここで少し説明をしますと、証明書、というからには、誰かに証明してもらう必要があります。
自分で、「私はAです!」とか言ってても誰も信じてくれません。
誰かに「この人はAです」と言ってもらって初めて”証明”ができるのです。
つまり、証明書というのは、まずは自分で作ったら、誰かに”署名”してもらう必要があります。
その誰かにその証明書について「本当に信頼できるから保証書をつけてもらう」イメージですね。
# ここら辺の信頼についてはまたどこかでお話しします。気になる方は「PKI」で検索!
とにかく、ここでは証明書を作ったら誰かに署名してもらう!これを覚えておいてください。
この誰かに署名してもらうために、上でserver.csr(証明書署名要求)を作りました。
これを信頼できる人に渡して、署名してもらうことで証明書を完成させます。
オレオレ証明書とは、このCSRに自分で署名をしてしまうことになります。
つまり、上で言っている、”自分で自分のことを証明している”ということです。
2.証明書に署名する。
今回はせっかくなので、自分で証明するのではなく、他の人(サーバー)に証明してもらいましょう!
今作業をしたマシンとは違うマシンを用意してください。
同じマシンでもいいですけど、せっかくなら別のマシンを用意するとわかりやすくていいと思います。
さて、別のマシンには、認証局になってもらいましょう。認証局のことをCAと呼びます。英語だと”Certificate Authority”。そのままですね。
OpenSSLの標準で、/etc/pki/CAがデフォルトの場所になるので、ここではそれ前提で書きます。
CAとして動かすために、以下初期設定します。
1 2 |
echo "01" > /etc/pki/CA/serial touch /etc/pki/CA/index.txt |
これで完了です。データベースとかがこれで出来ます。
次に以下コマンドを実行します。
1 |
openssl req -new -x509 -newkey rsa:2048 -out cacert.pem -keyout private/cakey.pem -days 3650 |
これで、CA用の秘密鍵(private/cakey.pem)と、CA用の証明書(cacert.pem)を作ります。
また、この際、国名とかサーバーの情報聞かれますが、上でやったのと同じようなやつにしておいてください。
さて、これでCAの準備も完了です。そうしたらいよいよ署名しましょう。
まず、ここまでの作業とアイテムを以下の通り整理します。
Apacheのサーバーの秘密鍵:server.key
ApacheのサーバーのCSR:server.csr
CAのサーバーの秘密鍵:private/cakey.pem
CAのサーバーの証明書:cacert.pem
こんな感じです。今からやることは、「CAの秘密鍵と証明書を使って、ApacheサーバーのCSRに署名し、Apacheサーバーの証明書を作成する。」ことです。
# ちなみに、拡張子っぽい、「.key」とか」「.csr」とか「.pem」とかですが、全部意味ないです。内容は同じです。
まずは、ApacheサーバーのCSRをCAサーバーに持ってきます。SCPでもSFTPでもUSBでもOKです。
わかりやすいように、/etc/pki/CA/server.csrとして持ってきます。
そうすると以下3ファイルになりますよね。
/etc/pki/CA/cacert.pem
/etc/pki/CA/private/cakey.pem
/etc/pki/CA/server.csr
ここまでそろったら以下コマンドを実行します。
1 |
openssl ca -in server.csr -keyfile private/cakey.pem -cert cacert.pem -out server.crt |
コマンドの意味は、上で説明したとおり、「ApacheサーバのCSRに対して、CAサーバーの秘密鍵と、CAサーバーの証明書を使って署名し、証明書を作る」といった意味です。
出来た証明書は、server.crtですね。
言葉で表現すると「認証局(CA)が、Apacheサーバーの要求に従って、署名し、Apacheサーバの証明書を作成した」ということです。
この出来た証明書をApacheのウェブサーバーに持って行って、証明書を置く場所に設置しておけば完成です!
実際の動きを見てみましょうか。
まず、普通にApacheサーバーにHTTPS接続してみてください。
多分、エラーが出ると思います。いや厳密には”この証明書にはエラーがあります”みたいな内容で、
実際同意すれば接続できるみたいなやつだと思います。オレオレ証明書で出てくる奴と似てますね。
では次に、このエラーを出さないようにしてみます。
まずは、CAの証明書を自分のPCへ入れる必要があります。
CAの証明書とは、/etc/pki/CA/cacert.pemですね。
これを自分のPCへ持ってきて、拡張子をpemから、crtに変換してください。Windowsは拡張子で判断しているので。
そうするとインポートできると思いますので、「信頼できるルート証明書」としてインポートしてください。
これをすることにより、このCAについては全面的に信頼する、ということになります。
そうしたら、もう一度ApacheサーバーのHTTPSを開いてみてください。
おそらく、エラーメッセージは出力されないと思います。
つまり、これは、CAを信頼している⇒その信頼しているCAが証明しているのでApacheサーバーも信頼できるとみなされる、わけです。
ちょっと説明ばかりで多くて疲れましたかね、すみません。
実際大切な部分しか説明できていないので、ちょっとわかりにくい部分や叩いてみてエラーが出るかもしれませんので、
その際はコメントにてお知らせください。ご連絡します。
実際にこうしてみると、認証局や証明書についての役割が分かって楽しいかなって思います。
ご意見あれば是非どうぞ。