OpenSSL で認証局
オレオレ認証局の操作メモ.手元でテスト用途にサーバ証明書とか作る時のメモです.
- /var/ssl 以下にファイルを置く
- Plamo-5.0
準備
- ディレクトリとファイルコピー
# 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.cnf は openssl のサブコマンド (?) の req または ca または x509 で使用される.直接コマンドラインのオプションとして各種の値を与えることも可能だが,非常に多数指定しないといけないので,あらかじめ指定しておこうというもの.(但し x509 の extension の部分は設定ファイルに書いておかないとだめかな)
設定ファイルの構造
openssl の設定ファイルの構造は,
- セクション
- キー
- 値
からなる.
[section] key = value
という風に書かれる.セクション名とキーには空白は含むことは出来ない.value にはセクション名を書く.つまりあるキーの値に複数のキーと値のペアの集合体を指定できる.
設定ファイルは先頭から順に読まれる.
詳しくは config(5) 参照.
実際の設定
- まずはグローバルセクション.セクションの指定がない場合,全体に有効なグローバルセクションとなる.次のセクションが現れるまでが一つのセクションとなるので,当然グローバルセクションはファイルの最初になければいけない.
HOME = /var/ssl # 乱数の seed の読み書きに使うファイル RANDFILE = $ENV::HOME/.rnd
- まずは ca コマンドを実行したときに読み込まれる設定の設定.以下だと “CA_default” というセクションの内容が使われる.
[ ca ] default_ca = CA_default
- で引き続きその “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 のうち
- countryName と organizationName が CA のそれとマッチしている必要がある
- commonNameとemailAddress は何か指定されている必要がある
- stateOrProvinceName と organizationUnitName の指定はオプション
- 続いて req コマンド関係の設定.
[ req ] default_bits = 1024 # デフォルトのキー長 default_keyfile = privkey.pem # デフォルトの秘密鍵ファイル名 distinguished_name = req_distinguished_name # DN についての設定のある section 名 x509_extensions = v3_ca # 自己署名の際のエクステンションの設定のある section string_mask = nombstr # ??
- DN (distinguish name) の指定の際の設定.req コマンドを実行したときのプロンプトやデフォルト値や値の長さについて設定する.設定内容については見ての通り.
[ 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
- 次にエクステンション関係の設定.まずは usr_cert として,一般ユーザ向けの証明書のエクステンションを指定.この辺りはソースに付属の doc/openssl.txt に記述がある.フォーマットは
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
- 共通で出てくるものを簡単に.
- basicConstraints … この cA が TRUE だったら Subject が CA であることを示す.その時のパスの深さ(pathLenConstraint) を “pathlen:1” のように指定可能.
- keyUsage … 鍵の用途
- extendedKeyUsage … 鍵用途エクステンション・フィールド中に示されている基本目的に追加されるか置き換わる鍵用途
- subjectKeyIdentifier … Subject Key Identifier
- authorityKeyIdentifier … 証明書の署名に使用される秘密鍵に対応する公開鍵を識別する手段を提供
- crlDistributionPoints … CRLの取得方法
- サーバ用証明書のエクステンション関係の設定.
[ 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 用エクステンションの設定.
[ crl_ext ] authorityKeyIdentifier=keyid:always,issuer:always
証明書の発行
CA の秘密鍵,証明書の生成
自己署名の証明書は以下のように生成可能.
# openssl req -config /var/ssl/openssl.cnf -new -newkey rsa:2048 -x509 -keyout private/cakey.pem -out cacert.pem (cakey.pem: 秘密鍵, cacert.pem: 証明書)
CSR (Certificate Signing Request)
これはユーザ側で生成する場合もあるし,CA 側で生成する場合もある.
$ openssl req -new -newkey rsa:1024 -keyout key.pem \ -out req.pem -config /var/ssl/openssl.cnf (req.pem: 生成するCSR, key.pem: 生成する秘密鍵)
CAによる署名
# openssl ca -config /var/ssl/OreOre/openssl.cnf \ -in req.pem -out cert.pem (req.pem: CSR, cert.pem: 生成する証明書)