OpenSSLで認証局を作って証明書を発行する
フリーアプリのセキュリティを担う巨塔OpenSSLについての覚書です。
ここではradiusの運用をするために、CA(認証局)を自己署名で作成し、radiusサーバーやサプリカント用の証明書を発行します。
ちなみに、ここではDebian OSにインストールしたOpenSSLを例に紹介していますが、WindowsにOpenSSLをインストールしたい場合はWindows用のOpenSSLをビルドするところから始めてください。
さらに、 限られた数のPCで運用されるMSオフィスのマクロ実行用に署名をしたい(証明書を作る)場合は、専用のアプリがありそちらを使った例をリンク先にて紹介していますのでご合わせてお読みいただけたら幸いです。
CA(認証局)とは
radiusで証明書を使って相互認証をするにはまず、証明書を発行するCA(認証局)を作らなければいけません。
CA(認証局)とはインターネットやローカルネットに存在する機器の身元を証明する母体です。IPアドレス経由でたどり着いた端末が偽装されたPCではないことを証明するための証明書を発行します。
インターネットの世界では、RootCAから階層的につながっているどこかのCAから証明書を得ることで偽サイトでないことが保証されます。
Let's Encriptのような例外もありますが、CAから証明書を発行してもらうにはコストがかかります。なので今回はそのような証明の連鎖から外れ、自分で自分を証明します。
公的な機関によらない証明はCAからまるごと偽装が行われる可能性がありますが、今回のradius認証はそこまでを想定しない運用です。また、ブラウザなどで自己証明型のCAを利用をしようとすると警告がでたりもします。
CAの運用にかかわるファイル
CA作成の前に、CAに関連するファイルや用語がいくつか登場しますので、一度それを整理しておきます。
一連の照明は証明書を用いて行われます。証明書ファイルにはDER形式とPEM形式があります。DERはバイナリ形式のファイルになり、PEMはBase64形式のファイルになります。そのためPEMファイルならテキストエディタでも中身を確認することができます。また証明書ファイル名にはCRTやCERといった、証明書だと示す文字列が含まれることが多いです。
KEYとなっているファイルは文字通り鍵です。CAの運用では鍵にも種類があり公開鍵と秘密鍵がありますが、KEYとした場合は秘密鍵を指すことが多いです。鍵のフォーマットもDERかPEMどちらも存在します。
CSRという文字がファイル名に含まれている場合は、CAに署名を求めるためのファイルです。この中には公開鍵が含まれます。
CRLは証明書失効リストファイルです。発行された証明書を何らかの理由で期間中に取り消したい場合に失効させます。ただしこのファイルでの運用は即時性に欠けるのでOCSPが用いられることもあります。
秘密鍵・公開鍵とは「公開鍵暗号方式」の用語です。鍵に秘密の部分と一般に公開する部分を作ることによって、不特定多数の人と容易に暗号化通信ができるようになります。電子署名にもこの技術が使われています。
CAが発行する証明書の内容
CAは証明書を発行しますがその内容は次のようになっています。
バージョン1(必須項目)
- バージョン情報
- シリアル番号
- 署名アルゴリズム
- 発行認証局名
- 有効期限
- 発行者名(subject)
- 公開鍵情報
バージョン2(任意項目)
- 認証局のオブジェクトID(issuerUniqueID)
- 被発行者のオブジェクトID(subjectUniqueID)
バージョン3(任意項目)
- 鍵の利用目的KeyUsage
- 証明書ポリシー(certificate policies)
- 廃棄リスト配布ポイント(cRLDistributionPoints)
CAの作成
OpenSSLをインストールすると/usr/lib/ssl/misc/CA.plにスクリプトが作成されます。これを使ってCAを作成します。
CA.plの中身はテキストエディタで変更できますが、openSSLの設定ファイルopenssl.cnfと同期がとられている項目があります。編集しないようにという記述もありますのでそのまま使った方が無難です。
ただ、CAの有効期限が過ぎると処理が大変だという話を聞くので、筆者は有効期限である$CADAYSの1095(3年)という値を7300(20年)にしました。
また、スクリプト実行時、利用されるcnfファイルは/usr/lib/ssl/onessl.cnfと表示されますが、これは/etc/ssl/openssl.cnfへのシンボリックリンクのようなので気にしないでください。
CA用のディレクトリを作成したい場所で次のコマンドを実行します。ここで作成されるCAディレクトリがCAの本体となります。
次の内容を確認してきますので入力します。
- CA ceartificate filename
空白のままENTERを押すと、新規作成されます。
- Enter PEM pass phrase
CAのキーを利用する際のパスワードを設定します。
- Verifying - Enter pass phrase
パスワードの確認です。先の値と同じものを入力します。
- Country Name
以降でCAの情報を設定します。国名です。日本ならJPです。
- State or Province Name
都道府県名をローマ字で入力してください。
- Locality Name
市町村名をローマ字で入力してください。
- Organization Name
組織名。社名等を入力してください。
- Organizational Unit Name
部署名。空白でいいと思います。
- Common Name
一番重要な名前です。他で設定した名前と重ならないように名前を設定してください。Private CA等。
- Email Address
Eメールアドレスです。空白でもかまいません。
- A challenge password
空白にします。
- A optional comany name
空白にします。
自己署名をする都合上、最後にCAのパスワードの入力を求められますので再度入力します。
この処理で作成されたCAのディレクトリ(デフォルトだとdemoCA)の中の構造を説明します。
- cacert.pem
CAの自己署名型の公開鍵証明書です。※1
- careq.pem
CAが他のCAに署名を求める際の証明書発行要求(CSR)です。
- certs
CAが発行した証明書用のディレクトリです。
- crl
CAが失効させた証明書用のディレクトリです。
- newcerts
CAが新たに発行した証明書用のディレクトリです。ここに出力されたのを確認したらcertsに動かすのが運用だと思われます。
- serial
次に発行する証明書の連番です。
- index.txt
証明書の発行履歴が入っています。
- index.txt.old
1世代前のindex.txtのデータです。
- index.txt.attr
重複を許すかどうかを設定しているunique_subjectという記述が入っています。yesで重複禁止です。重複はCountryからCommon Nameまでの値(=subject)で判断しています。また、過去のデータはindex.txtから取得しています。
- crlnumber
CRL(証明書廃棄リスト)の連番を管理しているファイルです。
- crlnumber.old
1世代前のcrlnumberのデータです。
証明書の作成
ここまででCA自身の証明ができました。このCAを使って証明書を作成していきます。radiusの運用では、radiusサーバー用の秘密鍵と証明書、radius認証を受けるサプリカント(端末)用の秘密鍵と証明書を端末の数だけ作成します。
通常のCAの運用では、証明を受けたい端末が自身で秘密鍵と公開鍵のペアを作成・管理し公開鍵に対しての証明書発行要求(CSR)を作成します。そしてCSRだけをCAに渡して証明書を受け取るのですが、ここでは少し違います。作成したCAで、すべての端末の秘密鍵やCSR、証明書を作成してしまいます。
openSSLを使って証明書発行要求(CSR)を作成するにはreqコマンドを利用します。
keyoutオプションでクライアントの秘密鍵も出力しています。もし秘密鍵にパスワードが不要ならnodesオプションも付与します。
先にCAを作成したときと同様に、パスワードやクライアントの情報を聞かれます。Common Nameはradiusサーバーに接続する端末の識別になりますのでわかりやすいように名付けてください。radiusサーバー用に作りましたのでRadius Serverと名付けました。
CSRを作成しましたので、先に作ったCAで署名します。CAの設定ディレクトリは/etc/ssl/openssl.cnfファイル内で相対パスとして設定されていましたので、作成されたディレクトリ(demoCA)の一つ上の場所で実行します。
CAとしてopenSSLを動作させるにはcaコマンドを使います。
inにCSRファイル、outに証明書ファイルを指定します。policyはopenssl.cnfに記述されているどのポリシーを使うかを示しています。ここでは制限なく署名をするポリシー[ policy_anything ]を利用するとしています。証明書の有効期限をdaysオプションで指定できます。あまり長くすると環境によってはエラーとなることもあるようです。
ポリシーにはいくつかエントリーを設けることができますが、同様にcaの設定も複数もつことができます。通常は[ ca ]部で指定されているCA_defaultが利用されますが、自身で設定を増やしnameオプションで指定することでオリジナルのca設定を使うこともできます。
仮に [ CA_radius ]の記述をした場合、openssl ca -name CA_radius ...というようにCA設定の変更ができるようになります。
クライアントには作成した秘密鍵と証明書、CAの証明書(※1)をコピーします。厳密な運用ではこのファイルの受け渡しの方法も外部に漏れないように行うべきものになります。
radiusサーバーの運用では、radiusサーバー用とサプリカンント用のそれぞれ秘密鍵、証明書、CA証明書を作成し、配布することになります。また、失効リストの反映を考えるとCAはradiusサーバーに同居させた方が楽です。