SSL用証明書の作成(Windows編)


Windows環境でopensslによる各種の鍵や証明書の発行について整理しました。 Linux系は結構いろいろなサイトで紹介されていますが、Windowsについては環境が異なることからなかなかそのままではうまくいきません。おやじも何度かトライしては失敗してきたので、ここで整理しておくことにしました。今回は、たまたまBBSでクライアント証明書に関する話題もあがっていたので、それについても整理しました。
その後、初めに整理した方法ではクライアントがInternetExploreでは問題ないが、Netscape ではうまくインストールできないことが判明しました。また、万が一の場合の証明書の失効処理も配布されているopensslのバイナリにバグがあり、index.txtが壊れるという問題がありうまくできないことが判明しました。いろいろ探し回ったのですが、最新のバイナリがどうしても見つからなかったので、とりあえず最新のsnapshotでは対策されているとのことで、Msys + MinGW でWindows用バイナリを作り直し、証明書の作成方法を全面的に見直しました。Apacheでの証明書の使い方クライアントへのインストール方法はそれぞれのコンテンツを参照してください。
なお、動作確認はWindows XP SP2で行っています。

■事前準備

まずは、opensslのインストールです。
Apache+SSL for Win32と同じ版数のWin32 OpenSSLをおやじのところからダウンロードしてきて、インストールします。インストール作業前に、既にOpensslがインストールされている場合は、「アプリケーションの追加と削除」でアンインストールしてください。
OpenSSL 0.9.7dで問題があったため、おやじのところでコンパイルして配布していましたが、その後は問題がないようなので本家からダウンロードしてきてインストールしてください。OpenSSL 0.9.7f以降は特段の理由がない限り配布は中止します。本家のものは、インストールするだけで、下記の1から3項までは終了するはずです。
  1. ダウンロードしたファイルを適当な場所で解凍する。解凍すると、「OpenSSL-x.x.x-win32.EXE」というファイルができるので、これを実行する。デフォルトでは、C:\ドライブに解凍されてC:\OpenSSL にインストールされるが、システムドライブが異なる場合は、適宜変更してシステムドライブにインストールする。(ex. D:\OpenSSL )

  2. OpensslのバージョンがApache+SSL for Win32と同じであれば問題ないと思うが、opensslを起動するとエラーがでる場合は、同梱してある libeay32.dllとssleay32.dllを C:\WINNT\system32内にコピーしてみる。

  3. OpenSSLへのPATHを設定する。

    1. 「スタート」->「設定」->「コントトロールパネル」でコントロールパネルを開き、「システム」を開く。
    2. 「詳細タブ」->「環境変数」で環境変数のパネルを開く。
    3. 下の「システム環境変数」の「Path」を選択し、「編集」ボタンを押す。
    4. 「変数値」の一番最後に、「;C:\OpenSSL\bin」(頭のセミコロンを忘れずに)とコマンドがあるディレクトリを追加して、「OK」を押す。
    5. 続けてopenssl.cnfのパスを追加する。「システム環境変数」の「新規」ボタンを押し、「変数名」に「OPENSSL_CONF」を、「変数値」に「C:\OpenSSL\bin\openssl.cnf」と入力し、「OK」を押す。
    6. 後は、「OK」を2回押してシステムを閉じ、Windowsを再起動する。

  4. アプリケーションの関連付けを行う。

    ここからの作業で、opensslに付属しているCA.plというスクリプトを使用するが、「.pl」がperlに関連付けられていないと非常に作業しづらいので、関連付けを行う。

    1. エクスプローラで、「C:\OpenSSL\bin」フォルダを開き、「CA.pl」ファイルを選択する。
    2. [ファイル] メニューの [プロパティ] をクリックし、「アプリケーション」が「Perl Command Line Interpreter」になっているか確認し、あっていれば「OK」で閉じる。
    3. 異なる場合は、[変更] をクリックし、ファイルを開くプログラムの名前の中から、「Perl Command Line Interpreter」を選択してクリックする。表示されていないプログラムを選択する場合は、[その他] をクリックし、perl のインストールパスから、perl.exe を選択して関連付けを行う。
