#navi2(RaspberryPi/証明書,toc,prev,next)
----
#contents
----
* 認証局(CA)構築 (証明書と秘密鍵生成) [#ca133180]
ここでは、認証局に必要な秘密鍵とルート証明書を作成し、
証明依頼書に対して、署名する環境を構築します。

** openssl のインストール [#h5bd7597]
つぎのコマンドを実行してopensslをインストールします。
 aptitude install openssl

** 設定ファイル (openssl_ca.cnf) 作成 [#c8b7b3f3]
認証局(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
+最下行に追加
&color(red){''★<>の部分は適宜修正すること。''};
 # ルート認証局 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


** 生成する証明書の情報設定 (一時的に環境変数に設定する) [#y504a298]
 # -------------------------------------------------------
 #  設定
 # -------------------------------------------------------
 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"

***ルート認証局(CA) の証明書と秘密鍵生成 [#we9c22c5]
以下のスクリプトを実行します。
 #
 # 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 |

*署名 [#b78a7a0f]
+次のスクリプトを「openssl_ca.cnf」を置いた場所と同じディレクトリに用意する。
 #!/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 ファイルを生成します。

*失効管理 [#le23ed0b]
+次のコマンドで署名した証明書を失効させます。
 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 にて閲覧可能となる場所に配置します。

----
#navi2(RaspberryPi/証明書,toc,prev,next)

トップ   差分 バックアップ リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS