質問: 外出中に自宅サーバにアクセスして作業するために 自宅サーバとの通信の暗号化にhttpsを使用しています。 この際必要になる証明書は自作のオレオレ証明書です。 これによって外出先のブラウザからの通信は暗号化されており安全と思っています。 ただ、ブラウザでアクセスする際に以下の警告が毎回出るのが少し気持ち悪いです。 --- この Web サイトのセキュリティ証明書には問題があります だれかがユーザーを騙そうとしているか、 サーバーに送信されたデータを盗み取ろうとしている可能性があります。 このサイトをすぐに閉じてください。 --- オレオレ証明書だからだと思っていますが このサーバにはパスワードをかけており自分しかアクセスしないので オレオレ証明書であっても特に問題ないかと思っています。 何かセキュリティ的な欠陥がありましたらご教授お願い致します。 なお、ネットワークの概要は以下になります。 外出先ブラウザ→パスワード入力→httpsで暗号化して自宅サーバに送信 →自宅サーバで復号しパスワード認証→認証が通ればサーバ上で各種処理実行
回答: 自己署名証明書の問題は「その証明書が本物なのかがわからない」ということです。正式証明書は、信頼されたルートCA証明書がその証明書を(直接的にまたは中間証明書を用いて間接的に)信頼することで、その証明書が本物であること(そのドメインの所有者が作成した事や実在する会社等であること)を保証してくれます。しかし、自己署名証明書は**誰でも作ることができるため**本当にそのドメインを所有している人が作ったのか、実在する会社なのかが信頼できません。それが、自己署名証明書の問題点です。 問題点はわかったと思います。そして、気付いたと思います。ルートCA証明書から信頼という方法**以外の方法**でその証明書が本物であることを保証できれば、**何も問題はありません**。方法はいくつかあります。 1. 拇印を確認する。 証明書には拇印(指紋、フィンガープリントとも)という固有の番号があります。これは証明書ごとに異なり同じ物は(とてつもなく低い確率でしか)存在しません。また、同じ拇印の証明書を作成することも(現実的ではない多くの時間をかけなければ)できません。そのため、本物の証明書の拇印をメモしておき、アクセスしたときの証明書の拇印が同じであることを確認すれば、本物であると言うことを保証できます。 拇印にはSHA256とSHA1があります。たとえば、teratail.comの証明書のSHA256の拇印は`50:27:4F:D7:2D:63:2E:AF:7A:CD:36:55:B0:0B:F7:11:45:DE:4F:03:2F:DC:0F:9A:3E:DB:61:3F:7E:F5:F6:BB`という32バイト(256bits)のデータです。上は16進数でわかりやすく表記した場合です。パターンは2の256乗(一無量大数(10の68乗)の約11億倍)あるため、同じ物が存在する確率はほぼ0です。よって、この拇印であれば、ルートCA証明書がどうなっていようが、teratail.comの本物の証明書であると信頼しても問題ありません。 2. ブラウザに登録する。 拇印は確実ですが、毎回確認するのは大変です。それに、もし、1bitでも異なればそれは偽者ですから、一文字一文字正確に確認する必要があります。そこで、拇印を確認する、証明書を作成したときにコピーしておく、等の方法で本物だとわかった証明書について、ブラウザで「この証明書は信頼できる」と登録してしまう方法があります。登録方法はブラウザによって異なるので割愛しますが、一度登録してしまえば、正式証明書と同様に、自動的に本物か確認して判断してくれます。その後は警告やエラーがでることはありません。(もちろん、偽者であれば警告やエラーが表示されます) 3. 自分で作ったルートCA証明書を使う。 これまでの方法は証明書一つだけなら問題ありませんが、もし、多くの証明書を管理するとなると、その一つ一つについて拇印の確認と証明書の登録を行うのは大変な手間です。そこで、自分だけのルートCA証明書を作って、そこから保証してくれるようにします。ただ、ルートCA証明書の運用は一歩間違うと**重大なセキュリティ上の欠陥**が発生します。生半可な知識では大変危険ですので、オススメは全くできません。