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 編)

環境設定

Tiny CA のインストールと起動

$ sudo apt-get install tinyca
$ tinyca2

認証局証明書

「CA」-「New CA」メニューで認証局「ca」を作成する。
~/.TinyCA/ca/cacert.pem に格納された認証局証明書をコピーする。

$ sudo mkdir -p /etc/ssl/CA
$ sudo cp ~/.TinyCA/ca/cacert.pem /etc/ssl/CA/

サーバ証明書

  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. 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
  2. クライアント証明書がある場合のみ接続可能に設定する。

    /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
  3. 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
  2. 認証局証明書

    $ sudo /usr/lib/ssl/misc/CA.sh -newca
    $ sudo openssl x509 -in /etc/ssl/CA/cacert.pem -out /etc/ssl/CA/cacert.pem
  3. サーバ証明書

    $ 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
  4. クライアント証明書

    $ 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