その後、認証の大元であるプライベートCA、ApacheでSSLを動かすためのサーバ証明書とブラウザへのインストール用derファイル作成します。
単にSSLでのWebアクセスならここまでの対応で可能ですが、更に厳密なSSL運用として、ApacheではあらかじめCAで認証したクライアント証明書がないとアクセスを許可しない方法も可能です。この運用には、更にクライアント証明書が必要になりますので、これをユーザごとに作成します。また、このような運用の場合、万が一証明書が紛失したときのサーバ側での証明書の失効手続きについても示します。

■プライベートCAの作成

まず、認証の大元となる認証局(CA)を作成します。

◆事前準備

これからの作業の準備として、openssl.cnfの設定を行うとともに、作業用ディレクトリを作成します。

  1. 適当なテキストエディタ(openssl.cnfは改行コードがLFのため、Windowsのメモ帳では扱えない。おやじはフリーのTerapadを使わせてもらっている。)で、インストールしたC:\OpenSSL\bin配下にあるopenssl.cnfを以下のように修正する。なお、openssl.cnfは、Windows環境ではエクスプローラでは、拡張子のない短縮ダイヤルのファイル(opensslとしか見えない。)として表示されて開くことができないので、エディタを開いてから、ファイルを指定して開くようにする。

    [ CA_default ]

       ( snip )

    # クライアント証明書発行時に履歴として発行証明書を残すため、
    # コメントアウトを外し設定を変更する。

    #unique_subject = no # Set to 'no' to allow creation of
                         # several ctificates with same subject.
    unique_subject =yes

       ( snip )

    # クライアント証明書失効処理時にエラーが出るため、コメントアウトを外し
    # crlnumberを作成しておく。

    #crlnumber = $dir/crlnumber # the current crl number must be
                                # commented out to leave a V1 CRL
    crlnumber = $dir/crlnumber

       ( snip )


    [ usr_cert ]

       ( snip )

    # 最初にサーバ証明書を作成するため、「nsCertType」を「server」
    # とするため、コメントアウトを外して有効にする。

    # This is OK for an SSL server.
    # nsCertType = server
    nsCertType = server

       ( snip )


    [ v3_ca ]

       ( snip )

    # CA証明書作成時の証明書のタイプをSSL/E-mail用と指定するため、
    #「nsCertType」を「sslCA, emailCA」とするため、コメントアウトを外して有効にする。

    # Some might want this also
    # nsCertType = sslCA, emailCA
    nsCertType = sslCA, emailCA

  2. 各証明書の有効期限を変更したい場合は、CA.pl内の下記のパラメータを変更する。(0.9.8xの場合)

    1. CA証明書

      CA証明書の有効期限は、$CADAYSの値を変更すればよい。


         ( snip )

      $SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"};
      $DAYS="-days 365";    # 1 year
      $CADAYS="-days 1095"; # 3 years

         ( snip )


    2. サーバ証明書等

      サーバ証明書等の有効期限は$DAYSを変更しただけでは駄目である。変更方法としては、以下の2つの方法がある。

      [方法1]
       CA.pl内の135/138/143行のsystemに下記のように$DAYSを追記し、$DAYSパラメータの値を変更する方法。


         ( snip )

      $SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"};
      $DAYS="-days
      1095";    # 1 year
      $CADAYS="-days 1095"; # 3 years

         ( snip )
      } elsif (/^-xsign$/) {
         system ("$CA
      $DAYS -policy policy_anything -infiles newreq.pem");
         $RET=$?;
      } elsif (/^(-sign|-signreq)$/) {
         system ("$CA $DAYS -policy policy_anything -out newcert.pem " .
            "-infiles newreq.pem");
         $RET=$?;
         print "Signed certificate is in newcert.pem\n";
      } elsif (/^(-signCA)$/) {
         system ("$CA $DAYS -policy policy_anything -out newcert.pem " .
            "-extensions v3_ca -infiles newreq.pem");
         $RET=$?;
         print "Signed CA certificate is in newcert.pem\n";

         ( snip )


      [方法2]
       CA.plはそのままにして、openssl.confのdefault_daysを変更する方法。CA.plの-signではデフォルトでは-daysの指定が無いので、openssl.confのdefault_daysで指定した値が適用される。


         ( snip )

      default_days =
      1095

         ( snip )


  3. 続いて、各種証明書等を作成する際の作業用ディレクトリを作成する。ここでは、C:\etc配下で作業することとする。コマンドプロンプトを起動し、以下のようにしてC:\etcディレクトリを作成しておく。

    C:\Documents and Settings\oyaji>md C:\etc

◆CA用秘密鍵(cakey.pem)とCA用証明書(cacert.pem)の作成

事前準備で作成した作業用ディレクトリに移動し、プライベートCA用の秘密鍵と証明書をCA.plを使用して作成する。

C:\Documents and Settings\oyaji>cd C:\etc
C:\etc>CA.pl -newca
CA certificate filename (or enter to create)
[Enter]のみを入力
Making CA certificate ...
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
.....++++++
..........................................................++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:xxxxx[Enter]        ← CA用パスフレーズ入力(画面上何も変化はないが処理されている)
Verifying - Enter PEM pass phrase:xxxxx[Enter] ← CA用パスフレーズ再入力
-----
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[Enter] (国コード)
State or Province Name (full name) [Some-State]:Tokyo[Enter] (都道府県名)
Locality Name (eg, city) []:Edogawa[Enter] (市町村名)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Private_CA[Enter] (組織名)
Organizational Unit Name (eg, section) []:Admin[Enter] (組織内ユニット名)
Common Name (eg, YOUR name) []:Private_CA[Enter] (組織/サーバ名)
Email Address []:oyaji@mail.aconus.com[Enter] (管理者メールアドレス)

------------------------以下は0.9.8xの場合--------------------------------

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:[Enter]のみを入力
An optional company name []:[Enter]のみを入力
Using configuration from C:\OpenSSL\bin\openssl.cnf
Loading 'screen' into random state - done
Enter pass phrase for ./demoCA/private/cakey.pem:xxxxx[Enter] ← CA用パスフレーズ入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            c3:3d:7e:45:d2:26:16:34
        Validity
            Not Before: May 22 02:45:32 2006 GMT
            Not After : May 21 02:45:32 2009 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = Private_CA
            organizationalUnitName    = Admin
            commonName                = Private_CA
            emailAddress              = oyaji@mail.aconus.com
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                AF:D2:B0:12:70:7B:0F:F4:84:49:FC:BD:1C:72:E1:D5:B0:74:2A:F6
            X509v3 Authority Key Identifier:
                keyid:AF:D2:B0:12:70:7B:0F:F4:84:49:FC:BD:1C:72:E1:D5:B0:74:2A:F6
                DirName:/C=JP/ST=Tokyo/O=Private_CA/OU=Admin/CN=Private_CA/emailAddress=oyaji@mail.aconus.com
                serial:C3:3D:7E:45:D2:26:16:34

            X509v3 Basic Constraints:
                CA:TRUE
            Netscape Cert Type:
                SSL CA, S/MIME CA
Certificate is to be certified until May 21 02:45:32 2009 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated


この作業で以下のようなディレクトリ・ファイルが作成されるので、確認しておく。


   etc [ ルートディレクトリ ]
    |
    ├ demoCA [ 各種証明書等のルートディレクトリ ]
    | |
    | ├ certs [ 証明書等のディレクトリ(バックアップに利用) ]
    | |
    | ├ newcerts [ クライアント証明書(sireal追番)のディレクトリ ]
    | |  |
    | |  ├ xxxxx..pem [ クライアント証明書 ]
    | |  |    :
    | |  └ xxxxx..pem [ クライアント証明書 ]
    | |
    | ├ private [ CA用の秘密鍵用ディレクトリ ]
    | |  |
    | |  └ cakey.pem [ CA用の秘密鍵 ]
    | |
    | ├ cacert.pem [ CA用の証明書 ]
    | ├ index.txt     [ クライアント証明書用DB ]
    | └ serial [ クライアント証明書用シリアル ]
    |
    └ .rnd [ 乱数ファイル ]


◆サーバ用CA証明書の作成(0.9.8xの場合)

0.9.8xの場合、サーバで使用するためには下記の操作でCA証明書(cacert.crt)だけを切り出しておく。0.9.7xの場合は、cacert.pemのまま使用できる。

C:\etc>openssl x509 -in ./demoCA/cacert.pem -out ./demoCA/cacert.crt


◆CA証明書をブラウザにインポートするためのca.derファイルの作成

CA証明書をブラウザにインポートするためのderファイルを、以下で作成する。このca.derファイルをこちらの手順でブラウザにインポートする。

C:\etc>openssl x509 -inform pem -in ./demoCA/cacert.pem -outform der -out ./demoCA/ca.der


■サーバ用証明書の作成

続いて、Apache用のサーバ証明書を作成します。
[注意]: サーバ証明書を作成する場合、CA証明書とサーバ証明書のON(Organization Name)は、異なる名称にしないとうまく動作しないので注意が必要です。

◆サーバ用証明書作成用リクエストファイル(newreq.pem)の作成

ここでは、CAに送るデジタル証明書のリクエストファイルを作成する。なお、サーバ用秘密鍵のまま、SSL起動すると起動するたびにパスフレーズの入力が必要であり、セキュリティ上は好ましくありませんが、停電からの自動再起動時等は起動できなくなりますので、秘密鍵からパスフレーズを入れないよう、「-nodes」で作成します。というより、Windows版Apacheではパスフレーズが必要な状態では起動できません。
ここで作成される「newkey.pem」がサーバ用の秘密鍵なので、Apache等で使用する場合(SSLCertificateKeyFileで指定するファイル)はこれを使用すればよい。(Apacheの説明で使用している server.key は ここでいう newkey.pem のこと。即ち server.key = newkey.pem)

C:\etc>CA.pl -newreq-nodes
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
.........++++++
..............++++++
writing new private key to 'newkey.pem'
-----
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[Enter] (国コード)
State or Province Name (full name) Some-State]:
Tokyo[Enter] (都道府県名)
Locality Name (eg, city) []:
Edogawa[Enter] (市町村名)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
aconus.com[Enter] (組織名)
Organizational Unit Name (eg, section) []:
Admin[Enter] (組織内ユニット名)
Common Name (eg, YOUR name) []:
www.aconus.com[Enter] (ホスト名:*)
Email Address []:
oyaji@mail.aconus.com[Enter] (管理者メールアドレス)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
[Enter]        ← Enterのみ入力
An optional company name []:
[Enter]      ← Enterのみ入力
Request is in newreq.pem, private key is in newkey.pem

      *: ここのホスト名は、必ずhttps://・・・・でアクセスするホスト名とすること。

◆サーバ用証明書(server.crt)の作成

認証局の証明書とキーを使って、リクエストファイルからX.509サーバ証明書の作成と署名を行う。
C:\etc>CA.pl -sign
Using configuration from C:\OpenSSL\bin\openssl.cnf
Loading 'screen' into random state - done
Enter pass phrase for ./demoCA/private/cakey.pem:xxxxx[Enter]  ← CA用パスフレーズ入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            c3:3d:7e:45:d2:26:16:35
        Validity
            Not Before: May 22 02:52:23 2006 GMT
            Not After : May 22 02:52:23 2007 GMT
        Subject:
            countryName              = JP
            stateOrProvinceName      = Tokyo
            localityName              = Edogawa
            organizationName          = aconus.com
            organizationalUnitName    = Admin
            commonName                = www.aconus.com
            emailAddress              = oyaji@mail.aconus.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                1F:D6:4F:D7:BA:9F:CF:7A:9B:51:6B:DC:ED:58:06:5A:64:3A:2E:E2
            X509v3 Authority Key Identifier:
                keyid:AF:D2:B0:12:70:7B:0F:F4:84:49:FC:BD:1C:72:E1:D5:B0:74:2A:F6

Certificate is to be certified until May 22 02:52:23 2007 GMT (365 days)
Sign the certificate? [y/n]:y[Enter]


1 out of 1 certificate requests certified, commit? [y/n]y[Enter]
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem

サーバで使用するためには下記の操作でサーバ証明書(server.crt)だけを切り出しておく。

C:\etc>openssl x509 -in newcert.pem -out server.crt


◆サーバ用証明書等のバックアップ

できあがった証明書認証局の証明書とキーを使って、リクエストファイルからX.509サーバ証明書の作成と署名を行う。

C:\etc>md server
C:\etc>move *.pem server
C:\etc\newcert.pem
C:\etc\newkey.pem
C:\etc\newreq.pem

C:\etc>move *.crt server
C:\etc\server.crt


■クライアント用証明書の作成

続いて、Apache用のクライアント証明書の作成方法を示しますが、単に通信を暗号化(httpsでのアクセス)するだけなら上記作業だけで十分であり以下の作業は不要です。
このクライアント用証明書によるクライアント認証を導入すると、予め認証局で署名されたクライアント用証明書を持たない端末がアクセスしても、接続そのものが拒否されるのでセキュリティ的にかなり強固になります。反面、クライアント毎に証明書を発行することになるので、運用はかなり面倒になりますが、セキュリティとのバータなので止むを得ません。
このようなクライアント認証は、一般的に企業などで導入されており、具体例としてはwebを使用して外勤の営業マンが社外から社内システムにアクセスできるシステムや株取引のシステムなどに導入されています。このようなシステムの場合、不特定多数にアクセスされるとApacheの認証やアプリ認証だけではセキュリティが甘くなるため、アクセスレベルでセキュリティを強化するためにクライアント認証を導入します。
クライアント証明書使用時のApacheの設定方法については、SSL用設定のページを参照ください。

◆事前準備

openssl.cnfの設定をクライアント証明書発行用に修正します。この作業をしないと、Netscapeにはインストールできません。

[ usr_cert ]

   ( snip )

# サーバ証明書作成用からクライアント証明書用に、「nsCertType」を
#「nsCertType」を 変更する。コメントアウトを外した「server」を削除し、
#「client, email」のコメントアウトを外して有効にする。

# This is OK for an SSL server.
# nsCertType = server 
(元に戻す)

   ( snip )

# For normal client use this is typical
# nsCertType = client, email
nsCertType = client, email

◆クライアント用証明書作成用リクエストファイル(newreq.pem)の作成

ここでは、CAに送るデジタル証明書のリクエストファイルを作成します。

C:\etc>CA.pl -newreq
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
........+++++
......................................+++++
writing new private key to 'newreq.pem'
Enter PEM pass phrase:
xxxxx[Enter]         ← クライアント用パスフレーズ入力
Verifying - Enter PEM pass phrase:
xxxxx[Enter]  ← クライアント用パスフレーズ再入力
-----
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[Enter] (国コード)
State or Province Name (full name) Some-State]:
Tokyo[Enter] (都道府県名)
Locality Name (eg, city) []:
Edogawa[Enter] (市町村名)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
acorn.com[Enter] (組織名)
Organizational Unit Name (eg, section) []:
user[Enter] (組織内ユニット名)
Common Name (eg, YOUR name) []:
oyaji[Enter] (ユーザ名)
Email Address []:
oyaji@mail.aconus.com[Enter] (管理者メールアドレス)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:[Enter]          
← Enterのみ入力
An optional company name []:[Enter]        
← Enterのみ入力

