ローカルな認証局 を CentOS7 で作り,運用する備忘録

Networks
Photo by hyt.

ローカルな認証局 を CentOS7 で作る備忘録です.

はじめに

早いもので,

Gitlab in local domain SSL 対応備忘録
こちらで設定したローカル環境の Gitlab を SSL に対応させる備忘録です.ちょっとした事情があって,UCサーバー証明書で発行してみます. まず,UCサーバー証明書を発行できるよう openssl.cnf を編集します.書き換え,追記...

から2年経ち,使っていた証明書の期限が迫ってきました.もちろん証明書を更新しないといけないのですが,以前使っていた Windows 2012 の認証局は廃止してしまっています.仕方が無いので,

http://www.orangetakam.com/blog/archives/713

を参考に CentOS7 で認証局を作ったのですが,いろいろハマりどころがあったので,備忘録としておきたいと思います.

認証局の立ち上げと登録

この部分は上の参考記事と全く同じです.

この手順で作られた cacert.pem が認証局の公開鍵なので,これを他の機器にコピーして「ルート証明機関」として登録すれば,この認証局で署名された証明書を利用する Web サイト等でエラーが出なくなります.


Windows だとファイル名を cacert.pem から cacert.crt と変えれば ,ダブルクリックするだけで,証明書の導入が行えます.

Windows環境で証明書をインポートする方法 | GMOグローバルサイン サポート

MacOS の場合も同様ですが,導入後「キーチェンアクセス」アプリを立ち上げ,証明書を信頼するように設定を変更しなければなりません.

Mac端末での手順

Linux の場合は,ディストリビューションによるみたいですね.詳しくは,

301 Moved Permanently

などをご覧ください.


android の場合は,DER エンコードの X.509 証明書で,拡張子が cer もしくは crt のものでなければならないようです.実際には,

$ openssl x509 -in cacert.pem -out cacert.der.crt der

のように変換し,内部ストレージ等に取込んで「ユーザー設定」⇒ 「セキュリティ」⇒「認証情報ストレージ」⇒「ストレージからのインストール」の順に取り込みを行います.


iOS の場合は,pem 形式のものを Safari で開いて取り込みます.また,取り込み後に,「一般」⇒「証明書信頼設定」から,「ルート証明書として全面的に信頼する」ようにしなければなりません.

サーバー証明書の発行

これも,ほぼ,

http://www.orangetakam.com/blog/archives/732

の通りなのですが,いくつか注意があります.まず,作る順番は,

  1. サーバーの秘密鍵(newkey.pem)
  2. 証明書要求(newreq.pem)
  3. 証明書(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
  1. サーバーの秘密鍵(newkey.pem)
  2. 証明書要求(newreq.pem)
  3. 証明書(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)は,それらを利用するサーバーにもちろん移さねばなりませんが,エディタなどで内容をコピペした場合は,不要な改行コード等が入り,秘密鍵と証明書の対応が取れなくなることがあります.この対応を確かめたい場合は,

SSL証明書・秘密鍵・CSRファイルのペア確認方法 - Qiita
SSL証明書取得後、SSL証明書・秘密鍵・CSRファイルのペア(組み合わせが正しいか)確認をopenssl・md5sumコマンドで確認します。ペア確認するコマンド以下、コマンドの実行結果(チェッ…

を参考に一致チェックを行います.

一致チェック後,いよいよサーバーに秘密鍵と証明書を組み込むことになりますが,これはサーバーごとにやり方がことなりますので,ここではその詳細の解説は行いません.ただし,サーバーによっては,

  • newkey.pem ⇒ server.key
  • newreq.pem ⇒ server.csr
  • newcert.pem ⇒ server.crt

のように名前を変えなければならない,もしくは各鍵の形式を openssl を使いさらに変更しなければならないこともあります.

実例は,この blog だと,

Gitlab in local domain SSL 対応備忘録
こちらで設定したローカル環境の Gitlab を SSL に対応させる備忘録です.ちょっとした事情があって,UCサーバー証明書で発行してみます. まず,UCサーバー証明書を発行できるよう openssl.cnf を編集します.書き換え,追記...

とか

SageMath 設定備忘録
SageMath のインストールと設定の備忘録です.統計パッケージの R を Web フロントエンドで使うのが目的.SageMath 自体の概要を知りたい場合は,こことかここが分かり易い. インストールから Web フロントエンドの起動まで...

とか

Python で URL を転送する備忘録
Python で URL を転送する方法についての備忘録です.動機は URL の転送のためだけに Apache を入れる(設定する)のは大袈裟だよなぁ….何とかならないかなぁ… ということで,最近の標準的な UNIX(Linux) のパッケ...

にあります.

おわりに

このローカルな認証局の立ち上げ方と運用の仕方って,個人だと多くて半年に1回,ひどい場合だと数年やらない作業で,毎回,ほぼゼロから復習し直すことになります.おかげで今回も丸一日作業となってしまいました.

上にある通り,これまでもいろいろ備忘録を残してきたのですが,書き残していないところでやはり色々引っかかってしまいます.それで今回は,単に作業内容だけじゃなくて,なんでその作業が必要なのかの理由も付して備忘録として残そうと考えたのですが,この記事が次に役に経つのは下手をするとまた数年後な訳で,正直言うと,

それまでこの blog をやっているかどうかちょっと不安

なんですよね…….

しかしまぁこの blog も3年目で多くの人に見て頂いているみたいなので,どなたかの助けになれば幸いだと思うことにします.

以上!

NetworksServer
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました