次のコマンドを入力して Open SSL をインストールします。
apt install openssl
認証局では、他の証明書の署名および失効リストの管理を実施する必要があります。 ここでは、管理のためのディレクトリを生成します。
どこに置いても良いですが、ここでは、 /var/lib/ssl/ca に置くものとします。
mkdir -p /var/lib/ssl/ca/{certs,crl,newcerts,private,conf}
chmod 700 /var/lib/ssl/ca/private
touch /var/lib/ssl/ca/index.txt
echo 01 > /var/lib/ssl/ca/serial
echo 00 > /var/lib/ssl/ca/crlnumber
openssl.cnf の設定を記します。 特に、デフォルトから変更すべきところを ★ で示しております。
#################################################################### ## ## <全体> ## 指定可能なメッセージダイジェストは、 ## openssl dgst -h コマンドにてご確認ください。 ## #################################################################### ## ## CA セクション ## ## default_ca により、CA 設定を記載しているセクションを指定します。 [ ca ] default_ca = CA_default # CA設定を記載しているセクション #################################################################### ## ## CA_default セクション ## ## CA の設定を記載しているセクション ## [ CA_default ] # 以下、認証局における証明書や各種ファイルを置く場所を設定します。 dir = . # 基本ディレクトリ(予約キーワードではなく、変数となります。) certs = $dir/certs # 発行した証明書格納ディレクトリ crl_dir = $dir/crl # CRL格納ディレクトリ database = $dir/index.txt # データベースインデックス new_certs_dir = $dir/newcerts # 新規作成証明書格納ディレクトリ certificate = $dir/cacert.pem # CA証明書 serial = $dir/serial # シリアル番号ファイル crlnumber = $dir/crlnumber # CRL番号ファイル crl = $dir/crl.pem # CRLファイル private_key = $dir/private/prikey.pem # 秘密鍵 RANDFILE = $dir/private/.rand # ランダムファイル x509_extensions = usr_cert # 証明書の拡張セクション # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # サブジェクト名オプション cert_opt = ca_default # 証明書フィールドオプション default_days = 365 # 証明書有効期間(日数) default_crl_days= 30 # 次のCRL更新までの日数 default_md = sha256 # ダイジェストアルゴリズム preserve = no # keep passed DN ordering #################################################################### ## ## ★署名時のポリシーセクション ## ## 各情報に対して次の値を指定可能であり、条件を満たさない ## CSR の場合、署名が失敗します。 ## ## match : 当該項目がCAと同じであること ## supplied : 当該項目が設定されていること ## optional : 当該項目の設定有無、一致不一致を問わない [ policy_match ] countryName = match stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### ## ## CSR作成時に関する設定を記載するセクション ## ## ★メッセージダイジェストは、デフォルト sha1 となっておりますが、 ## 強度の問題より sha256 とすべきです。 ## [ req ] default_bits = 2048 # ビット数 default_md = sha256 # メッセージダイジェスト default_keyfile = privkey.pem # 秘密鍵 distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # 自己署名の拡張 # 文字種別 # 次の指定が可能です。 # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString (PKIX recommendation before 2004) # utf8only: only UTF8Strings (PKIX recommendation after 2004). # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings. string_mask = utf8only #################################################################### ## ## 情報指定時の問い合わせメッセージ、デフォルト値、制限などを ## 設定するセクション ## [ req_distinguished_name ] countryName = 国名 (2文字コード) # 国名 (2文字のコード) countryName_default = JP countryName_min = 2 countryName_max = 2 stateOrProvinceName = 都道府県名 stateOrProvinceName_default = Hyogo localityName = 市町村名 localityName_default = Amagasaki 0.organizationName = 組織名 0.organizationName_default = Ehobby # 複数指定の場合 #1.organizationName = 第二組織名 #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = 部門名 #organizationalUnitName_default = commonName = コモンネーム(名前, サーバーホスト名など) commonName_max = 64 emailAddress = Eメールアドレス emailAddress_max = 64 # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = パスワード [8-20文字] challengePassword_min = 8 challengePassword_max = 20 unstructuredName = オプション国名 #################################################################### ## ## CA が 証明書署名要求に署名する際に追加されるセクション ## [ usr_cert ] # 証明書が CA 用か否かを指定する。 # エンドユーザーの証明書は、CAではないため、 # CA:FALSE を指定する。 basicConstraints = CA:FALSE # サブジェクトキー識別子指定する。 # hash 固定。(16進数文字列も指定可能であるが非推奨) subjectKeyIdentifier = hash # keyid : サブジェクトキーを親からコピーする。 # issuer : 発行者証明書から発行者とシリアル番号をコピーする。 # それぞれ、always (Ex. keyid:always) を指定可能であり、 # always は、コピーを強制する。 authorityKeyIdentifier = keyid,issuer #################################################################### ## ## 自己署名の拡張 [ルート認証局用 CA証明書 署名用] ## [ v3_ca ] # サブジェクトキー識別子指定する。 # hash 固定。(16進数文字列も指定可能であるが非推奨) subjectKeyIdentifier = hash # keyid : サブジェクトキーを親からコピーする。 # issuer : 発行者証明書から発行者とシリアル番号をコピーする。 # それぞれ、always (Ex. keyid:always) を指定可能であり、 # always は、コピーを強制する。 authorityKeyIdentifier = keyid:always,issuer # 証明書が CA 用か否かを指定する。 # CA の場合のPKIX の推奨指定は、次の通り。 # # critical,CA:TRUE # # ※上記指定の場合、いくつかのソフトウェアは動作しない場合がある。 # その時は、critical, を除去すること。 basicConstraints = critical,CA:true # 鍵の用途を指定する。 # 次の指定が可能。 # digitalSignature 電子署名 # nonRepudiation 否認防止 # keyEncipherment 鍵暗号 # dataEncipherment データ暗号 # keyAgreement 鍵交換 # keyCertSign 電子証明書の検証 # cRLSign CRLの署名検証 # encipherOnly 鍵交換時のデータ暗号用 # decipherOnly 鍵交換時のデータ複合用 keyUsage = critical,digitalSignature,cRLSign,keyCertSign
# 中間(末端)認証局 CA証明書用 [ cert_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer subjectAltName = DNS.1:<ドメイン名> extendedKeyUsage = serverAuth,clientAuth,emailProtection,codeSigning crlDistributionPoints = URI:<CRLファイルがあるURL> authorityInfoAccess = caIssuers;URI:<CA証明書があるURL> basicConstraints = critical,CA:TRUE,pathlen: 0 keyUsage = critical,digitalSignature,cRLSign,keyCertSig # サーバー証明書用 [ cert_server ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer subjectAltName = DNS.1:<ドメイン名> extendedKeyUsage = serverAuth, clientAuth basicConstraints = CA:FALSE keyUsage = digitalSignature,keyEncipherment # クライアント証明書用 [ cert_client ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer subjectAltName = DNS.1:<ドメイン名> extendedKeyUsage = clientAuth basicConstraints = CA:FALSE keyUsage = digitalSignature,keyEncipherment
例) keyid:always,issuer 必ず親証明書のサブジェクトキー識別子をコピーし、 可能であれば、発行者証明者から発行者とシリアル番号をコピーする。
例) subjectAltName=email:sample@ehobby.jp,RID:1.2.3.4DNS名などで複数指定する場合は、次のような方法で可能
方法1) subjectAltName=@alt_names [ alt_names ] DNS.1 = ehobby.jp DNS.2 = *.ehobby.jp 方法2) subjectAltName=DNS.1:ehobby.jp,DNS.2:*.ehobby.jp
例1) OSCPサーバー authorityInfoAccess = OSCP; URI:http://ehobby.jp/oscp/ 例2) 証明書情報 authorityInfoAccess = caIssuers; URI:http://ehobby.jp/ca/rootca.crt
例1) ルート認証局の場合 basicConstraints = critical,CA:TRUE 例2) 末端認証局の場合 (認証局に対して署名不可) basicConstraints = critical,CA:TRUE,pathlen:0 例3) サーバー証明書, クライアント証明書の場合 basicConstraints = CA:FALSE
※その他、設定ファイルの詳細は、man v509v3_config を参照ください。