オレオレ証明書はもう古い!「Let's Encrypt」で無料SSL証明書を使おう!

2021/08/29

IT/IoT

こんにちは、さきです!

今回はSSLとサーバー証明書のお話です。

SSLのイメージ

SSLとは?

SSL(Secure Sockets Layer)とは、ユーザーの端末とサーバーとの通信を暗号化する仕組みのことです。

Webサイトを閲覧している時、URLの前に鍵のマークが表示されていたりする場合、その通信はSSLで行なわれていますよ、という意味になります。結構身近な存在ですね!

SSL通信であることを示す鍵アイコン
SSL通信であることを示す鍵アイコン

暗号化すると何がイイの?

PCやスマホとサーバーが通信する時、直接通信しているわけではなく、間にいろいろなものを経由しています。

日本からアメリカのサーバーにアクセスするのを考えるとイメージしやすいかもしれません。どう考えても「直接つながっていて間に機器は無い」なんてこと、あるわけがないですね。

これは国内でも同じことです。インターネットを使用している時点で、必ず「何か」は経由していると考えるべきでしょう。

では、通信経路の途中の機器に悪意あるプログラムが入っていた場合を考えてみて下さい。

通信内容が暗号化されていない(=平文である)場合、パスワードやクレジットカード情報を始めとしたありとあらゆる通信内容が全て傍受されてしまいます。

平文通信で通信内容を盗み見られるイメージ
平文通信で通信内容を盗み見られるイメージ

手に取った人が誰でも内容を読めてしまうハガキにクレジットカード情報を書いて投函する人はさすがにいないですよね。でも、平文通信はそれと同じことが起こってしまうんです。

そこでSSLを使用し通信を暗号化することで、最終的にサーバーへ届いて復号化されるまでの経路上では通信内容を盗み見る事が出来なくなります。

暗号化通信で通信内容を保護するイメージ
暗号化通信で通信内容を保護するイメージ

2018年あたりからGoogle Chromeでは、SSL非対応のサイト表示時にブラウザで警告を表示するようになったりと、SSL通信がスタンダードな世の中になってきています。

サーバー証明書とは?

SSLを使用する場合、通常、サーバー側ではサーバー証明書というものを使用します。

別にサーバー証明書が無くてもSSL暗号化の機能は動くのですが、大抵のブラウザ等では警告が出たりして弾かれますので、インターネットに公開するサービス等場合はサーバー証明書を用意するのが普通です。

証明書がなぜ重要かと言うと、「悪意ある通信経路の途中で、偽物のサーバーにアクセスを偽装して飛ばされる場合がある」からです。

例えばAmazonで買い物をしようとしていて、でも実は今見ているサイトは偽物のAmazonサイトで、でもURLはAmazonのもの...というように、パッと見ただけでは判別できないようなレベルで偽物のサーバーにアクセスしてしまう場合があります。

そんな時、サーバー証明書があると、そのサーバーが本物であることを証明してくれるというわけです。

サーバー証明書は偽造できないの?

サーバー証明書の偽物まで用意されたら意味ないのでは?と思うかもしれません。

でも大丈夫です!

サーバー証明書には、証明書発行元の署名情報が含まれていて、発行元が怪しい場合、ブラウザ等が警告を出したりしてアクセスしないように誘導してくれます。

発行元もまたサーバー証明書を持っていて、その証明書にも発行元の署名があって....というように、サーバー証明書は署名の連鎖で成り立っています

この署名を一番上位のものまで辿っていくと、最終的に「ルート証明書」という最上位の証明書に辿り着きます。

ルート証明書はPCやスマホにデフォルトで登録されているもので、「絶対的に信頼できる証明書」として使用されています。

ルート証明書から連鎖的に署名を行なっていくことで、サーバー証明書は信頼性あるものとして機能しています。

怪しいサーバー証明書を無理やり受け入れさせることはできてしまう

発行元がルート証明書の連鎖の中に無い場合、ブラウザ等のソフトは警告を出してくれると書きました。

この時警告を無視して「サーバー証明書を信頼する」という旨の操作を行なうと、それがどんなに怪しいサーバー証明書であっても「信頼のおけるもの」として扱うようになります。

