簡易 CA 局になる方法

管理者必見!!
OpenSSL (SSLeay) を利用すると、 あなたも Verisign や RSA Data Security の様な、 証明書署名機関 (CA 局と呼ぶ) になれます。 ただし、世間一般に出回っている Netscape Navigator や Internet Explorer には独自 CA 局の証明書が、 当然の事ながら組み込まれていないので、一般社会では信用されないと思います。
便利な事に IE や Netscape 等は、 独自 CA 局の証明書を組み込める様にはなっていますが、 不特定多数へ向けた SSL サーバの独自証明書は、 あまり信用されないでしょう。 (私だったら絶対に信用しない 笑)
ですからローカル LAN 内や WAN 内でセキュリティを確保したいけれど、 オカネをかけたくないなぁ、なんて時にこのページがお役に立てれば、 と思って公開します。

※注)このページに書かれている事を信用し、 あなたが何らかの被害を被ったとしても、 当方では一切関知しません。(お約束ネ!)

以下のような手順を踏めば CA を誰でも立ち上げる事が可能です。

  1. OpenSSL を取って来て作る。
  2. 簡易 CA 局を立ち上げる。
  3. DER フォーマットの公開鍵を作る。
  4. 証明書署名要求 (CSR) に署名してあげる。
  5. OpenSSL の TIPS。
  1. OpenSSL を作る

    まず、これが無くては始まりませんね! OpenSSL を取って来て下さい。 SSLeay は 0.8.1a から OpenSSL へと移行したみたいです。 今後は OpenSSL を使いましょう。 SSLeay だと Apache-mod-ssl 等がコンパイル出来ないこともありますしね。
    さて、無事に取って来れましたでしょうか? 私は openssl-0.9.2b を取って来ました。
    早速展開して、サクっと make してしまって下さい。 INSTALL ドキュメントに書いてある通りに、な〜んも考えずに、

    % ./config
    % make
    % make rehash
    % make test
    # make install

    で OK でした。 デフォルトのままだと、/usr/local/ssl へインストールされるので、 『そんなのイヤだよ〜』なんて人は、perl を用意して、make の前に、

    % perl util/ssldir.pl /new/install/path

    を実行してみて下さい。 /new/install/path へインストール先ディレクトリを変更できます。
    ※ アメリカ合衆国に住んでいる人は、RSA の特許に引っかかるので、 RSA からライブラリをゲットして、OpenSSL に組み込んで下さい。
    詳細は、OpenSSL のドキュメント、 Web サイトを御覧下さい。

    うまく make & install 出来ましたか?

  2. 簡易 CA 局を立ち上げる

    簡単に CA 局になる為の Shell スクリプトが用意されています。(CA.sh)
    これは便利ですので使いましょう!
    (CA.pl は同じことを perl で実現しているスクリプトです。)
    ここでは、openssl が /usr/local/ssl へインストールされているモノとして話を進めます。
    ちょっと、/usr/local/ssl/bin/CA.sh を覗いて見ましょう。良くわかりませんか? ここで決めなければならないのは、自分の CA 局をどれぐらいの期間有効にするか、 ぐらいです。 最初の
    DAYS="-days 365" というのを変更すれば、10年でも100年でも CA 局の有効期間を延ばせます。 とりあえず、1年で良いのならそのままにしておきましょう。
    いよいよ実行です。openssl のコマンドサーチパスをちゃんと設定して、 (/usr/local/ssl/bin を 環境変数 PATH に設定します) 実行してみましょう。 いくつか質問されますが、英文を読めば大体何を入力すれば良いかわかりますよね?

    % mkdir /var/tmp/testCA ; cd /var/tmp/testCA
    % /usr/local/ssl/bin/CA.sh -newca
    CA certificate filename (or enter to create)
    < Return key を押す >
    Making CA certificate ...
    Using configuration from /usr/local/openssl/lib/openssl.cnf
    Generating a 1024 bit RSA private key
    .................................................................+++++
    .....+++++
    writing new private key to './demoCA/private/./cakey.pem'
    Enter PEM pass phrase: < Pass phrase を入力(絶対忘れてはイケナイ) > 
    Verifying password - Enter PEM pass phrase: < 同じモノをもう一度入力 > 
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:Kanagawa
    Locality Name (eg, city) []:Yokohama
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Takashi Inc.
    Organizational Unit Name (eg, section) []:Security Center
    Common Name (eg, YOUR name) []:Security Administrator
    Email Address []:secure@hohoho.co.jp
    

    /var/tmp/testCA 下に、 CA となる為の環境が整いました。 そして、/var/tmp/testCA/demoCA/private 下に、 あなたの CA 局自身の private key(秘密鍵)となる、 cakey.pem が出来ているはずです。 また同時に、/var/tmp/testCA/demoCA 下に、 CA 局自身の CA certificate(CA 証明書)となる、 cacert.pem も出来ているはずです。
    この2つの鍵ペアは非常に重要なモノなので、 管理をしっかりしなければなりません。 特に private/cakey.pem は秘密鍵なので、 第三者に閲覧されない様、パーミッションを適切に落としておきましょう。

    これまでの手順をまとめると、以下の様になります。
    作成されたディレクトリ

    ファイル
    demoCA/
           certs/
           crl/
           newcerts/
           private/
                   cakey.pem
           serial
           index.txt
           cacert.pem
    簡易 CA 局となる為に最低限必要なファイル群
    private key private/cakey.pem 秘密鍵 (公開不要なので、-r-------- が望ましい)
    CA certificate cacert.pem CA 証明書 (公開する必要があるので、-r--r--r-- が望ましい)

  3. DERフォーマットの公開鍵を作成する

    ブラウザへ独自 CA 局自身の証明書を組み込む事が出来る様に、 CA 証明書のフォーマットを変換します。
    これも openssl の機能を使って変換します。以下の様にして下さい。

    % cd /var/tmp/testCA/demoCA
    % openssl x509 -inform pem -outform der -in cacert.pem -out cacert.der

    この出来上がった cacert.der を、 Web ブラウザから参照できる場所に置いておき、 周りの人に、この Certificate をブラウザに組み込んでもらいます。

    例えばこれは、私がテストで作成した CA 証明書です。 拡張子は Certificate である事を表す為に、crt としてありますが、 サーバの MIME Type 設定で追加してあげる必要があります。
    e.g.

      AddType application/x-x509-ca-cert .crt
      AddType application/x-pkcs7-crl    .crl
    
    この例だと、cacert.der を takca.crt というファイル名にリネームして、 Web サーバ上に公開している、ということです。

    さあ、これで CA局 になる準備が整いました。 いよいよ Web サーバの証明書署名要求 (CSR) に署名をしてあげましょう。

  4. 証明書署名要求 (CSR) に署名してあげる

    これでいよいよOpenSSL を利用した、 証明書署名要求 (CSR) の作成方法 等で作成された CSR に対して、 あなたの CA 局が署名をしてあげる事が出来ます!!

    CA.sh のスクリプトで簡単に署名をする方法もあるのですが、 細かい設定が出来ないのと、「ツブし」がきくだろうということで、 ここでは、openssl のコマンドラインから署名する方法を解説します。
    まず、CSR をファイルとして保存します。 この CSR は要求して来た人(あるいは自分自身?)から、 メールやフロッピー等を媒介にしてもらって下さい。
    ファイルの内容は、以下の様な形式になっているはずです。
    -----BEGIN CERTIFICATE REQUEST-----
    alsdkfjioiaerjfi2lksdflkasdASDFjoiadvksdfienljoijwefsdfdfkjASDfd
    f3oijalskdfjoinadmfnvlkjrifgjlkjgaASEViuhuSAoiuashlGi4asu2094jdf
    DFlsdasdfiHJgighiIEluYy4xJDAiBgNVBAsTGkasjdfib3ASlskdjfi3nasdj8A
    < snip... >
    asdfij2i3u887yh5EBBAUA89afdhkjvn8iufh83kajs7ig2j31kmnASDFibfIhDQ
    3xcgDMfS3jCt2LF1KMFqlbbPfPZP52nPE6lbA4GBAIesd12398asdhjOsdfdgt7A
    asdfi/ashjasdfefpXYO/nJsdlfijoijasdfHkZsdfu8/o9sdfu12SD
    -----END CERTIFICATE REQUEST-----
    
    この "BEGIN CERTIFICATE" 〜 "END CERTIFICATE" までが、 CSR そのものです。この部分を書換えてしまうと、 正常に署名が出来ません!!
    この CSR をファイルに保存し、先程作成した demoCA ディレクトリ下に置きます。
    ここでは、csrs というディレクトリを新たに作成して、 そこに置くことにします。

    % cd /var/tmp/testCA/demoCA ; mkdir csrs
    % cp /tmp/csr.pem csrs/darekano-csr.pem
    この "darekano-csr.pem" に対して署名してあげます。 以下の様にコマンドを入力し、Pass phrase を間違いなく入力します。
    % openssl ca -policy policy_anything -days 365 \
      -out ./demoCA/certs/darekano-cert.pem \← out と infiles の順番が
      -infiles ./demoCA/csrs/httpsd-csr.pem  重要です!!
    Using configuration from /usr/local/ssl/lib/openssl.cnf
    Enter PEM pass phrase: < Pass phrase を入力(忘れてないよネ?) > 
    Check that the request matches the signature
    Signature ok
    The Subjects Distinguished Name is as follows
    countryName           :PRINTABLE:'JP'
    stateOrProvinceName   :PRINTABLE:'Tokyo'
    localityName          :PRINTABLE:'Setagaya'
    organizationName      :PRINTABLE:'Takashi Communications Inc.'
    organizationalUnitName:PRINTABLE:'The Mail Systems Dept.'
    commonName            :PRINTABLE:'www.ssl.nekoneko.co.jp'
    emailAddress          :IA5STRING:'webmaster@ssl.nekoneko.co.jp'
    Certificate is to be certified until Jun 20 07:06:30 2000 GMT (365 days)
    Sign the certificate? [y/n]:y
    
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
    
    これで、CSR に署名が出来ました。 この署名済証明書は-days 365と指定したので、1年間有効です。 あとは書き出した署名済証明書 (Signed Certificate) を返信してあげて下さい。 署名済証明書は、/var/tmp/testCA/demoCA/certs/darekano-cert.pem にあるはずです。 テキストファイルなので、中身を確認する事が出来ます。

  5. OpenSSL の TIPS

    OpenSSL はデフォルトで、/usr/local/ssl/openssl.cnf という OpenSSL の設定ファイルに従って動作します。

    ほとんどがマクロ記述なので、 ファイルを見ればどういう動作をしているか解ると思います。
では、快適なセキュリティライフを!!
Copyright (c) 1999-2000 by Takashi TANI
takashi@deathsdoor.com
1