開発サーバでソフトを動かすときにサーバ証明書が必要になるときってありますよね。
今話題のHTTP/2を試すにはSSL通信が必須だったりしますし。
もちろんOSやソフトについてくるサンプル用の証明書でもSSL通信はできるけど、証明書が検証エラーになるわけでブラウザの警告画面が鬱陶しいし、検証エラーを無視するための設定変更をする必要がある場合もあります。
かといって、わざわざ開発サーバのためにSSL証明書は買えないし…。
そんなときの救世主がLet's Encryptで、無料で正規のSSL証明書を発行してくれるありがたい存在です。
しかし、Let's EncryptでSSL証明書発行するためにはドメインがDNS登録されている必要がありますので、社内(組織、自宅)内の内部で使ってる"abc.localdomain"みたいなドメインには対応してません。
結局、自前でLocal CAを運営する必要があるわけですが、opensslでやろうとすると結構大変です。
それを簡単に行うためのGUIツールとしてXCAがありますので、使ってみました。
インストール
Sourceforgeから各OSごとのバイナリがダウンロードできます。
brewなら一発でインストールできます。
$ brew cask install xca
管理用データベースの作成
File → New Database で管理用データベースを作成してください。
これが無いと証明書が作成できません。
次回以降、起動時にこの管理用データベースをopenします。
CA自己署名証明書
最初にCA自己署名証明書を発行する必要があります。
Certificate の "New Certificate" ボタンをクリックして、ダイアログボックスを出します。
SubjectにはCAの名前などを入力して、右下の"Generate New Key"ボタンをクリックして、秘密鍵を生成します。


次に Extension の 上の方のTypeに"Certificate Authority"を選択して、Timer Rangeで証明書の有効期限を設定してください。
デフォルトの1年だと短いので、10年くらいにしておくと良いと想います。

これで右下の"OK"ボタンを押すと、証明書が発行されます。
CAの欄にチェックマークが付いていることを確認してください。
これでCAの自己署名証明書が作成できました。

この証明書をExportボタンからエクスポートして、OSの証明書ストアに登録してください。
(そうしないと、証明書の検証でエラーになります)
サーバ証明書
あとは、このCAから各ドメインのサーバ証明書を発行します。
基本的な手順は同じです。
"New Certificate" ボタンをクリックして、ダイアログボックスを出します。
Signingは先程作成したCAを指定して、Templateには"HTTP_servers"を選択します。

Subjectには証明書のDNを設定します。
サーバ証明書なのでcommonNameにドメイン名を指定します。
同じように秘密鍵を生成してください。

Extensions の Type には "End Entity"を選択して、Timer Rangeで証明書の有効期限を設定してください。
(CAの証明書の有効期限を超える日付は設定できません。)

証明書のエクスポート
生成されたサーバ証明書はCertificatesの該当行を選択して、Exportボタンからエクスポートできます。
右クリック → Export メニューからだと、クリップボードにコピーすることもできるので、いちいちファイルを扱うのが面倒な場合に便利です。
秘密鍵をエクスポートしたい場合は、"Private Kyes"タブからエクスポートできます。

CRLは一番右のRevocation listsから右クリック → Newで発行できます。
生成されたCRLは"Export"ボタンでエクスポートできますので、webサーバかLDAPなど配置してください。
(その場合は、証明書生成時にCRL Destribution Pointの指定が必要になります。)

今回は最低限必要な項目だけを入力しましたが、様々な属性が指定できますので、
そこそこ本格的なLocal CAが運用できるかと思います。
それではハッピーSSLライフを。