Request (and private key) is in newreq.pem


◆クライアント用証明書(newcert.pem)の作成

認証局の証明書とキーを使って、X.509クライアント証明書の作成と署名を行う。

C:\etc>CA.pl -sign
Using configuration from C:\OpenSSL\bin\openssl.cnf
Loading 'screen' into random state - done
Enter pass phrase for ./demoCA/private/cakey.pem:
xxxxx[Enter]  ← CA用パスフレーズ入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            c3:3d:7e:45:d2:26:16:36
        Validity
            Not Before: May 23 05:28:00 2006 GMT
            Not After : May 23 05:28:00 2007 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            localityName              = Edogawa
            organizationName          = aconus.com
            organizationalUnitName    = user
            commonName                = oyaji
            emailAddress              = oyaji@mail.aconus.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Client, S/MIME
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                3C:85:B0:3B:8C:22:83:81:D1:E6:13:51:DB:BF:45:03:03:75:25:1E
            X509v3 Authority Key Identifier:
                keyid:AF:D2:B0:12:70:7B:0F:F4:84:49:FC:BD:1C:72:E1:D5:B0:74:2A:F6

Certificate is to be certified until May 23 05:28:00 2007 GMT (365 days)
Sign the certificate? [y/n]:y[Enter]


1 out of 1 certificate requests certified, commit? [y/n]y[Enter]
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem

