オレオレ認証局の操作メモ.手元でテスト用途にサーバ証明書とか作る時のメモです.
# mkdir /var/ssl # cd /var/ssl # cp /etc/ssl/openssl.cnf . # touch index.txt # echo "00" > serial # mkdir certs crl private newcerts
インストールは既に済んでいるので認証局として運営を開始するには以下が必要.
openssl.cnf は openssl のサブコマンド (?) の req または ca または x509 で使用される.直接コマンドラインのオプションとして各種の値を与えることも可能だが,非常に多数指定しないといけないので,あらかじめ指定しておこうというもの.(但し x509 の extension の部分は設定ファイルに書いておかないとだめかな)
openssl の設定ファイルの構造は,
からなる.
[section] key = value
という風に書かれる.セクション名とキーには空白は含むことは出来ない.value にはセクション名を書く.つまりあるキーの値に複数のキーと値のペアの集合体を指定できる.
設定ファイルは先頭から順に読まれる.
詳しくは config(5) 参照.
HOME = /var/ssl # 乱数の seed の読み書きに使うファイル RANDFILE = $ENV::HOME/.rnd
[ ca ] default_ca = CA_default
[ CA_default ] dir = /var/ssl/ # 以下で使うための定義 certs = $dir/certs # ?? crl_dir = $dir/crl # CRL を保存する場所 database = $dir/index.txt # 証明書発行のデータベース new_certs_dir = $dir/newcerts # Issue した証明書が置かれる場所 certificate = $dir/cacert.pem # CA の証明書 serial = $dir/serial # シリアル番号を保存するファイル crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# CA の秘密鍵 RANDFILE = $dir/private/.rand # private random number file x509_extensions = usr_cert # Issue する証明書に付加する # エクステンション(のsection名) crl_extensions = crl_ext # CRL のエクステンション default_days = 365 # Issue する証明書の有効期間 default_crl_days= 30 # 次の CRL が出るまでの期間 default_md = md5 # which md to use. preserve = no # -preserveDN オプションと同じ policy = policy_match # 証明書発行リクエストが満たすべき # ポリシー (が指定されたsection名)
[ policy_match ] countryName = match stateOrProvinceName = optional organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = supplied
以上だと dn のうち
[ req ] default_bits = 1024 # デフォルトのキー長 default_keyfile = privkey.pem # デフォルトの秘密鍵ファイル名 distinguished_name = req_distinguished_name # DN についての設定のある section 名 x509_extensions = v3_ca # 自己署名の際のエクステンションの設定のある section string_mask = nombstr # ??
[ req_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 = localityName = Locality Name (eg, city) localityName_default = 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Example organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (eg, YOUR name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 40
extension_name=[critical,] extension_options
というもの.エクステンションの各項目は RFC3280 を参照 (この RFC に置き換わる前の RFC2459 なら日本語訳あり).
[ usr_cert ] basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = clientAuth,emailProtection subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always crlDistributionPoints = URI:http://dublin.harp.gr.jp/ca/crl.pem # 以下は Netscape 関係のエクステンション (不要かも?) nsCertType = client, email nsComment = "Ireland Circle" nsCaRevocationUrl = http://example.jp/ca/crl.pem
[ server_cert ] basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always
[ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always basicConstraints = CA:true keyUsage = cRLSign, keyCertSign # Netscape 用 (不要かも?) nsCertType = sslCA, emailCA
[ crl_ext ] authorityKeyIdentifier=keyid:always,issuer:always
自己署名の証明書は以下のように生成可能.
# openssl req -config /var/ssl/openssl.cnf -new -newkey rsa:2048 -x509 -keyout private/cakey.pem -out cacert.pem (cakey.pem: 秘密鍵, cacert.pem: 証明書)
これはユーザ側で生成する場合もあるし,CA 側で生成する場合もある.
$ openssl req -new -newkey rsa:1024 -keyout key.pem \ -out req.pem -config /var/ssl/openssl.cnf (req.pem: 生成するCSR, key.pem: 生成する秘密鍵)
# openssl ca -config /var/ssl/OreOre/openssl.cnf \ -in req.pem -out cert.pem (req.pem: CSR, cert.pem: 生成する証明書)