証明書署名要求の作成方法

管理者必見!!
OpenSSL (SSLeay) を利用して、証明書署名要求 (CSR - Certificat Signing Request? と言う) を発行し、CA 局に証明書へ署名してもらうことができます。 これは Apache + mod_ssl 等、 SSL 通信を利用する際に、 より信頼されたサーバを構築したい場合、必要となります。
この CSR と「簡易 CA 局になる方法」 で紹介しているような CA 局環境を作成することにより、 VerisignRSA Data Security 等の CA 局へオカネを払わずとも、 SSL 通信が可能なサーバを作成することができます。 もちろん、ここで紹介する CSR を VerisignRSA Data Security へ送付し署名してもらい、 いわゆる「信頼された SSL サーバ」を作成することも可能です。
もちろん、オカネがかかります(笑)

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

CSR を OpenSSL を利用して作成するには、以下の様な手順を踏みます。

  1. OpenSSL を取って来て作る。
  2. プライベート鍵を作成。
  3. プライベート鍵から CSR を作成。
  4. 署名された証明書。
  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. プライベート鍵を作成

    OpenSSL を利用して、プライベート鍵を作成します。 下準備として、乱数を発生させるためのデータファイルを用意します。 例えば、いくつかのバイナリファイルやテキストファイルを用意し、 一つのファイルに結合します。

    % cat /bin/ls /bin/awk $HOME/.cshrc > /tmp/random.dat

    乱数を発生させるための「タネ」ファイルが用意できたら、 いよいよプライベート鍵の作成です。openssl にパスは通してありますか?
    以下の様に実行します。

    % openssl genrsa -rand /tmp/random.dat -des 1024 > private.pem
    unable to load 'random state'
    18458 semi-random bytes loaded
    Generating RSA private key, 1024 bit long modulus
    .......................................+++++
    .+++++
    e is 65537 (0x10001)
    Enter PEM pass phrase: < Pass phrase を入力(絶対忘れてはイケナイ) > 
    Verifying password - Enter PEM pass phrase: < 同じモノをもう一度入力 > 
    
    カレントディレクトリに、private.pem というファイルが出来ているはずです。 このファイルは非常に重要なモノなので、 管理をしっかりしなければなりません。 特にプライベート鍵は公開しない「秘密鍵」と呼ばれるモノなので、 第三者に閲覧されない様、パーミッションを適切に落としておきましょう。
    なおパスフレーズで保護したくない時(テスト環境など)は、

    % openssl genrsa -rand /tmp/random.dat > private.pem

    で出来ます。

  3. プライベート鍵から CSR を作成

    前工程で作成した、プライベート鍵から CSR (証明書署名要求) を作成します。 ここで出来たファイルを CA 機関(Verisign, RSA Data Security, etc...) へ送付し、署名してもらいます。
    もちろん、自分で作った簡易 CA 局でも署名できます。
    以下の様に実行し、CSR を作成します。

    % openssl req -new -key private.pem -out csr.pem
    Using configuration from /usr/local/openssl/lib/openssl.cnf
    Enter PEM pass phrase: < プライベート鍵作成時に設定した 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 Communications Inc.
    Organizational Unit Name (eg, section) []:The Mail Systems Dept.
    Common Name (eg, YOUR name) []:www.ssl.nekoneko.co.jp < SSLサーバとしたいWebサーバのFQDN >
    Email Address []:webmaster@ssl.nekoneko.co.jp < SSLサーバの管理者メールアドレス >
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []: < オプションなので入力不要 > 
    An optional company name []: < オプションなので入力不要 > 
    
    カレントディレクトリに、csr.pem というファイルが出来ているはずです。 このファイルが、CSR です。ファイルはテキストファイルなので、 中を見ることが出来ます。ファイルの内容は、以下の様な形式になっているはずです。
    -----BEGIN CERTIFICATE REQUEST-----
    alsdkfjioiaerjfi2lksdflkasdASDFjoiadvksdfienljoijwefsdfdfkjASDfd
    f3oijalskdfjoinadmfnvlkjrifgjlkjgaASEViuhuSAoiuashlGi4asu2094jdf
    DFlsdasdfiHJgighiIEluYy4xJDAiBgNVBAsTGkasjdfib3ASlskdjfi3nasdj8A
    < snip... >
    asdfij2i3u887yh5EBBAUA89afdhkjvn8iufh83kajs7ig2j31kmnASDFibfIhDQ
    3xcgDMfS3jCt2LF1KMFqlbbPfPZP52nPE6lbA4GBAIesd12398asdhjOsdfdgt7A
    asdfi/ashjasdfefpXYO/nJsdlfijoijasdfHkZsdfu8/o9sdfu12SD
    -----END CERTIFICATE REQUEST-----
    
    この "BEGIN CERTIFICATE" 〜 "END CERTIFICATE" までが、 CSR そのものです。この部分を書換えてしまうと、 正常に署名が出来ません!!
    このファイルをメールや Web ページなどから CA 機関( Verisign, RSA Data Security, etc.. )に送付して署名して貰いましょう。 もちろん、「簡易 CA 局になる方法」ページを参考に、 自分で署名することもできます。

    これまでの手順をまとめると、以下の様になります。
    ファイル名説明
    random.dat プライベート鍵を作成する際に乱数を発生させるための「タネ」ファイル
    private.pem プライベート鍵(秘密鍵)
    公開不要なので、-r-------- が望ましい
    csr.pem 証明書署名要求 (CSR)
    このファイルを CA 機関へ送付し署名してもらう
    Common Name SSLサーバにしたいマシンのFQDN
    FQDN…完全なインターネットドメインネームアドレス
    Email Address SSLサーバにしたいマシンの管理者メールアドレス

  4. 署名された証明書。

    CA 機関から送られてきた署名済証明書を、 利用したい SSL アプリケーションに組み込めば、 SSL 通信が使用できる様になるはずです。

    参考までに Apache + mod_ssl での設定方法を記述します。 httpd.conf の以下のエントリを設定します。
    エントリ名
    < IfDefine SSL > SSL を利用したい時の設定開始合図
    < VirtualHost _default_:443 > 同じホスト名で https プロトコル(SSL通信)を利用する際の設定開始合図
    SSLEngine on
    SSLCertificateFile /usr/local/ssl/certs/httpd-cer.pem
    CA 機関に署名してもらった証明書のファイル。 CA 機関へ CSR (csr.pem) を送付後、折り返し送られてきているハズ。
    SSLCertificateKeyFile /usr/local/openssl/private/private.pem
    SSLVerifyClient none
    SSLVerifyDepth 10
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
    < /VirtualHost > 対応する開始合図の終了宣言
    < Directory "/usr/local/htdocs/secret" > ディレクトリ毎の設定
    SSLRequireSSL /usr/local/htdocs/secret ディレクトリ以下は SSL 通信を要求する設定
    < /Directory > ディレクトリ毎の設定終了宣言
    詳細は、 mod_ssl や、 Apache の Web サイトを参照してください。


Copyright (c) 1999-2000 by Takashi TANI
takashi@deathsdoor.com
1