オレオレ証明書を作ってみようかと 実践2

先の投稿では「オレオレ証明書」を作って、無事nginxに導入してTLS接続が出来るようになりました。
あとはこれをmosquittoに応用するだけ、と思っていたら実はCA certificate(CA証明書)が必要だと言うことにはたと気づき、がっくり。

結局、

  • 認証局(CA)を作る
  • その認証局の鍵でサーバの証明書にサインしてもらう

と言う手順をとる必要があります。
認証局と行っても、自己証明書ということでは先に作ったサーバの証明書と同じです。

自前のCAを作る

基本的には、サーバの自己証明書を作るのと同じ手順で認証局の証明書(CA certificate)をつくります。手順としては

  • CAの鍵を作る (CA key)
  • 自己署名の証明書を作る (これがCAの証明書(CA certificate)になる)

となります。 ここでは、CAの鍵をCA_private_key.pem, CAの証明書をCA_selfsigned_Certificate.pemというファイル名を付けました。

実は、これがいっぺんにできるそうで、これが以下のコマンド。

1
$ sudo openssl req -new -x509 -newkey rsa:2048 -keyout CA_private_key.pem -days 7300 > CA_selfsigned_Certificate.pem

このなかで、

  • 鍵を作って
  • リクエスト用のファイルを作って
  • それに対して自分でサインして

という3つのことが行われているようです。

このコマンドでは、キーを暗号化するためのパスフレーズを要求されます。さらに、証明書に記載するための情報(組織名とか所在地とか)を聞かれますので、適宜答えていきます。

最初、以下の様なコマンドでも良いはずですが、パスフレーズを入力するところがでません。確認してみると、鍵は暗号化されていないようです。

1
2
$ sudo openssl genrsa 2048 > CA_private_key.pem
$ sudo openssl req -new -key ./CA_private_key.pem -x509 -days 7300 > CA_selfsigned_Certificate.pem

manでしらべてみると、genrsaのオプションで -des3とか暗号化のオプションを付けないためパスフレーズを聞かれないようです。暗号化する指示をすればパスフレーズを聞いてきました。理由が分かれば当たり前の話。
なので、最初の鍵を作るコマンドは

$ sudo openssl genrsa -des3 2048 > CA_private_key.pem

とするのが、安全性の面でも良い感じですかね。

これでCA鍵とCA証明書ができあがりです。「俺様認証局」ですね。この鍵でいくらでも「オレオレ」証明書がつくれます。

会社内、組織内のセキュア接続のためには有効につかえるかな、とおもいます。ただ鍵が流出するといくら社内用といえどもセキュリティ的に問題があるので、きちんと管理しないといけません。鍵には名前も書いてありますしね。

##サーバの証明書にサインする

それでは、サーバの証明書を作ってみます。

最初にサーバに設置する証明書のための鍵をつくります。さらに、その鍵をもとに証明書署名リクエストファイルを作成します。まあ、申請書みたいな物ですね。これは、前回のオレオレ証明書を作ってみようかと 実践1を参考にしてください。この記事の1.2.を実行してもらうといいとおもいます。

ここでは、署名リクエストファイルをmyserver.csr、署名付き証明書をmyserver.crtとします。

サーバの証明書にCAのサインをするので、myserver.csrとCA_selfsigned_Certificate.pem(CA証明書), CA_private_key.pem(CA鍵)が必要になります。

具体的には、

1
$ sudo openssl x509 -CA CA_selfsigned_Certificate.pem -CAkey CA_private_key.pem -req -days 7300 -CAcreateserial < myserver.csr > myserver.crt

とします。ここで、-daysはサインする証明書の有効日数、-CAcreateserialは最初に署名するときだけ必要なオプション。これをやるとシリアル番号のファイルが出来るそうな。

これだけで、サーバの証明書にCAのサインをしてサーバに設定出来る証明書ができあがりました。

nginxに入れて動作を確認しました。

ブラウザから証明書を確認すると、「発行者名」と「サブジェクト名」がそれぞれ、CA証明書を作るときに入力した情報、myserverの証明書(証明書署名リクエストファイル)作るときに入力した情報になっているはずです。

ここでもう少しきちんとしたい人は、CA証明書をブラウザに読み込むことで、「この証明書は不明な機関によって署名されています」的なメッセージを回避できます。この作業はこの証明書を信じます、と言う宣言ですので、もしこの鍵が悪用されたりすると大変なことになる可能性があります。鍵の管理はしっかりしておきましょう。

信じてもらうためにはしっかりと行動するということですね。人生。

mosquittoではブローカがcertificateを提供してくるので、それが正しいかどうか確認するための認証局の証明書が必要になります。webブラウザなんかだと、パブリックな認証局の情報は一通りはいっていますから普段認証局のcertificateを意識することは無いですよね。

きょうは、ここまでです。