Edit
CA局とは

SSL通信や暗号署名などを行う場合に、サーバの証明や署名の証明を行うための機関であり、通常はVerisignなどのセキュリティ大手がサービスしており、IEやFirefoxなどの一般のブラウザに、それらの会社のルート証明書が信頼できる証明書として登録されているため、多くの会社では費用を払って証明を受けている。 ここを参照するとより詳しい仕組みについて理解できると思われる。

Edit
ルートCAの作成

CA(Certification Authority:認証局)の設定には、最初にOpenSSLがインストールされていることが必要であり、OpenSSLの導入については、Server/Security/OpenSSL?を参照し、導入した事を前提とする。

Edit
OpenSSLの設定ファイルの作成

最初に、OpenSSLのインストールされた、/usr/local/ssl に移動し、フォルダには bin misc include man lib などのフォルダが作成された事を確認。その後、自分が使うスクリプトをコピーする。

# cd /usr/local/ssl
# cp /usr/local/ssl/misc/CA.sh .

Edit
CA.shの修正

コピーが終了し、自分で修正できる環境になったら、CA.shを自分の環境に合わせて修正する。

# emacs CA.sh
   CATOP=/usr/local/ssl/CA
   CAKEY=ca.key
   CAREQ=ca.csr
   CACERT=ca.crt

Edit
openssl.cnfの修正

OpenSSLの設定ファイルは、openssl.confというものがありここに必要な設定を記述する。

# emacs /usr/local/ssl/openssl.cnf
 #
 HOME                            = .
 RANDFILE                        = $ENV::HOME/.rnd
 oid_section                     = new_oids
 [ new_oids ]
 #--- CA設定 ------------------------------------------------------#  
 [ ca ]
 default_ca       = CA_default        # 初期値のCAセクションを下記で指定
 
 [ CA_default ]
 dir              = ./CA              # CAのホームディレクトリ設定
 certs            = $dir/certs        # 証明書を保管する場所
 crl_dir          = $dir/crl          # 失効リスト(CRL)を置く場所
 database         = $dir/index.txt    # シリアルと発行した証明書のインデックス
 new_certs_dir    = $dir              # 自分が発行した新証明書のフォルダ
 certificate      = $dir/ca.crt       # CAの証明書
 serial           = $dir/serial       # 次に発行する証明書の番号
 crl              = $dir/crl.pem      # 自分で失効した証明書のCRL
 private_key      = $dir/ca.key       # CAの秘密鍵
 RANDFILE         = $dir/.rand        # デフォルトのランダムファイル
 x509_extensions  = usr_cert          # x509のv3拡張を下記に定義
 default_days     = 365               # 証明書の有効期限
 default_crl_days = 7                 # CRLの収集間隔
 default_md       = sha1              # sha1が一般的だがmd5を選択可能
 preserve         = no                # 古いIEのためのオプション
 policy           = policy_match      # 発行ポリシーは下記の設定を利用
 
 [ policy_match ]
# matchはCAのものと一致、optionalは任意(空欄可)、suppliedは空欄不可
# CSR作成時にmatchのものはCAのものと一致させる必要があります
 countryName            = match       # 国名
 organizationName       = supplied    # 組織名
 stateOrProvinceName    = supplied    # 県名
 localityName           = supplied    # 市の名称
 organizationalUnitName = optional    # 組織の部署名
 commonName             = supplied    # 一般名
 emailAddress           = optional    # e-mailアドレス
 
#--- 証明書要求書の設定 -------------------------------------#
 [ req ]
# 証明書発行要求(CSR)に関する初期値設定
 default_bits           = 2048             # 公開鍵の鍵長
 default_keyfile        = ca.key           # キー指定しない時の初期秘密鍵
 distinguished_name     = req_dist_name    # 下記に詳細を設定
 default_md             = sha1             # 初期通信符号の設定
 x509_extensions        = v3_ca            # 自己署名はv3_caを参照
 string_mask            = nombstr          # 2バイト文字禁止
 
 [ req_dist_name ]