クライアント証明書を発行すると、index.txtに以下のような内容が追加される。クライアントが追加されるたびに、この内容も追加されていく。index.txtは後述する、証明書の失効処理で使用されるデータベースなので、書き換えたりしないよう注意が必要である。配布バイナリでは、バグでこのファイルが破壊されてしまい、失効処理ができずに苦労した。

V 051003025313Z FB4C837477EB7B41 unknown /C=JP/ST=Tokyo/L=Edogawa/O=aconus.com/OU=user/CN=oyaji/emailAddress=oyaji@mail.aconus.com


◆pkcs12形式のクライアント用証明書(oyaji.p12)の作成

鍵と証明書を安全に外部渡す(クライアントに渡す)ために、pkcs12という方法で鍵と証明書をひとつにまとめる。下記ではクライアント用の鍵と証明書に加え、CA証明書も合わせてひとつにまとめることができる。なお、Export用のパスワードは、クライアントでの解凍用に、証明書と同様にクライアントに通知する(同一メールで送るなどということはやめよう)必要がある。「-pkcs12」の後ろには証明書の証明書のフレンドリ名(ここではoyaji)を指定する。
C:\etc>CA.pl -pkcs12 oyaji
Loading 'screen' into random state - done
Enter pass phrase for newkey.pem:xxxxx[Enter]   
← クライアント用パスフレーズ入力
Enter Export Password:
xxxxx[Enter]            ← Export用パスフレーズ入力
Verifying - Enter Export Password:
xxxxx[Enter]    ← Export用パスフレーズ入力
PKCS #12 file is in newcert.p12

 
作成したクライアント証明書(newcert.p12)のクライアントへのインストール方法は、こちらを参照ください。

