ここでは、認証局に必要な秘密鍵とルート証明書を作成し、 証明依頼書に対して、署名する環境を構築します。
つぎのコマンドを実行してopensslをインストールします。
aptitude install openssl
認証局(CA)作成のための設定ファイルを作成します。 /etc/ssl/openssl.cnf ファイルをベースに作成します。 以下、任意の作業ディレクトリで実行してください。
mkdir ssl cp /etc/ssl/openssl.cnf ssl/openssl_ca.cnf
※Red Hat 系の場合は、/etc/pki/tls/openssl.cnf になります。
openssl_ca.cnf の次の点を修正します。
[ CA_default ] # <変更> 出力先ディレクトリを変更 #* dir = ./demoCA # Where everything is kept dir = CA
# <変更> 署名時のポリシーを変更 # 署名する証明書との一致/不一致条件を設定する。 # match : CAと一緒 # supplied : 当該項目が設定されている # optional : オプション(設定なし, 不一致でも問題ならない) # ※署名時 -policy policy_match で本ポリシーが適用される。 # # [備考] # # For the CA policy [ policy_match ] countryName = match #* stateOrProvinceName = match stateOrProvinceName = optional #* organizationName = match organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional
# ルート認証局 CA証明書用の拡張設定 [ cert_rootca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer # keyid subjectAltName = @rootca_dns_alt_names extendedKeyUsage = serverAuth,clientAuth,emailProtection,codeSigning crlDistributionPoints = URI:<CRLファイルがあるURL> authorityInfoAccess = caIssuers;URI:<CA証明書があるURL> basicConstraints = critical,CA:TRUE keyUsage = critical,digitalSignature,cRLSign,keyCertSign # ルート認証局のドメイン指定。(以下は例) [ rootca_dns_alt_names ] DNS.1 = ehobby.jp DNS.2 = *.ehobby.jp # 中間認証局 CA証明書への署名用拡張設定 [ cert_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer subjectAltName = @dns_alt_names extendedKeyUsage = serverAuth,clientAuth,emailProtection,codeSigning crlDistributionPoints = URI:<CRLファイルがあるURL> # OSCP を用いる場合は、 authorityInfoAccess = caIssuers;URI:<CA証明書があるURL> basicConstraints = critical,CA:TRUE,pathlen: 0 # CAに対して署名できないようにする keyUsage = critical,digitalSignature,cRLSign,keyCertSign # 中間認証局のドメイン指定。 [ ca_dns_alt_names ] DNS.1 = <中間認証局のドメイン> # サーバー証明書への署名用拡張設定 [ cert_server ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer subjectAltName = @server_dns_alt_names extendedKeyUsage = serverAuth, clientAuth basicConstraints = CA:FALSE keyUsage = digitalSignature,keyEncipherment # サーバーのドメイン指定。 [ server_dns_alt_names ] DNS.1 = xxxxx.jp DNS.2 = www.xxxxx.jp # クライアント証明書への署名用拡張設定 [ cert_server ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer subjectAltName = @client_dns_alt_names extendedKeyUsage = clientAuth basicConstraints = CA:FALSE keyUsage = digitalSignature,keyEncipherment # ドメイン指定。 [ client_dns_alt_names ] DNS.1 = xxxxx.jp DNS.2 = www.xxxxx.jp
# ------------------------------------------------------- # 設定 # ------------------------------------------------------- CNF_FILE=openssl_ca.cnf # 設定ファイル名 TARGET_DIR=CA # 作成先ディレクトリ IS_ROOTCA=y # ルート認証局の場合 y EXT=cert_rootca DAYS=3650 # 有効期間 # SUBJの設定 # 次の値を指定可能 # /C=[国] # /ST=[都道府県] # /L=[市町村] # /O=[組織] # /OU=[部門] # /CN=[コモンネーム(サーバ証明書の場合 FQDN を指定する)] # (*1) サーバー証明書の場合は、FQDN を指定する。 SUBJ="/C=JP/O=Ehobby/OU=Server CA/CN=Ehobby"
以下のスクリプトを実行します。
# # 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. 失効管理番号ファイルを作成する。 echo 00 > ${TARGET_DIR}/crlnumber # # 6. 設定ファイル有無チェック if [ ! -f ${CNF_FILE} ]; then echo "not found ${CNF_FILE}" exit 1 fi # # 7. 証明書生成オプション設定 # ルート認証局の場合 → -x509 オプションを付与 # 中間認証局の場合 → 上位認証局に署名をもらう。 # 分かりやすいようにファイル名に _req を付けておく。 X509=-x509 OUT_FILE=cacert.pem if [ ! "${IS_ROOTCA}" = "y" ]; then X509= OUT_FILE=cacert_req.pem fi # # 8. 証明書生成 # 暗号化方式は sha256 を使用する。 # メリットはあまりないが、SHA1を使用する場合は、 # -sha256 の代わりに -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}" # 次のようにパスフレーズの入力が求められるので # パスフレーズを入力する(2回) # Enter PEM pass phrase: # Verifying - Enter PEM pass phrase: # # 9. private 配下のファイルの権限を 600 とする。 chmod 600 ${TARGET_DIR}/private/cakey.pem # # 10. 証明書の確認 if [ "${IS_ROOTCA}" = "y" ]; then openssl x509 -text -noout -in ${TARGET_DIR}/cacert.pem fi # # 11. der 形式ファイルを生成する(ブラウザに取り込む場合の形式) if [ "${IS_ROOTCA}" = "y" ]; then openssl x509 -inform pem -in ${TARGET_DIR}/cacert.pem -outform der -out ${TARGET_DIR}/cacert.der fi
備考 No.10, 11 は証明書が完成した際に確認する。 中間認証局用の場合は、署名が未だのため確認できない。
PEM | Privacy Enhanced Mail | Base64にてエンコードした形式 |
DER | Distinguished Encoding Rules | ASN.1のエンコード方式の一つ X.509 |
#!/bin/bash CERT_NAME=$1 CNF_FILE=/export/ssl/openssl_ca.cnf DAYS=180 if [ ! "${2}" = "" ]; then DAYS=${2} fi CERT_SIGNED=`echo ${CERT_NAME} | sed "s/^\(.*\)_req.pem$/\1/"` CERT_SIGNED_PEM=${CERT_SIGNED}.pem CERT_SIGNED_DER=${CERT_SIGNED}.der if [ ! -f "${CERT_SIGNED_PEM}" ]; then echo "Usage: ${0} xxxxx_req.pem [day]" echo "Ex) ${0} cacert_req.pem 180" exit 1 fi openssl ca -md sha256 -config ${CNF_FILE} -policy policy_match -extensions ${EXT} -days ${DAYS} -out ${CERT_SIGNED_PEM} -infiles ${CERT_NAME} openssl x509 -inform pem -in ${CERT_SIGNED_PEM} -outform der -out ${CERT_SIGNED_DER} echo "------------------------------------------" echo "Input file : ${CERT_NAME}" echo "Output file [pem] : ${CERT_SIGNED_PEM}" echo "Output file [der] : ${CERT_SIGNED_DER}"
./sign.sh [証明依頼書(*_req.pemファイル)] [有効期限]署名に成功すると、署名されたファイル *.pem, *.der ファイルを生成します。
openssl ca -gencrl -md sha256 -config openssl_ca.cnf -revoke [失効させる証明書(CA/newcerts/xx.pem)]
openssl ca -gencrl -md sha256 -config openssl_ca.cnf -out [出力ファイル名(latestcrl.crl)]※このファイルは、「crlDistributionPoints」にて指定したURI にて閲覧可能となる場所に配置します。