tiny ca

Ubuntu 12.10 で自己認証局(Self-signed Certificate Authority)を構築して遊んでみよう。

設定内容(こんな雰囲気で)

分類 項目
認証局 Common Name ca
認証局証明書 cacert.pem
パスフレーズ capassword
サーバ Common Name server
サーバ証明書 servercert.pem
サーバ秘密鍵 serverkey_nopass.pem
パスフレーズ serverpassword
クライアント Common Name client
クライアント証明書 clientcert.p12
パスフレーズ clientpassword
初期値 Country JP
stateOrProvinceName MyState
localityName MyCity
0.organizationName MyCompany
organizationalUnitName MySection
ディレクトリ Tiny CA ~/.TinyCA/ca/
認証局証明書 /etc/ssl/CA/
サーバ証明書 /etc/ssl/CA/certs/server/

認証局の構築と証明書の発行(Tiny CA 編)

  1. 環境設定
    Tiny CA のインストールと起動
$ sudo apt-get install tinyca
$ tinyca2
  1. 認証局証明書
    「CA」-「New CA」メニューで認証局「ca」を作成する。
    ~/.TinyCA/ca/cacert.pem に格納された認証局証明書をコピーする。
$ sudo mkdir -p /etc/ssl/CA
$ sudo cp ~/.TinyCA/ca/cacert.pem /etc/ssl/CA/
  1. サーバ証明書
    1. Certificates タブを選択して、ツールバーの新規作成ボタン(右側の方)を押して、「Create Key and Certificate (Server)」を選択する。
    2. Certificates タブで、「server」の行を選択して、下記設定でエクスポートする。
項目
File servercert.pem
Export Format PEM(Certificate)
Include Key(PEM) No
Include Fingerprint(PEM) No
3. Keys タブで、「server」の行を選択して、下記設定でエクスポートする。
項目
File serverkey_nopass.pem
Export Format PEM(Key)
Without Passphrase(PEM/PKCS#12) Yes
Include Certificate(PEM) Yes
4. サーバ証明書とサーバ秘密鍵をコピーする。
$ sudo mkdir -p /etc/ssl/CA/server/certs
$ sudo cp ~/servercert.pem /etc/ssl/CA/server/certs/
$ sudo cp ~/serverkey_nopass.pem /etc/ssl/CA/server/certs/
  1. クライアント証明書
    1. Certificates タブを選択して、ツールバーの新規作成ボタン(右側の方)を押して、「Create Key and Certificate (Client)」を選択する。
    2. Certificates タブで、「client」の行を選択して、下記設定でエクスポートする。
項目
File clientcert.p12
Export Format PKCS#12(Certificate & Key)
Include Key(PEM) Yes
Include Fingerprint(PEM) Yes

Web サーバの設定

  1. Web サーバApache 2 をインストールする。
$ sudo apt-get install apache2
$ sudo a2enmod ssl
  1. クライアント証明書がある場合のみ接続可能に設定する。
/etc/apache2/sites-available/default-ssl
#SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateFile /etc/ssl/CA/certs/server/servercert.pem
#SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLCertificateKeyFile /etc/ssl/CA/certs/server/serverkey_nopass.pem
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt
SSLCACertificateFile /etc/ssl/CA/cacert.pem
#SSLVerifyClient require
SSLVerifyClient require
  1. Web サーバを再起動して、443 ポートの状態を確認する。
$ sudo a2ensite default-ssl
$ sudo /etc/init.d/apache2 restart
$ netstat -an | grep 443

クライアントブラウザの設定

  1. ブラウザにクライアント証明書をインポートする。
    Firefox の場合は、[編集]-[設定]-[詳細化]-[暗号化]-[証明書を表示…]-[あなたの証明書]-[インポート…]でclientcert.p12 を指定してインポートする。

  2. 接続テストする。
    ブラウザでhttps://server/ にアクセスする。証明書の選択画面が表示される。

認証局の構築と証明書の発行(コマンドライン編)

  1. 環境設定
    オリジナルのスクリプト、設定ファイルを退避する。
$ sudo cp /usr/lib/ssl/misc/CA.sh /usr/lib/ssl/misc/CA.sh.original
$ sudo cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.original

スクリプト、設定ファイルを編集する。

/usr/lib/ssl/misc/CA.sh
DAYS="-days 365"
CADAYS="-days 1095"
CATOP=/etc/ssl/CA
/etc/ssl/openssl.cnf
dir = /etc/ssl/CA # Where everything is kept
default_days = 365 # how long to certify for
countryName_default = JP
stateOrProvinceName_default = MyState
localityName_default = MyCity
0.organizationName_default = MyCompany
organizationalUnitName_default = MySection
commonName_default = ca_or_server_or_client
emailAddress_default = mail_address
  1. 認証局証明書
$ sudo /usr/lib/ssl/misc/CA.sh -newca
$ sudo openssl x509 -in /etc/ssl/CA/cacert.pem -out /etc/ssl/CA/cacert.pem
  1. サーバ証明書
$ sudo mkdir /etc/ssl/CA/certs/server
$ cd /etc/ssl/CA/certs/server
$ sudo /usr/lib/ssl/misc/CA.sh -newreq
$ sudo /usr/lib/ssl/misc/CA.sh -sign
$ sudo openssl x509 -in newcert.pem -out servercert.pem
$ sudo openssl rsa -in newkey.pem -out serverkey_nopass.pem
  1. クライアント証明書
$ sudo mkdir /etc/ssl/CA/certs/client
$ cd /etc/ssl/CA/certs/client
$ sudo /usr/lib/ssl/misc/CA.sh -newreq
$ sudo /usr/lib/ssl/misc/CA.sh -sign
$ sudo openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -certfile /etc/ssl/CA/cacert.pem -out client.p12