◆クライアント用証明書等のバックアップ

CA.plを使用して、クライアント証明書を発行するとリクエストファイル(newreq.pem)と証明書(newcert.pem)は発行するたびに書き換えられてしまう。中でも、リクエストファイルは後述するクライアント証明書の失効処理に必要なので、バックアップしておかなければならない。(実際には、./demoCA/newcerts配下にバックされてはいるが、シリアル番号で作成されるため対応付けができない。)
 以下に、バックアップの一例を示すが何らかの方法でクライアントが分かる形でバックアップしておくことが重要である。ここでは、demoCA配下のcertsディレクトリにユーザ毎のディレクトリを作成し、そこにバックアップした。間違えて、連続してクライアントを作成してしまった場合は、画面上からシリアルが分かるはずなので対応が分からなくなる前に、./demoCA/newcerts配下のファイルを対応付けしてバックアップしておくと良いのでは?
 シリアル番号をテキストベースで管理するのも、ひとつの手であるし、一連の作業を自動化してしまうほうが手っ取り早いのでは。

C:\etc>md demoCA\certs\oyaji
C:\etc>move *.pem demoCA\certs\oyaji
C:\etc\newcert.pem
C:\etc\newreq.pem
C:\etc>move *.p12 demoCA\certs\oyaji
C:\etc\oyaji.p12

