XCAでローカルCAを立てて、ハッピーSSLライフ

開発サーバでソフトを動かすときにサーバ証明書が必要になるときってありますよね。
今話題のHTTP/2を試すにはSSL通信が必須だったりしますし。

もちろんOSやソフトについてくるサンプル用の証明書でもSSL通信はできるけど、証明書が検証エラーになるわけでブラウザの警告画面が鬱陶しいし、検証エラーを無視するための設定変更をする必要がある場合もあります。
かといって、わざわざ開発サーバのためにSSL証明書は買えないし…。

そんなときの救世主が[Let's Encrypt](https://letsencrypt.org/)で、無料で正規のSSL証明書を発行してくれるありがたい存在です。
しかし、Let's EncryptでSSL証明書発行するためにはドメインがDNS登録されている必要がありますので、社内（組織、自宅）内の内部で使ってる"abc.localdomain"みたいなドメインには対応してません。

結局、自前でLocal CAを運営する必要があるわけですが、opensslでやろうとすると結構大変です。
それを簡単に行うためのGUIツールとして[XCA](http://xca.sourceforge.net/)がありますので、使ってみました。

# インストール
[Sourceforge](https://sourceforge.net/projects/xca/)から各OSごとのバイナリがダウンロードできます。
brewなら一発でインストールできます。

```bash
$ brew cask install xca
```

# 管理用データベースの作成
File → New Database で管理用データベースを作成してください。
これが無いと証明書が作成できません。

次回以降、起動時にこの管理用データベースをopenします。


# CA自己署名証明書
最初にCA自己署名証明書を発行する必要があります。
Certificate の "New Certificate" ボタンをクリックして、ダイアログボックスを出します。
<img width="814" alt="スクリーンショット 2017-01-16 10.46.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/d8611fc7-44b5-e75a-0e9f-92840bd2c036.png">

SubjectにはCAの名前などを入力して、右下の"Generate New Key"ボタンをクリックして、秘密鍵を生成します。
<img width="872" alt="スクリーンショット 2017-01-16 10.49.41.png" src="https://qiita-image-
store.s3.amazonaws.com/0/145575/709cf495-196f-de8b-675b-83519e2657fd.png">

<img width="532" alt="スクリーンショット 2017-01-16 10.49.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/950a67ee-05c0-9dd9-b628-e3b7a6ed0927.png">

<img width="532" alt="スクリーンショット 2017-01-16 10.49.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/aa13db37-f52f-a9c1-057e-68407a772a1f.png">


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

<img width="872" alt="スクリーンショット 2017-01-16 10.50.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/3255f861-4f4c-f234-78c8-f908372a6035.png">

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

<img width="1184" alt="スクリーンショット 2017-01-16 10.50.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/c5647c87-f1e6-2cb6-07a7-fa2927a8ded0.png">

この証明書をExportボタンからエクスポートして、OSの証明書ストアに登録してください。
（そうしないと、証明書の検証でエラーになります）


# サーバ証明書
あとは、このCAから各ドメインのサーバ証明書を発行します。
基本的な手順は同じです。

"New Certificate" ボタンをクリックして、ダイアログボックスを出します。
Signingは先程作成したCAを指定して、Templateには"HTTP_servers"を選択します。

<img width="872" alt="スクリーンショット 2017-01-16 11.08.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/6cb703f7-15b4-08ac-a79b-08a99788b034.png">

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

<img width="872" alt="スクリーンショット 2017-01-16 13.34.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/029db274-d8f8-158e-4cf5-5f11f288c3bd.png">

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

<img width="872" alt="スクリーンショット 2017-01-16 13.34.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/1a3a9b81-c289-ed14-b8ee-6ca66d78172e.png">

これでサーバ証明書が生成されます。
<img width="1184" alt="スクリーンショット 2017-01-16 11.12.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/c943667e-f9b9-b7a9-a20e-8deb1f313c0d.png">


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

秘密鍵をエクスポートしたい場合は、"Private Kyes"タブからエクスポートできます。

<img width="1184" alt="スクリーンショット 2017-01-16 13.43.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/38d030e9-4676-dd92-745d-46ced15a3a90.png">


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

<img width="1184" alt="スクリーンショット 2017-01-16 13.43.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/145575/71a6565e-debe-8957-3d43-df87f924388a.png">


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

それではハッピーSSLライフを。