- 追加された行はこの色です。
- 削除された行はこの色です。
#navi2(RaspberryPi/証明書,toc,prev,next)
----
#contents
----
* 環境構築 [#h1d00a1e]
ここでは、次の証明書を生成・管理するための基本環境を構築します。
-ルート認証局用 CA証明書
-中間認証局用 CA証明書
-サーバー証明書
-クライアント証明書
※少し設定を変更すれば、他の証明書も生成可能です。
** Open SSL のインストール [#t102cfb4]
** Open SSL のインストール [#oe3d15af]
次のコマンドを入力して Open SSL をインストールします。
apt install openssl
** 環境設定 [#t8129e7e]
証明書に関する各種ファイルやディレクトリを作成します。
どこに置いても良いですが、ここでは、 /var/lib/ssl に置くものとします。
+事前準備(証明書を置くディレクトリの作成)
mkdir /var/lib/ssl
cd /var/lib/ssl
+環境設定
# 0. 基本ディレクトリ指定
TARGET_DIR=ca
#
# 1. 必要なディレクトリ作成
mkdir -p ${TARGET_DIR}/{certs,crl,newcerts,private}
#
# 2. 権限を設定
chmod 700 ${TARGET_DIR}/private
#
# 3. 証明書のインデックス管理用ファイルを作成
touch ${TARGET_DIR}/index.txt
#
# 4. 証明書のシリアル番号管理ファイルを作成
echo 01 > ${TARGET_DIR}/serial
#
# 5. 失効リスト番号管理ファイルを作成
echo 00 > ${TARGET_DIR}/crlnumber
** 認証局の環境構築 [#hf55af9f]
認証局では、他の証明書の署名および失効リストの管理を実施する必要があります。
ここでは、管理のためのディレクトリを生成します。
**openssl.cnf の用意 [#dd827aad]
/etc/ssl/openssl.cnf ファイルを /var/lib/ssl/ 配下にコピーし、
次の点を修正します。
+出力先ディレクトリ変更
どこに置いても良いですが、ここでは、 /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 をベースに修正しても構いません。
※各設定項目については、以下を参照。
----
* 設定ファイル作成 [#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 # 新規作成証明書格納ディレクトリ
# <変更> 出力先ディレクトリを変更
#* dir = ./demoCA # Where everything is kept
dir = ca
+署名時のポリシー変更 (必要に応じて)
# For the CA policy
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 # <変更> match -> optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional # <変更> match -> optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
#
# [備考]
# match : 当該項目がCAと同じであること
# supplied : 当該項目が設定されていること
# optional : 当該項目の設定有無、一致不一致を問わない
+署名用拡張設定
&color(red){''★<>の部分は適宜修正すること。''};
# ルート認証局 CA証明書用
[ cert_rootca ]
####################################################################
##
## 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
crlDistributionPoints = URI:<CRLファイルがあるURL>
basicConstraints = critical,CA:TRUE
# 証明書が 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)