認証局(CA)構築

ここでは、認証局に必要な秘密鍵とルート証明書を作成します。

openssl のインストール

つぎのコマンドを実行してopensslをインストールします。

aptitude install openssl

設定ファイル (openssl_ca.cnf) 作成

証明書生成のための作業用ディレクトリに、デフォルトの設定ファイル /etc/ssl/openssl.cnf をコピーして次に示すように編集していきます。

  1. ディレクトリ変更
    [ CA_default ]
    
    # <変更>  出力先ディレクトリを変更
    #* dir		= ./demoCA		# Where everything is kept
    dir             = RootCA
  2. 署名時のポリシー変更
    # <変更>  署名時のポリシーを変更
    # 都道府県名指定なしのルート証明書とするため、
    # stateOrProvinceName を optional に変更する。
    #
    # [備考]
    #  match    : CAと一緒
    #  supplied : 当該項目が設定されている
    #  optional : オプション(設定なし, 不一致でも問題ならない)
    #
    # For the CA policy
    [ policy_match ]
    countryName		= match
    #* stateOrProvinceName	= match
    stateOrProvinceName	= optional
    organizationName	= match
    organizationalUnitName	= optional
    commonName		= supplied
    emailAddress		= optional
  3. 失効リストURL設定
    [ usr_cert ]
    
    ~(省略)~
    
    # <変更> (追加) 失効リストのURLを設定する。
    crlDistributionPoints = URL:http://ehobby.jp/ca/latestcrl.crl
    
    ~(省略)~
    
    [ v3_ca ]
    
    ~(省略)~
    
    # <変更> (追加) 失効リストのURLを設定する。
    # ※署名時のオプション -extensions v3_ca 指定により、
    #   署名した証明書に失効リストのURL情報が付与あれます。
    crlDistributionPoints = URL:http://ehobby.jp/ca/latestcrl.crl
  4. DNS情報設定
    [ v3_ca ]
    
    ~(省略)~
    
    # <変更> (追加) DNS情報追加
    subjectAltName=@alt_names
    
    # ディレクティブに注意 !!!
    # [ v3_ca ] ディレクティブ内の設定はここより上に移動してください。
    [ alt_names ]
    DNS.1 = ehobby.jp
    DNS.2 = www.ehobby.jp

生成する証明書の情報設定 (一時的に環境変数に設定する)

# -------------------------------------------------------
#  設定
# -------------------------------------------------------
TARGET_DIR=RootCA               # 作成先ディレクトリ
IS_ROOTCA=y                     # ルート認証局の場合 y
DAYS=3650                       # 有効期間
SUBJ_C=JP                       # 国
SUBJ_ST=                        # 都道府県
SUBJ_L=                         # 市町村
SUBJ_OU=                        # 部門名
SUBJ_O="Ehobby"                 # 組織名
SUBJ_CN="Ehobby"                # コモンネーム(*1)
CNF_FILE=openssl_ca.cnf         # 設定ファイル名
# (*1) サーバー証明書の場合は、FQDN を指定する。

ルート認証局(CA) の証明書と秘密鍵生成

  1. 必要なディレクトリ作成
    mkdir -p ${TARGET_DIR}/{certs,crl,newcerts,private}
  2. 権限を設定 (private は、作成ユーザーのみ閲覧可能とする)
    chmod 700 ${TARGET_DIR}/private
  3. 証明書のインデクス管理用ファイルを作成する。
    touch ${TARGET_DIR}/index.txt
  4. 証明書のシリアル番号管理ファイルを作成する。(署名の度にこのファイルに記載されている値が増加する。)
    echo 01 > ${TARGET_DIR}/serial
  5. 設定ファイル有無チェック
    if [ ! -f ${CNF_FILE} ]; then
      echo "not found ${CNF_FILE}"
      exit 1
    fi
  6. SUBJ の設定
    SUBJ=/C=${SUBJ_C}
    # (1) 都道府県情報追加
    if [ ! "${SUBJ_ST} = "" ]; then
      SUBJ="${SUBJ}/ST=${SUBJ_ST}"
    fi
    # (2) 市町村情報追加
    if [ ! "${SUBJ_L} = "" ]; then
      SUBJ="${SUBJ}/L=${SUBJ_L}"
    fi
    # (3) 部門名情報追加
    if [ ! "${SUBJ_OU} = "" ]; then
      SUBJ="${SUBJ}/OU=${SUBJ_OU}"
    fi
    # (4) 組織名情報追加
    if [ ! "${SUBJ_O} = "" ]; then
      SUBJ="${SUBJ}/O=${SUBJ_O}"
    fi
    # (5) コモンネーム情報追加
    if [ ! "${SUBJ_CN} = "" ]; then
      SUBJ="${SUBJ}/CN=${SUBJ_CN}"
    fi
  7. 証明書を作成する。
    # (1) オプション調整
    #     ルート認証局の場合は、証明書を作成する。
    #     ==> -x509 オプションの付与が必要
    #     上位の認証局に署名をもらう場合は、署名要求用ファイルを作成する。
    #     ==> 出力ファイルに _req を付与する。
    X509=
    OUT_FILE=cacert.pem
    if [ "${IS_ROOTCA}" = "y" ]; then
      X509=-x509
      OUTFILE=cacert_req.pem
    fi
    # (2) 証明書生成
    #     暗号化方式: sha256 (SHA1の場合は、-newkey rsa:2048 を指定する)
    #
    openssl req -new                                \
            ${X509}                                 \
            -sha256                                 \
            -config ./openssl_ca.cnf                \
            -out    ${TARGET_DIR}/${OUT_FILE}       \
            -days   ${DAYS}                         \
            -keyout ${TARGET_DIR}/private/cakey.pem \
            -subj   "${SUBJ}"
  8. private 配下のファイルの権限を 600 とする。
    chmod 600 ${TARGET_DIR}/private/cakey.pem

証明書の確認

次のコマンドで証明書の内容を確認できます。

openssl x509 -text -noout -in RootCA/cacert.pem
  1. pem 形式→der 形式変換 (ブラウザに取り込む場合などに利用)
    openssl x509 -inform pem -in RootCA/cacert.pem -outform der -out RootCA/cacert.der
DERDistinguished Encoding RulesASN.1のエンコード方式の一つ X.509
PEMPrivacy Enhanced MailBase64にてエンコードした形式

トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS