一般的な認証局はルート認証局,中間認証局と複数階層になっています。これは,ルート認証局をセキュリティ的に保護するためです。ルート認証局は中間認証局の証明書を発行するだけの機能を持ち,通常はオフラインにしています。中間認証局がエンドエンティティの証明書を発行する機能を受け持ちます。ルート認証局がオフラインのため,ハッキングを受けるリスクが減るというわけです。
Ubuntu上に構築したOpenSSLのオレオレ認証局(リンク)でも,これをマネして複数階層の認証局を構築してみます。
はじめに
この2つのCAを構築していきます。
・ルート認証局:Trusted Design RootCA
・中間認証局:Trusted Design IssuingCA
このようなフォルダ構成にしていきます。
/usr/local/ssl/にOpenSSL(2018年6月時点の最新版である1.0.2o)がインストールされていることを前提に書いていきます。こちらにOpenSSLのバージョンアップ手順が書いてあります。
・/usr/local/ssl/RootCA:ルートCAを格納
・/usr/local/ssl/IssuingCA:中間CAを格納
・/usr/local/ssl/misc:CA用のスクリプトを格納(OpenSSLをインストールすると勝手にできます)
今回は,VirtualBoxにインストールしたUbuntu16.04LTSを使って構築します。ちなみに,Windowsで3階層のCAを構築した例はこちらです。
事前準備
OpenSSLの設定ファイル「openssl.cnf」とCAのスクリプトファイル「CA.pl」を変更していきます。デフォルトのままCAを構築すると,デフォルト設定のCAが出来上がるわけですが,今回は3階層のCAを構築して,そのまま運用することを想定しているので,openssl.cnfとCA.plの変更が必要になるわけです。
ルートCA用の設定ファイル(openssl_root.cnf)を作成する
まず,ルートCA用にopenssl.cnfを変更していきます。
openssl.cnfはOpenSSLのインストールディレクトリに存在します。OpenSSLのインストールディレクトリに移動します。
$ cd /usr/local/ssl
ルートCA用のディレクトリを生成します。
$ sudo mkdir RootCA
openssl.cnfが存在することを確認したら,ファイルをコピーします。
$ sudo cp openssl.cnf openssl_root.cnf
openssl_root.cnfを編集していきます。
$ sudo vi openssl_root.cnf
40行目くらいの[ CA_default ]セクションを探して,その下のdirを変更します。下のスクリーンショットでは42行目にあります。
dir = /usr/local/ssl/RootCA # Where everything is kept
さらに73行目くらいにdefault_daysがあります。これはCA証明書の有効期間なので30年くらいに延ばしておくといいです。どうせオレオレ認証局だし。
Default_days = 10957 # how long to certify for
※ 今回紹介するCA.plでCAを構築する場合は,openssl.cnfの有効期限設定を伸ばしても,無視されてしまい,CA.plの有効期限設定が適用されます。CA.plを利用せずに署名することを想定して,CA.plと同じ有効期間(30年)を設定しておくことにします。
ルートCA用のスクリプトファイル(CA_Root.pl)を作成する
次にルートCA用のスクリプトファイルを変更します。スクリプトファイルCA.plは/usr/local/ssl/miscにあります。
$ cd /usr/local/ssl/misc $ sudo cp CA.pl CA_Root.pl
CA_Root.plを編集していきます。
$ sudo vi CA_Root.pl
47行目くらいからの定義を次のように変更します。下のスクリーンショットでは,$SSLEAY_CONFIGは47行目,$DAYSは48行目,$CATOPは56行目にあります。
$SSLEAY_CONFIG=”-config /usr/local/ssl/openssl_root.cnf”; $DAYS=”-days 10957”; $CATOP=”/usr/local/ssl/RootCA”;
49行目に$CADAYSがありますが,こちらは発行するCA証明書の有効期限で。48行目の$DAYSは発行する証明書の有効期限です。
これでルートCAの設定は完了です。
中間CA用の設定ファイル(openssl_issu.cnf)を作成する
ルートCAと同じように中間CAの設定を行います。
中間CA用のディレクトリを生成します。
$ sudo mkdir IssuingCA
openssl.cnfが存在することを確認したら,ファイルをコピーします。
$ sudo cp openssl.cnf openssl_issuing.cnf
ルートCAと同じようにopenssl_issuing.cnfを編集していきます。
$ sudo vi openssl_issuing.cnf
40行目くらいの[ CA_default ]セクションを探して,その下のdirを変更します。
dir = /usr/local/ssl/IssuingCA # Where everything is kept
さらに73行目くらいにdefault_daysがあります。こちらは,中間CAが発行する証明書の有効期限となりますので,今回は2年に設定します。
Default_days = 730 # how long to certify for
中間CA用のスクリプトファイル(CA_Issuing.pl)を作成する
中間CAのスクリプトファイルを作成します。
$ cd /usr/local/ssl/misc $ sudo cp CA.pl CA_Issuing.pl
こちらもルートCAと同じようにCA_Issuing.plを編集していきます。
$ sudo vi CA_Issuing.pl
47行目くらいからルートCAと同じように変更します。
$SSLEAY_CONFIG=”-config /usr/local/ssl/openssl_issu.cnf”; $CADAYS=”-days 730”; $CATOP=”/usr/local/ssl/IssuingCA”;
CAの構築
ルートCAの構築
設定ファイルの作成は完了したので,いよいよCAを構築していきます。CAの構築は上で設定したCA_Root.plとCA_Issuing.plのスクリプトを利用します。
$ cd /usr/local/ssl/misc $ sudo ./CA_Root.pl -newca
CAを構築して,ルート証明書を発行したので,ルート証明書を配布用に作成します。
$ cd /usr/local/ssl/RootCA $ sudo openssl x509 -inform pem -in cacert.pem -outform der -out rootcert.der
証明書をUbuntuで開くと次のように証明書が発行されていることがわかります。サブジェクト名(Trusted Design Root CA)と発行者(Trusted Design Root CA)が同じ(つまりオレオレ証明書)です。
中間CAの構築
中間CAはCA_Root.plではなくCA_Issuing.plを実行します。中間CAは自己署名ではなくルートCAに署名をもらうのでパラメタは”-newreq”です。
$ cd /usr/local/ssl/misc $ sudo ./CA_Issuing.pl -newreq
ルートCAに署名をリクエストします。
ルートCAが処理を行うので,スクリプトもルートCAのスクリプト(CA_Root.pl)を利用します。
$ sudo ./CA_Root.pl -signCA
これでカレントディレクトリ(この例だと”/usr/local/ssl/misc”)に以下の3つのファイルができています。
・newkey.pem : 中間CA証明書の秘密鍵
・newreq.pem : 中間CA証明書のリクエストファイル
・newcert.pem : 中間CA証明書
これらのファイルを中間CAのディレクトリに移動させます。
$ sudo mv new* /usr/local/ssl/IssuingCA
注:他にnewで始まるファイルがないことを確認してから実行してください。
ルートCAに署名してもらった証明書を利用して中間CAを構築します。今度はCA_Issuing.plを-newcaパラメタで実行します。
$ cd /usr/local/ssl/misc $ sudo ./CA_Issuing.pl -newca
ここで CA certificate filenameと出力されますので,ルートCAから発行したnewcert.pemをフルパスで指定します。
中間CAのディレクトリに移動すすると,CAに必要なファイル群ができていることがわかります。
ルートCAと同じように証明書を出力します。
$ cd /usr/local/ssl/IssuingCA $ openssl x509 -inform pem -in newcert.pem -outform der -out cacert.der
中間証明書のUbuntuで開いてみました。発行者がTrusted Design Root CAで,サブジェクトがTrusted Design Issuing CAとなっていることがわかります。
証明書の確認
発行した証明書(ルート証明書,中間証明書)をWindowsのPCに持ってきて,証明書ストアにインポートしてみました。ルート証明書を信頼されたルート証明機関にインポートしない状態だと,証明書を開いても赤の[×]印が表示されています。
一方,中間証明書を開くと,黄色の[!]印でルート証明書からのチェーンがつながっていないことがわかります。
ルート証明書のインポート
ルート証明書をダブルクリックして開き,「証明書のインストール」ボタンを押します。
すると,証明書のインポートウィザードが開始します。保存場所を「現在のユーザ」にして,「次へ」ボタンをクリックします。
次は保存する証明書ストアを選択する画面です。「証明書の種類に基づいて,自動的に証明書ストアを選択する。」を選んでも問題ありませんが,念のため,「証明書をすべて次のストアに配置する。」を選択し,証明書ストアを選びます。
「参照」ボタンを押すと,証明書ストアの一覧が出力されます。信頼されたルート証明機関を選択します。
証明書インポートウィザードが完了します。「完了」ボタンを押します。
ルート証明書を追加しようとするので,警告画面が出力されます。「はい」を押してインポートを許可します。
ルート証明書のファイルをもう一度開くと赤の[×]印はなくなっています。これで,オレオレ証明書がWindowsのルート証明書ストアに格納されました。
これに伴って中間証明書を開くと黄色の[!]印はなくなっています。ルート証明書からの証明書チェーンが構築できたからですね。