OpenSSLで自己認証証明書(おれおれCA)を作成
一般に、公的な証明書発行機関の証明書にはそれなりにお金がかかるわけで、個人で、個人向けにサービスをするなら自己認証証明書で済ましておくのがお金がかからなくて幸せ。
というわけで、自己認証証明書とおれおれCAの作成メモ。
参考URL
注意
- 自己認証証明書はあくまで身内で利用するためだけにしましょう
- 公的なサービスに自己認証証明書を利用するのはよろしくありません
- この手段を使う場合、ブラウザーなどにRootCAの証明書の登録が必要です
準備をする
動作環境はNetBSDとする。opensslを使うので、恐らく他のPlatformでも動くとは思うけど。
NetBSD 5.1 RC1には、defaultでOpenSSLがInstallされている。
- CA用のOpenSSLワークディレクトリを決める
- 今回は、/etc/openssl/CAとする
- 複数のDomainでそれぞれのCAを作るなら、/etc/openssl/[domains-yyyymmdd]などとするとわかりやすくて便利
- openssl.cnfを作成し、/etc/openssl/openssl.cnfに設置
- ひな形は /usr/share/examples/openssl/openssl.cnf
今回のCAの構造
今回はRoot CAと、その下にSubsidiary CA(中間認証局)を構築することを目標とし、個人認証用やServer認証用の証明書はすべてSubsidiary CAから発行するものとする。
Root CAは下位のCAに署名することのみ行う
Subsidiary CAは、下位のHostや個人用の証明書に署名することのみ行う。
Root CAの作成
Subsidiary CAの作成
サーバー証明書の作成
ここまででRootCA/SubsidiaryCAの作成は出来たので、あとは、各種証明書を作成するだけ。
=== 秘密鍵の作成 === # openssl genrsa -des3 -out mailservkey.pem 2048 ←とりあえず Mail Serverの証明書を作ってみる # openssl rsa -in mailservkey.pem -out mailservnopasskey.pem ←サーバーの起動時にpassphrase入力を要求されても対応は難しいから外しておく === CSR作成 === # openssl req -new -days 365 -key mailservkey.pem -out mailservcsr.pem ←passphrase付きの鍵を使うこと Country Name (2 letter code)[AU]: JP ←国コード(まぁ、日本だし、JPだよね) State or Province Name (full name)[Some-State]: Tokyo ←都道府県、州等を入力 Locality Name (eg, city)[]: Suginami-Ku ←市区町村を入力 Organization Name(eg, company)[example.net]: example.net ←会社名などを入力 Organization Unit Name (eg, section)[]: ←部署など Common Name (eg, your name or your server's hostname)[]:mail.example.net ←サーバー名や個人名などをFQDNで入力 Email Address []:postmaster@example.net ←連絡先を入力 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: ←特に入力しなくても良い An optional company name []: ←特に入力しなくても良い === 署名 === Subsidiary CAにloginして、署名処理を行う
注意:重要
いわゆるhttps(HTTP+SSL)を、virtual hostingで利用したい場合、それぞれの仮想ドメイン毎にSSL証明書を発行して、ssl通信をしたくなる。
- IPベースでVirtual Hostingをするならば、問題なく仮想ドメイン毎にSSL通信できる。
- 名前ベースでIP addressをshareしている場合、仮想ドメイン毎にSSL通信することは不能
ということになる。
理由
SSL通信はLayer 4で行われる。これは、要するにTCP層で処理されると言うことである。(だからport番号が違う。httpは80番ポート、httpsは443番ポート)
HTTPはTCP層の上位Layerのプロトコルであり、TCP通信が成立していることが前提となる。
従って、通信は以下の順序で行われる
- HTTPの場合
- ServerのIP Address(以下Addr(s))において、httpポートでsocket(以下sock(80))をLISTENする
- ClientがAddr(s)のsock(80)に接続要求する
- TCPがEstablishしたらpayload(HTTP要求)をWeb Server(以下httpd)に渡す
- httpdはHTTP要求を見て、処理を行う。この段階で仮想ホストに対するアクセスなども処理される
- HTTPsの場合
- Addr(s)において、httpsポートでsocket(以下sock(443))をLISTENする
- ClientがAddr(s)のsock(443)に接続要求する
- SSLの処理を行う。この処理は、IP Addressのみを元にして行われる
- TCPがEstablishしたらpayload(HTTP要求)をWeb Server(以下httpd)に渡す
- httpdはHTTP要求を見て、処理を行う。この段階で仮想ホストに対するアクセスなども処理される
このような流れである以上、named virtual hostの処理をhttpdが行う前にSSLがEstablishしていなければならない。
個人証明書の作成
証明書のPassPhraseをはずす
LighttpdやDovecot等、Server Applicationで証明書を利用する場合、証明書のpassphraseを外しておきたいことがある。
Dovecotはconfigファイルにpasswordを書けるようだが、記載できないServer Applicationが多いので、しょうがないからPassPhraseをはずす方法を。
# openssl rsa -in server.key -out server.key
注意点
証明書の運用上注意すべき点を挙げる。
- 今回作ったCAはあくまでも「おれおれCA」である。従って、公的な証明には全くならないので注意すること
- 各証明書が失効すると再度証明書を発行する必要がある。
- 暗号アルゴリズムは危殆化するので、あまり長期間の証明書を作成すると更新が大変。
- これらの面倒を負えないなら、コストをかけて証明書を購入するべき。
無料の証明書発行サイト
- Thawte Inc. 解説記事は 無料でデジタル証明書を取得する(1)にあります。
- cacert.org 解説記事は CACert.orgで無料のSSLサーバを動かすメモにあります。
- startssl 解説記事は無料 SSL 証明書 StartSSL を使うにあります。