◆クライアント用証明書の失効処理

クライアント証明書で運用するようなケースでは、セキュリティ管理が重要であり、証明書を紛失したり使用しなくなったりしたら、直ちに失効処理を行い、当該証明書が使用できないようにする必要がある。以下に、失効処理を示すが、ここで作成されたcrl.pem(証明書失効リスト)をApacheに読ませれば(Windowsの場合はApacheの再起動要)、該当証明書を無効化できる。
クライアント証明書を失効させるには、下記で失効処理と失効リスト作成を行う。
失効処理を行うと、index.textは以下のように行頭がRに変わり、失効時間が3番目のパラメータとして追加される。

R 051003025313Z 041003031948Z FB4C837477EB7B41 unknown /C=JP/ST=Tokyo/L=Edogawa/O=aconus.com/OU=user/CN=oyaji/emailAddress=oyaji@mail.aconus.com

C:\etc>openssl ca -gencrl -revoke ./demoCA/certs/oyaji/newcert.pem -out ./demoCA/crl/crl.pem
Using configuration from C:\OpenSSL\bin\openssl.cnf
Loading 'screen' into random state - done
Enter pass phrase for ./demoCA/private/cakey.pem:xxxxx[Enter]   ← CA用パスフレーズ入力
Revoking Certificate C33D7E45D2261637.

