Blog2015-08-31OpenSSLコマンドでオレオレ証明書を作り、ルート認証局としてサーバー証明書を発行するOepnSSLこんにちは、最近あまりWebの話をしていないwakです。IISをあれこれ触ってリハビリをしようと試みていたのですが、同僚がSSL回りで苦しんでいたので復習がてら表題の件を試してみました。通信の盗み見、改竄、なりすまし、おいしくないカリカリを許さない鋭い視線の猫1行でまとめるとこういう証明書を作成するのが目的です。基礎知識SSLの目的と機能SSLには2つの機能があります。通信を暗号化して、のぞき見や改竄を防ぐ通信相手が本物であることを保証するたとえば公衆Wi-Fiに紛れて偽Wi-Fiアクセスポイントを設置した悪者がいたとします。このアクセスポイントは悪者の支配下にありますから、ここに接続してしまった人は全ての通信内容を見られてしまいますし、通信内容は改竄され放題です。「mizuhobank.co.jp」にアクセスしていたつもりなのに、実際にはフィッシングサイトに接続させられていたということも起こり得ます(これではいくら通信が暗号化されていても意味がありません!)。暗号化によって通信をのぞき見を防ぐもし偽の相手と通信していたらそれを検知できるようにして安全にインターネットを利用できるようにするのがSSLの役割です。SSLが安全を保証する仕組みブラウザはサーバーと通信を開始すると、まず最初にサーバー証明書をチェックします。サーバー証明書には、「私は本物のexample.comです」とAさんの署名つきで書いてあります。信頼できる人なの?」と聞きにいきます。Aさんは「私は本物のAです。Bさんの署名もあります」という証明書を示します。信頼できる人なの?」と聞きに行きます。Bさんは「私は本物のBです。Cさんの署名もあります」という証明書を示します。信頼できる人なの?」と聞きに行きます。Cさんは「私は本物のCです。Dさんの署名もあります」という証明書を示します。そこでブラウザはDさんに「ああ言ってこのたらい回しはいつ終わるのでしょうか。update、ブラウザのインストール時などに導入されます)。たらい回しをずっと続けていくと、いつかは必ず、このルート証明局の署名が入った証明書にぶつかります。信頼できる人なの?」と聞きに行きます。Dさんは「私は本物のDです。ルート証明局の署名もあります」という証明書を示します。するとブラウザは、Dさんは信頼できるDさんが署名したCさんの証明書も信頼できる→Cさんは信頼できるCさんが署名したBさんの証明書も信頼できる→Bさんは信頼できるBさんが署名したAさんの証明書も信頼できる→Aさんは信頼できるAさんが署名したexample.comの証明書も信頼できるじゃあこのサーバー証明書を持ってるexample.comは本物だ!と結論づけることができます。公開鍵暗号SSLでは公開鍵暗号というものを利用します。この鍵には次の性質があります。公開鍵を使って文書を暗号化することができる。暗号化された文書は秘密鍵だけで復号できるつまり公開鍵だけを知っていても、文書を暗号化することができるだけです。暗号化された文書を復号することはできません。*1証明書を作るオレオレ証明書まず「自己署名入り証明書」、通称「オレオレ証明書」を作りましょう。これは「俺は○○です。俺を信じろ」という全く信頼の置けない証明書です。いえ、全てのルート証明書はこのタイプですから重要です(他の誰かに署名してもらおうとすればまたさっきのたらい回しが始まってしまいます)。乱数を使って秘密鍵を作ります。これは誰にも秘密の鍵で、「この鍵を知っている」ことが「自分が自分である」ことの証明となります。秘密鍵があれば対応する公開鍵はいつでも取り出せます。Request)」を作成します。これは次の手続きのために一時的な必要なだけの情報です。-subjオプションは指定しなければ対話式で聞かれます。ca.csr最後に、-sinkeyオプションを使ってこのCSRに自己署名を追加してサーバー証明書を作成します。ca.crt本来であれば最後のステップは信頼できる証明局にお願いして実施してもらう作業です。信頼できるというチェーンが完成します。PCに持ってきてダブルクリックで開くとインストールするかどうかを聞かれます。インストールしましょう。これでこのPCはこの秘密鍵によって署名された証明書を無条件で信頼するようになり、SSLで保護されたWebサイトの署名PowerShellのスクリプトの署名exeファイルに添付された署名などが全部通るようになります。この証明書の中核はさっき作った秘密鍵(つまりca.keyというファイルの中身)ですから、これが誰かにバレたら大変なことになります。サーバー証明書を作る続いてサーバー証明書を作り、ルート証明局、つまりさっきの証明書の秘密鍵で署名してみましょう。CSRを作るところまでは同じです。server.csr普通はこれをルート証明局に送付して署名してもらうのですが、今回は自分で署名します。CSRに署名する手順が若干面倒です。OpenSSLの設定ファイル、/usr/lib/ssl/openssl.cnfを開くと次のような行があるはずです。keptOpenSSLコマンドは単にCSRファイルに署名を行うだけではなく、その証明書を管理する機能も持ち合わせています。そのためのファイルを配置する場所がこの行です。そこでこの行に従い、どこかに次のようなディレクトリを作成してください。+-serialいずれも設定ファイルに書いてある通りです。ファイル2つは手で作ります。index.txtこうした上で、demoCAの親ディレクトリで署名コマンドを実行します。server.crtこれでサーバーの証明書が生成されました。この証明書は自作のルート証明局にぶら下がっているので、問題なく検証が成功します。署名を行うと、demoCAディレクトリ以下のファイルがいくつか更新されます。これはOpenSSLが認証局としての仕事を行うため、いつ、どんな証明書に署名したかを管理しておく必要があるからです。先ほど作成したindex.txtはこんな内容で更新されます。dept./CN=*.ssc-aws.comこのように、現在どのような証明書が有効なのか、その証明書の内容はどんなものか、などが分かるようになっています。必要があれば失効させ、問い合わせを受けたとき*2には「もう無効になっていますよ」と答えて利用者の安全を確保するわけです。まとめ初歩的な内容のはずでしたが意外に知識に抜けがあって手間取ってしまいました。ときには足元を見直すのも大切です。*1:なお、「この逆のこともできる。秘密鍵でも暗号化ができ、暗号化された文書は公開鍵だけで復号できる」という説明がなされることもありますが、そのようなタイプの公開鍵暗号があるというだけで、公開鍵暗号すべてに当てはまるわけではありません。S3の機能まとめこんにちは、AWS担当のwakです。Commandsことはじめどうも、Slack大好きなwakです。LambdaでWebサイトの死活監視を行ってSlackに結果を流すこんにちは、AWS担当のwakです。(1)はてなブログをはじめよう!jabe20さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。