ローカルな認証局 を CentOS7 で作る備忘録です.
はじめに
早いもので,
から2年経ち,使っていた証明書の期限が迫ってきました.もちろん証明書を更新しないといけないのですが,以前使っていた Windows 2012 の認証局は廃止してしまっています.仕方が無いので,
を参考に CentOS7 で認証局を作ったのですが,いろいろハマりどころがあったので,備忘録としておきたいと思います.
認証局の立ち上げと登録
この部分は上の参考記事と全く同じです.
この手順で作られた cacert.pem が認証局の公開鍵なので,これを他の機器にコピーして「ルート証明機関」として登録すれば,この認証局で署名された証明書を利用する Web サイト等でエラーが出なくなります.
Windows だとファイル名を cacert.pem から cacert.crt と変えれば ,ダブルクリックするだけで,証明書の導入が行えます.
MacOS の場合も同様ですが,導入後「キーチェンアクセス」アプリを立ち上げ,証明書を信頼するように設定を変更しなければなりません.
Linux の場合は,ディストリビューションによるみたいですね.詳しくは,
などをご覧ください.
android の場合は,DER エンコードの X.509 証明書で,拡張子が cer もしくは crt のものでなければならないようです.実際には,
$ openssl x509 -in cacert.pem -out cacert.der.crt der
のように変換し,内部ストレージ等に取込んで「ユーザー設定」⇒ 「セキュリティ」⇒「認証情報ストレージ」⇒「ストレージからのインストール」の順に取り込みを行います.
iOS の場合は,pem 形式のものを Safari で開いて取り込みます.また,取り込み後に,「一般」⇒「証明書信頼設定」から,「ルート証明書として全面的に信頼する」ようにしなければなりません.
サーバー証明書の発行
これも,ほぼ,
の通りなのですが,いくつか注意があります.まず,作る順番は,
- サーバーの秘密鍵(newkey.pem)
- 証明書要求(newreq.pem)
- 証明書(newcert.pem)
です.このうち,最初の2つ,サーバーの秘密鍵(newkey.pem)と証明書要求(rewreq.pem)はどこでつくってもかまいません.証明書を必要とするサーバーに openssl が入っていれば,それで作っても良いですし,認証局で作っても構いません.認証局で行わなければならないのは,最後の証明書の作成のみ(署名のみ)です.しかし,ファイルの移動の手間等を考えると,結局は,
認証局で上記3つを全て作る
方が楽だと思います.
また,複数のドメイン名(ホスト名)に対応するUCサーバー証明書を作る場合(Chrome ver 58 以降は CN を参照しなくなったのでこれはほぼ必須)は,設定ファイル(openssl.cnf ファイル,上の記事の場合は openssl_server.cnf)を以下の様に変更する必要があります.
$ diff openssl_server.cnf openssl_server_uc.cnf 126c126 < # req_extensions = v3_req # The extensions to add to a certificate request --- > req_extensions = v3_req # The extensions to add to a certificate request 197a198 > subjectAltName = @alt_names 224a226,230 > subjectAltName = @alt_names > > [alt_names] > DNS.1 = www.example.com > DNS.2 = www2.example.com > DNS.3 = ......
上記を見て分かる通り,DNS.1, DNS.2, … に個別の FQDN を指定しないといけない(ワイルドカードで誤魔化すという手もありますが)ので,私の場合は,サーバーごとに,
- openssl_server_name.cnf
というファイルを作り,
# SSLEAY_CONFIG="-config /etc/pki/tls/openssl_server_name.cnf" /etc/pki/tls/misc/CA -newreq # SSLEAY_CONFIG="-config /etc/pki/tls/openssl_server_name.cnf" /etc/pki/tls/misc/CA -sign
- サーバーの秘密鍵(newkey.pem)
- 証明書要求(newreq.pem)
- 証明書(newcert.pem)
を作ることにしました.
なお,試行錯誤していると,証明書を作る段階で,
failed to update database TXT_DB error number 2 Signed certificate is in newcert.pem
のように怒られてしまう場合があります.この場合は,
- /etc/pki/CA/index.txt
ファイルから該当するサーバーについての情報を削除し,さらに,
- /etc/pki/CA/newcerts
からも対応する pem ファイルを削除すれば,証明書を作り直すことができます.
サーバーでの作業
さて,これで必要なファイルは全て揃ったのですが,最終的に要るのは,
- サーバーの秘密鍵(newkey.pem)
- 証明書(newcert.pem)
の2つだけです.つまり,この段階で証明書要求(newreq.pem)は削除してしまってもかまいません.ここからは,実際に証明書を利用するサーバーに証明書を導入する作業を行わなければならないのですが,その前に,
$ openssl rsa -in newkey.pem -out newkey.pem
の様にして,サーバーの秘密鍵からパスワードを除去します.
サーバーの秘密鍵にパスワードを設定した場合,秘密鍵は暗号化されていますので,Apache とか nginx とかのサーバーは,秘密鍵を取り出せず,結果,秘密鍵と証明書の対応チェックが行えず,エラーとなってしまうからです.
また,秘密鍵(newkey.pem)と証明書(newcert.pem)は,それらを利用するサーバーにもちろん移さねばなりませんが,エディタなどで内容をコピペした場合は,不要な改行コード等が入り,秘密鍵と証明書の対応が取れなくなることがあります.この対応を確かめたい場合は,
を参考に一致チェックを行います.
一致チェック後,いよいよサーバーに秘密鍵と証明書を組み込むことになりますが,これはサーバーごとにやり方がことなりますので,ここではその詳細の解説は行いません.ただし,サーバーによっては,
- newkey.pem ⇒ server.key
- newreq.pem ⇒ server.csr
- newcert.pem ⇒ server.crt
のように名前を変えなければならない,もしくは各鍵の形式を openssl を使いさらに変更しなければならないこともあります.
実例は,この blog だと,
とか
とか
にあります.
おわりに
このローカルな認証局の立ち上げ方と運用の仕方って,個人だと多くて半年に1回,ひどい場合だと数年やらない作業で,毎回,ほぼゼロから復習し直すことになります.おかげで今回も丸一日作業となってしまいました.
上にある通り,これまでもいろいろ備忘録を残してきたのですが,書き残していないところでやはり色々引っかかってしまいます.それで今回は,単に作業内容だけじゃなくて,なんでその作業が必要なのかの理由も付して備忘録として残そうと考えたのですが,この記事が次に役に経つのは下手をするとまた数年後な訳で,正直言うと,
それまでこの blog をやっているかどうかちょっと不安
なんですよね…….
しかしまぁこの blog も3年目で多くの人に見て頂いているみたいなので,どなたかの助けになれば幸いだと思うことにします.
以上!