# Distinguished Nameの詳細設定領域
 countryName                     = Country Name (2 letter code)
 countryName_default             = JP
 countryName_min                 = 2
 countryName_max                 = 2
 stateOrProvinceName             = State or Province Name (full name)
 stateOrProvinceName_default     = Tokyo
 localityName                    = City name (full name)
 localityName_default            = Kashiwa-city
 organizationName                = Organization Name (eg, company)
 organizationName_default        = Gamvaro
 organizationalUnitName          = Organizational Unit Name (eg, section)
 organizationalUnitName_default  = sales
 commonName                      = Domain Name (when CA, It is Company name)
 commonName_max                  = 64
 emailAddress                    = Email Address
 emailAddress_max                = 40
 
 #--- CAを設置する場合 ---#
 [ usr_cert ]
 basicConstraints                = CA:true
 subjectKeyIdentifier            = hash
 authorityKeyIdentifier          = keyid:always,issuer:always
 nsCertType                      = sslCA, emailCA
# keyUsage                        = cRLSign, KeyCertSign
 #--- 通常のサーバ用の証明書を作成する場合 ---#
 [ usr_cert ]
 #basicConstraints                = CA:false
 #nsCertType                      = server, client
# 証明書のタイプは、server, client, email, objsign が組み合わせ利用可能
 
 [ v3_ca ]
 basicConstraints        = CA:true             # CAの証明書を発行時はTRUE
 subjectKeyIdentifier    = hash
 authorityKeyIdentifier  = keyid:always,issuer:always
  
#--- KeyUsage の選択できる引数 ---------------------------#
# digitalSignature        デジタル署名
# nonRepudiation          否認防止
# keyEncipherment         鍵配布
# dataEncipherment        データ暗号化
# keyAgreement            鍵の検証
# keyCertSign             鍵署名
# cRLSign                 証明書失効リスト(CRL)の検証
# encipherOnly            暗号化のみ
# decipherOnly            復号化のみ
  1. ※CRL ver2を利用しないので、crl_extensions指定は行っていない。通常V1のフォーマットで十分と考えられる為。(ブラウザの対応も少ない)
  2. ここでは、特に必要がわからずReqのattributes設定もしていない。

Edit
参考リンク

Edit
CA証明書(ルート証明書)の作成

# cd /usr/local/ssl/CA
# ./CA.sh -newca
  ( openssl req -new -x509 -keyout ca.key -out ca.crt -days 3650 と同じ)
  最初に、エンターを押して新規作成を選び、次に4文字以上のパスを入力
  その後必要パラメータを入力して、無事に作成
# openssl x509 -text -in ca.crt    <- 出来上がったファイルの確認

CA用のキーからパスフレーズを削除(ここで1回入力すれば後に不要)

# openssl rsa -in ca.key -out ca.key

CRTファイル(ca.crt)をバイナリ形式であるDER(ca.der)に変更する。

# openssl x509 -in ca.crt -outform DER -out ca.der

Edit
WEBページにルート証明書を設置(本当は手渡しがベター)

作成したルートCRT(証明書ファイル)をWEBブラウザが閲覧できる場所において、アクセスする人がダウンロードできるように設定する。

# cp ca.crt /usr/local/apache2/htdocs/ca.crt

その後、このアクセスアドレスを公開して、ブラウザでアクセスしてもらい、証明書をインストールしてもらう必要がある。

Edit
作成されたCAでWEBの証明書を発行する

Edit
証明書(CRT)ファイルの作成

作成された csr ファイルを元に署名された形の crt ファイルを作成します。

# openssl ca -in server.csr -out server.crt 
  ( openssl x509 -in server.csr -out server.crt -req -signkey cakey.pem)不明
# chmod 400 server.crt  (安全のため権限を制限)
# openssl x509 -in server.crt -text -noout (出来上がったファイルの中身をみる)

これで、CRTファイル"server.crt"が作成されます。

以前発行した証明書要求が失効されていない状態で、再度、証明書の発行を行なうと以下のエラーメッセージが出力される。

failed to update database
TXT_DB error number 2

この場合は、失効手続きを一度行ってから再発行を行う。

Edit
発行した証明書を失効させる。

失効させたい証明である、server.crt(x509)のあるフォルダに移動する。その後、下記のコマンドを実行する。

# openssl ca -gencrl -revoke server.crt -out /usr/local/ssl/CA/ca.crl

Edit
ファイル形式の説明

PEM(Privacy Enhanced Mail)テキスト形式による証明書データ
DER(Distinguished Encoding Rules)ブラウザに組み込まれる証明書(バイナリ)
CSR(Crtificate Signing Request)証明書の署名要求ファイル
CRT署名済みの証明書(当サイトでは、自己証明を行います)

Edit
参考リンク

http://www.linux.or.jp/JF/JFdocs/SSL-Certificates-HOWTO/x169.html
http://www.daily-labo.com/opensslcnf.txt