Data Base Updated


なお、Apacheで失効処理の設定(crl.pem関係)を行うとApacheガ起動できなくなる(失効クライアントが出るまで設定をしなければ問題はない)ので、その場合は、下記で空の失効ファイルを作成する。但し、これもcrlnumberがないと作成できないので、最低、1ユーザは証明書を作成してから作業すること

C:\etc>openssl ca -gencrl -out ./demoCA/crl/crl.pem
Using configuration from C:\OpenSSL\bin\openssl.cnf
Loading 'screen' into random state - done
Enter pass phrase for ./demoCA/private/cakey.pem:
DEBUG[load_index]: unique_subject = "yes"


◆おまけ

上記のように、クライアント証明書の運用は各人の証明書管理が結構大変である。そこで、openssl0.9.8bのCA.plを改造したスクリプト(CA2.plとでもリネームして使ってください。)を作成してユーザ管理しやすくしてみた。本CA2.plは下記のクライアント証明書関係以外は、改造していないのでそのまま使用できる。
変更したのは、pkcs12でユーザに提供するクライアント証明書の作成と失効処理である。pkcs12でユーザに提供するクライアント証明書を作成すると、証明書をuser名.p12とするとともに、作業ディレクトリ配下に./user/user名というフォルダを作成し作成データをセーブする。作成時に同一ユーザ名のチェックを行っている。

C:\etc>CA2.pl -pkcs12 oyaji
Loading 'screen' into random state - done
Enter pass phrase for newkey.pem:xxxxx[Enter]    ← クライアント用パスフレーズ入力

Enter Export Password:
xxxxx[Enter]            ← Export用パスフレーズ入力
Verifying - Enter Export Password:
xxxxx[Enter]    ← Export用パスフレーズ入力
C:\etc\newcert.pem
C:\etc\newkey.pem
C:\etc\newreq.pem
C:\etc\oyaji.p12
PKCS #12 file is in oyaji.p12
失効処理も面倒なので、revokeオプションを追加した。上記pkcs12でクライアント証明書を作成したことが前提となり、user名を指定することで失効処理と失効リストの更新を行う。
C:\etc>CA2.pl -revoke oyaji
Using configuration from C:\OpenSSL\bin\openssl.cnf
Loading 'screen' into random state - done
Enter pass phrase for ./demoCA/private/cakey.pem:xxxxx[Enter]   ← CA用パスフレーズ入力
Revoking Certificate C33D7E45D2261637.
Data Base Updated



Top Pageへ