なので、むやみやたらによくわからない証明書を信頼するのはセキュリティ的によくありません。

ただ、最近のOSでは、あまりにも怪しい発行元の場合は、ユーザーがどんなに「信頼できる発行元」としたくてもOSが信頼してくれない(エラーが出て弾かれたりする)、というように、ある程度のセーフティーが備わっているものもあります(iOS等はそうです!)。

サーバー証明書は有料が普通だったので、オレオレ証明書で節約していた

自分のサーバーでも証明書が欲しい!と思って調べてみると、どんなに安くても1万円くらいはかかる....というのが、数年前の話。

この頃は、サーバー証明書発行が有料なのは当たり前で、ちょっとした自分用のサービスのために証明書を取るのはなぁ....というような感じがあったりもしました。

例えば完全自分用のメールサーバーでSMTPを使用しスマホ等からメールを送れるようにしたい場合、「自分のスマホ」と「メールサーバー」の間だけSSLを使用するならば、証明書を使用するのは完全に自分だけとなります。

だったら自分しか使わないわけだし、自分でサーバー証明書を発行してしまおう!というやり方が「オレオレ証明書」です(正式名称:自己署名証明書)。

自分で自分の証明書に署名するオレオレ証明書

サーバー証明書は、ルート証明書から連鎖的に署名されてきた証明書を持つ第三者機関が署名してくれるからこそ信頼性があります。

オレオレ証明書はそんなことなど一切考えず、「とりあえず証明書の形式的に署名が入ってさえいればよい」というようなやり方となります。

証明書に署名を行なうのは「認証局」と呼ばれるものになるのですが、もちろんこれも自分自身。証明書を配置するサーバーに認証局の機能も持たせてしまうのが一般的です(オレオレ認証局とか呼びます)。

例えるのなら、自分で作った名札か何かを、公的な身分証の代わりに使うようなイメージでしょうか。

完全に「怪しげなサーバー証明書」とそれに署名する「怪しげな認証局」の出来上がりです。

「オレだよ!オレオレ!」という声が聞こえてきそうな証明書なので、「オレオレ証明書」と親しみを込めて呼ばれています。

当然、公開サービスに組み込むにはちょっとよろしくないんですが、完全自分用なら発行費用かからないし、これが結構便利なやり方でした。

無料でサーバー証明書を発行してくれる「Let’s Encrypt」

いつだったかちょっと覚えてないのですが、気が付いた時には出てたような...。少なくとも2017年ごろにはあったのは確かです。

Let’s Encryptという、無料でサーバー証明書を発行してくれるサービスが登場したのです。

オレオレ証明書を利用する理由が「費用」であるなら、Let’s Encryptの登場でオレオレ証明書を使うメリットは完全に無くなるということです。

もっと言えば、ちゃんとした機関が発行してくれる証明書なので、これでこのままサービス公開できてしまいます。

ありがたいですね!

有料のサーバー証明書にはちゃんと利点がある

Let’s Encryptは無料です。では、他の有料のサーバー証明書を使う必要は無いのでは?と思ってしまいますが、有料のサーバー証明書は、記載される情報量が多いです

Let’s Encryptはドメインの証明のみの最低限構成なのですが、お高い証明書だと、企業名まで証明してくれたりします

なんでもかんでもLet’s Encryptを使えばいいという事では決して無く、無料であるメリットの比重が大きい時にぜひ使用していきたいですね。

まとめ

サーバー証明書をなるべくお金をかけずに用意しようとして情報収集すると、古めの記事なんかでは「オレオレ証明書」のやり方が結構出てきます。

今はもうLet’s Encryptという強い味方がいますので、わざわざ手間暇かけてオレオレ証明書を用意するメリットはほぼ無いんじゃないかと思います。

(Let’s Encryptはドメインの確認に80、443ポートを使用するので、この2つのポートを認証時の一瞬すら開ける事が出来ない環境では、オレオレ証明書は候補になり得ます。ちょっと想像し難い環境ですが...。)

Let’s Encryptの導入方法は探せばたくさん出てきます!

参考になればうれしいです。

ではまたね!さき