security:opensslで認証局

OpenSSL で認証局

オレオレ認証局の操作メモ.手元でテスト用途にサーバ証明書とか作る時のメモです.

  • /var/ssl 以下にファイルを置く
  • Plamo-5.0
  1. ディレクトリとファイルコピー
    # 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) 参照.

実際の設定

  1. まずはグローバルセクション.セクションの指定がない場合,全体に有効なグローバルセクションとなる.次のセクションが現れるまでが一つのセクションとなるので,当然グローバルセクションはファイルの最初になければいけない.
    HOME                    = /var/ssl
    # 乱数の seed の読み書きに使うファイル
    RANDFILE                = $ENV::HOME/.rnd
  2. まずは ca コマンドを実行したときに読み込まれる設定の設定.以下だと “CA_default” というセクションの内容が使われる.
    [ ca ]
    default_ca      = CA_default
  3. で引き続きその “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名)
  4. 引き続きポリシーの設定.
      [ policy_match ]
    countryName             = match
    stateOrProvinceName     = optional
    organizationName        = match
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = supplied

    以上だと dn のうち

    • countryName と organizationName が CA のそれとマッチしている必要がある
    • commonNameとemailAddress は何か指定されている必要がある
    • stateOrProvinceName と organizationUnitName の指定はオプション
  5. 続いて req コマンド関係の設定.
    [ req ]
    default_bits            = 1024          # デフォルトのキー長
    default_keyfile         = privkey.pem   # デフォルトの秘密鍵ファイル名
    distinguished_name      = req_distinguished_name
                                            # DN についての設定のある section 名
    x509_extensions = v3_ca # 自己署名の際のエクステンションの設定のある section
    string_mask = nombstr                   # ??
  6. 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
  7. 次にエクステンション関係の設定.まずは 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の取得方法
  8. サーバ用証明書のエクステンション関係の設定.
    [ server_cert ]
    basicConstraints                = CA:FALSE
    keyUsage                        = digitalSignature, keyEncipherment
    extendedKeyUsage                = serverAuth
    subjectKeyIdentifier            = hash
    authorityKeyIdentifier          = keyid,issuer:always
  9. 自己署名の証明書のエクステンションの設定.
    [ v3_ca ]
    subjectKeyIdentifier            = hash
    authorityKeyIdentifier          = keyid:always,issuer:always
    basicConstraints                = CA:true
    keyUsage                        = cRLSign, keyCertSign
    
    # Netscape 用 (不要かも?)
    nsCertType = sslCA, emailCA
  10. CRL 用エクステンションの設定.
    [ 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: 生成する証明書)
  • security/opensslで認証局.txt
  • 最終更新: 2013/04/12 07:46
  • by tenforward