#navi2(RaspberryPi/証明書,toc,prev,next)
----
#contents
----
* 環境構築 [#h1d00a1e]

** Open SSL のインストール [#oe3d15af]
次のコマンドを入力して Open SSL をインストールします。
 apt install openssl

** 認証局の環境構築 [#hf55af9f]
認証局では、他の証明書の署名および失効リストの管理を実施する必要があります。
ここでは、管理のためのディレクトリを生成します。

どこに置いても良いですが、ここでは、 /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 作成 [#v319fb21]
+&ref(openssl.cnf); を /var/lib/ssl/ca/conf/ 配下にコピーし、適宜必要な設定を修正します。
※/etc/ssl/openssl.cnf をベースに修正しても構いません。
※各設定項目については、以下を参照。

----
* openssl.cnf 設定 [#h6dfb5b0]
openssl.cnf の設定を記します。
* 設定ファイル作成 [#h6dfb5b0]
** openssl.cnf の設定を記します。 [#h104aa26]

 ####################################################################
 ##
 ## <全体>
 ## 指定可能なメッセージダイジェストは、
 ## 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証明書 署名用]
 ##
 ## 用途なども指定可能ですが、通常、ルート証明書は
 ## あまり細かい指定はせずに、利用する側で、
 ## 用途の設定、EVのOID設定などを実施します。
 ##
 [ 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 ]
** 署名に必要な設定 (認証局署名:openssl_ca.cnf) [#q83e0eeb]
 ####################################################################
 ##
 ## 中間認証局 CA証明書 署名用
 ##
 [ sign_ca ]
 #
 # subjectKeyIdentifier
 #   サブジェクトキー識別子。hash を指定する。
 #   ※16進数文字列してもあるが、非推奨
 subjectKeyIdentifier    = hash
 #
 #
 # authorityKeyIdentifier
 #   keyid  : サブジェクトキー識別子を親証明書からコピーする。
 #   issuer : 発行者証明書から発行者とシリアル番号をコピーする。
 #   keyid:always, issuer:always のように、always を指定すると、
 #   常にその値のコピーを強制し、コピーできない場合はエラーとなる。
 authorityKeyIdentifier  = keyid:always,issuer
 subjectAltName          = DNS.1:<ドメイン名>
 #
 #
 # extendedKeyUsage
 #   証明書公開鍵を使用できる目的を示す用法リスト
 #   次の値を指定可能である。
 #   - serverAuth      : SSL/TLS Webサーバー認証
 #   - clientAuth      : SSL/TLS Webクライアント認証
 #   - codeSigning     : コード署名
 #   - emailProtection : 電子メール保護 (S/MIMEなど)
 #   - timeStamping    : 信頼できるタイムスタンプ
 #   - msSGC           : Microsoft Server Gated Crypto
 #   - nsSGC           : Netscape Server Gated Crypto
 #   - msSmartcardLogin: Microsoft Smartcardlogin
 extendedKeyUsage        = serverAuth,clientAuth,emailProtection,codeSigning
 crlDistributionPoints   = URI:<CRLファイルがあるURL>
 authorityInfoAccess     = caIssuers;URI:<CA証明書があるURL>
 #
 #
 # CA証明書か否かを表す。
 # CA証明書の場合は、critical,CA:TRUE を指定する。
 basicConstraints        = critical,CA:TRUE,pathlen: 0
 keyUsage                = critical,digitalSignature,cRLSign,keyCertSig
 keyUsage                = critical,digitalSignature,cRLSign,keyCertSign
 crlDistributionPoints   = URI: http://ehobby.jp/ca/latestcrl.crl
 
 # @xxx は、指定セクションを参照する。
 certificatePolicies     = @policies, @cps
 authorityInfoAccess     = @info_access
 
 # サーバー証明書用
 [ cert_server ]
 [ policies ]
 # 通常、サーバー証明書の場合、ドメイン検証を指定します。
 policyIdentifier       = 2.23.140.1.2.1    # ドメイン検証
 #-P2 policyIdentifier       = 2.23.140.1.2.2    # 組織検証
 #-P3 policyIdentifier       = 2.23.140.1.2.3    # 個別検証
 
 [ info_access ]
 # 通常、caIssuers には、証明書の URL を指定します。
 # 通常、CPS には、認証実施規定("CPS")文書 のURLを指定します。
 # ※ CPSの記述は、下記が参考になるかと思います。
 # https://letsencrypt.org/documents/isrg-cps-v2.0/
 caIssuers;URI.0         = http://ehobby.jp/ca/ca.crt
 CPS.1                   = http://ehobby.jp/ca/
 
 [ cps ]
 #
 # policyIdentifier      = <OIDを記載する>
 # CPS.1                 = <CPSのURL>

** 署名に必要な設定 (サーバー証明書署名:openssl_server.cnf) [#le8a38ba]
 ####################################################################
 ##
 ## サーバー証明書 署名用
 ##
 [ sign_server ]
 #
 # subjectKeyIdentifier
 #   サブジェクトキー識別子。hash を指定する。
 #   ※16進数文字列してもあるが、非推奨
 subjectKeyIdentifier    = hash
 #
 #
 # authorityKeyIdentifier
 #   keyid  : サブジェクトキー識別子を親証明書からコピーする。
 #   issuer : 発行者証明書から発行者とシリアル番号をコピーする。
 #   keyid:always, issuer:always のように、always を指定すると、
 #   常にその値のコピーを強制し、コピーできない場合はエラーとなる。
 authorityKeyIdentifier  = keyid,issuer
 subjectAltName          = DNS.1:<ドメイン名>
 extendedKeyUsage        = serverAuth, clientAuth
 basicConstraints        = CA:FALSE
 keyUsage                = digitalSignature,keyEncipherment
 #
 #
 # subjectAltName
 #   代替名。次のような値を指定可能。
 #   ・DNS
 #   ・email
 #   ・URI
 #   ・RID
 #   ・IP
 #   ・dirName
 #   ・otherName
 #   サーバー証明書の場合、DNS の指定が必要であり、Chrome では、
 #   本指定が無ければ ERR_CERT_COMMON_NAME_INVALID のエラーがっ製する。
 #
 #   カンマ区切りあるいは、セクションを分けて複数指定することが可能である。
 #
 #   例1) カンマ区切りによる指定
 #   subjectAltName=email:sample@ehobby.jp,RID:1.2.3.4
 #
 #   例2) 別セッションにて指定
 #   subjectAltName=@alt_names
 subjectAltName=@alt_names
 #
 #
 # extendedKeyUsage
 #   証明書公開鍵を使用できる目的を示す用法リスト 
 #   次の値を指定可能である。
 #   - serverAuth      : SSL/TLS Webサーバー認証
 #   - clientAuth      : SSL/TLS Webクライアント認証
 #   - codeSigning     : コード署名
 #   - emailProtection : 電子メール保護 (S/MIMEなど)
 #   - timeStamping    : 信頼できるタイムスタンプ
 #   - msSGC           : Microsoft Server Gated Crypto
 #   - nsSGC           : Netscape Server Gated Crypto
 #   - msSmartcardLogin: Microsoft Smartcardlogin
 extendedKeyUsage        = serverAuth,clientAuth
 #
 #
 # CA証明書か否かを表す。
 # CA証明書の場合は、critical,CA:TRUE を指定する。
 basicConstraints        = critical,CA:FALSE
 keyUsage                = critical,digitalSignature,keyEncipherment
 crlDistributionPoints   = URI: http://ehobby.jp/ca/latestcrl.crl
 # @xxx は、指定セクションを参照する。
 certificatePolicies     = @policies, @cps
 authorityInfoAccess     = @info_access
 
 [ policies ]
 # 通常、サーバー証明書の場合、ドメイン検証を指定します。
 policyIdentifier       = 2.23.140.1.2.1    # ドメイン検証
 #-P2 policyIdentifier       = 2.23.140.1.2.2    # 組織検証
 #-P3 policyIdentifier       = 2.23.140.1.2.3    # 個別検証
 
 # クライアント証明書用
 [ cert_client ]
 [ info_access ]
 # 通常、caIssuers には、証明書の URL を指定します。
 # 通常、CPS には、認証実施規定("CPS")文書 のURLを指定します。
 # ※ CPSの記述は、下記が参考になるかと思います。
 # https://letsencrypt.org/documents/isrg-cps-v2.0/
 caIssuers;URI.0         = http://ehobby.jp/ca/ca.crt
 CPS.1                   = http://ehobby.jp/ca/
 
 [ cps ]
 #
 # policyIdentifier      = <OIDを記載する>
 # CPS.1                 = <CPSのURL>
 
 [ alt_names ]
 # ドメイン名指定
 # 複数指定可能。
 DNS.1                   = ehobby.jp
 DNS.2                   = *.ehobby.jp

** 署名に必要な設定 (クライアント証明書署名:openssl_client.cnf) [#sa0edb4f]
 ####################################################################
 ##
 ## クライアント証明書 署名用
 ##
 [ sign_server ]
 #
 # subjectKeyIdentifier
 #   サブジェクトキー識別子。hash を指定する。
 #   ※16進数文字列してもあるが、非推奨
 subjectKeyIdentifier    = hash
 #
 #
 # authorityKeyIdentifier
 #   keyid  : サブジェクトキー識別子を親証明書からコピーする。
 #   issuer : 発行者証明書から発行者とシリアル番号をコピーする。
 #   keyid:always, issuer:always のように、always を指定すると、
 #   常にその値のコピーを強制し、コピーできない場合はエラーとなる。
 authorityKeyIdentifier  = keyid,issuer
 subjectAltName          = DNS.1:<ドメイン名>
 #
 #
 # extendedKeyUsage
 #   証明書公開鍵を使用できる目的を示す用法リスト 
 #   次の値を指定可能である。
 #   - serverAuth      : SSL/TLS Webサーバー認証
 #   - clientAuth      : SSL/TLS Webクライアント認証
 #   - codeSigning     : コード署名
 #   - emailProtection : 電子メール保護 (S/MIMEなど)
 #   - timeStamping    : 信頼できるタイムスタンプ
 #   - msSGC           : Microsoft Server Gated Crypto
 #   - nsSGC           : Netscape Server Gated Crypto
 #   - msSmartcardLogin: Microsoft Smartcardlogin
 extendedKeyUsage        = clientAuth
 basicConstraints        = CA:FALSE
 keyUsage                = digitalSignature,keyEncipherment
----
** 署名拡張用設定詳細 [#f8bfae07]
-subjectKeyIdentifier
サブジェクトキー識別子の指定。hash を指定すること。
(16進数文字列も指定可能ではあるが、非推奨となっている。)
-authorityKeyIdentifier
keyid, issuer を指定可能であり、どちらもオプションの値 always を取ることができる。
keyid が指定された場合、サブジェクトキー識別子を親証明書からコピーしようとする。
issuer は、発行者証明書から発行者とシリアル番号をコピーする。
always は、常にその値をコピーすることを強制する。
 例)
 keyid:always,issuer
 必ず親証明書のサブジェクトキー識別子をコピーし、
 可能であれば、発行者証明者から発行者とシリアル番号をコピーする。
-subjectAltName
代替名。次の指定が可能。
email, URI, DNS, RID, IP, dirName, otherName
カンマ区切りで複数指定することも可能。
 例)
 subjectAltName=email:sample@ehobby.jp,RID:1.2.3.4
DNS名などで複数指定する場合は、次のような方法で可能
 方法1)
 subjectAltName=@alt_names
 #
 #
 # CA証明書か否かを表す。
 # CA証明書の場合は、critical,CA:TRUE を指定する。
 basicConstraints        = critical,CA:FALSE
 keyUsage                = critical,digitalSignature,keyEncipherment
 crlDistributionPoints   = URI: http://ehobby.jp/ca/latestcrl.crl
 # @xxx は、指定セクションを参照する。
 certificatePolicies     = @policies, @cps
 authorityInfoAccess     = @info_access
 
 [ alt_names ]
 DNS.1 = ehobby.jp
 DNS.2 = *.ehobby.jp
 [ policies ]
 # 通常、サーバー証明書の場合、ドメイン検証を指定します。
 policyIdentifier       = 2.23.140.1.2.1    # ドメイン検証
 #-P2 policyIdentifier       = 2.23.140.1.2.2    # 組織検証
 #-P3 policyIdentifier       = 2.23.140.1.2.3    # 個別検証
 
 方法2)
 subjectAltName=DNS.1:ehobby.jp,DNS.2:*.ehobby.jp
-extendedKeyUsage
証明書公開鍵を使用できる目的を示す用法のリスト
次のような値を指定可能。
--serverAuth SSL/TLS Webサーバー認証
--clientAuth  SSL/TLS Webクライアント認証
--codeSigning コード署名
--emailProtection 電子メール保護(S/MIMEなど)
--timeStamping 信頼できるタイムスタンプ
--msSGC Microsoft Server Gated Crypto
--nsSGC Netscape Server Gated Crypto
--msSmartcardLogin Microsoft Smartcardlogin
-crlDistributionPoints
CRL配布ポイント
-authorityInfoAccess
CAに関連する特定の情報にアクセスする方法。
 例1) OSCPサーバー
 authorityInfoAccess = OSCP; URI:http://ehobby.jp/oscp/
 [ info_access ]
 # 通常、caIssuers には、証明書の URL を指定します。
 # 通常、CPS には、認証実施規定("CPS")文書 のURLを指定します。
 # ※ CPSの記述は、下記が参考になるかと思います。
 # https://letsencrypt.org/documents/isrg-cps-v2.0/
 caIssuers;URI.0         = http://ehobby.jp/ca/ca.crt
 CPS.1                   = http://ehobby.jp/ca/
 
 例2) 証明書情報
 authorityInfoAccess = caIssuers; URI:http://ehobby.jp/ca/rootca.crt
-basicConstraints
CA証明書か否かを表す。
CA証明書の場合は、critical,CA:TRUE の指定が必要。
 例1) ルート認証局の場合
 basicConstraints = critical,CA:TRUE
 
 例2) 末端認証局の場合 (認証局に対して署名不可)
 basicConstraints = critical,CA:TRUE,pathlen:0
 
 例3) サーバー証明書, クライアント証明書の場合
 basicConstraints = CA:FALSE
-keyUsage
鍵の用途。下記の指定が可能。
--digitalSignature 電子署名
--nonRepudiation   否認防止
--keyEncipherment  鍵暗号
--dataEncipherment データ暗号
--keyAgreement     鍵交換
--keyCertSign      電子証明書の検証
--cRLSign          CRLの署名検証
--encipherOnly     鍵交換時のデータ暗号用
--decipherOnly     鍵交換時のエータ複合用
※critical を付与すると、指定用途以外での使用を禁止する。
 [ cps ]
 #
 # policyIdentifier      = <OIDを記載する>
 # CPS.1                 = <CPSのURL>


※その他、設定ファイルの詳細は、man v509v3_config を参照ください。


----
#navi2(RaspberryPi/証明書,toc,prev,next)
トップ   差分 バックアップ リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS