#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 設定 [#kf4e3730] ** フォーマット [#r7d50769] [ '''セクション名''' ] '''key''' = '''value''' ** ca セクション [#w7fce765] デフォルトの CAの設定を記述するセクション。 default_ca のキーワードにより、サブセクションを指定し、 実際の設定は、サブセクション内に記述される。 [ ca ] default_ca = CA_default [ CA_default ] : : : |key |説明 |デフォルト値 |h |default_ca |CAの設定を記述するサブセクションを指定する。 |CA_default | |dir (※1) |CAの各種ファイルを置くディレクトリを指定する。 | ./demoCA | |certs |発行した証明書を格納するディレクトリ。 |$dir/certs | |crl_dir |失効した信頼できない証明書のリストを格納するディレクトリ。 |$dir/crl | |database |署名した証明書を管理するデータベースのインデックスファイル |$dir/index.txt | |new_certs_dir |新規証明書を格納するディレクトリ |$dir/new_certs_dir | |certificate |CA証明書。署名等の際に参照される。 |$dir/cacert.pem | |serial |署名した証明書の署名シリアル番号を記載したファイル。 |$dir/serial | |crlnumber |失効リスト用のシリアル番号を記載したファイル |$dir/crlnumber | |crl |CRLファイル。 |$dir/crl.pem | |private_key |秘密鍵。 |$dir/private/prikey.pem | |RANDFILE |乱数生成に用いるファイル。 |$dir/private/.rand | |name_opt |サブジェクト名オブジェクト |ca_default | |cert_ope |証明書フィールドオプションを指定する。 |ca_default | |default_days |デフォルトの証明書有効期間(日数) |365 | |default_crl_days |デフォルトの次のCRL更新までの日数 |30 | |default_md |デフォルトのメッセージダイジェスト方式 |sha256 | ※1) 予約されたキーワードではなく、設定ファイルの中で利用している変数となる。 new_certs_dir = $dir/newcerts *** certficate [#weda4c8b] CA証明書ファイル 例) certificate = $dir/cacert.pem ---- 以下、修正中。 /etc/ssl/openssl.cnf ファイルを /var/lib/ssl/ 配下にコピーし、 次の点を修正します。 +出力先ディレクトリ変更 [ CA_default ] # <変更> 出力先ディレクトリを変更 #* dir = ./demoCA # Where everything is kept dir = ca +署名時のポリシー変更 (必要に応じて) # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = optional # <変更> match -> optional organizationName = optional organizationalUnitName = optional # <変更> match -> optional commonName = supplied emailAddress = optional # # [備考] # match : 当該項目がCAと同じであること # supplied : 当該項目が設定されていること # optional : 当該項目の設定有無、一致不一致を問わない +署名用拡張設定 &color(red){''★<>の部分は適宜修正すること。''}; # ルート認証局 CA証明書用 [ cert_rootca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer crlDistributionPoints = URI:<CRLファイルがあるURL> basicConstraints = critical,CA:TRUE 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 ---- ** 署名拡張用設定詳細 [#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 [ alt_names ] DNS.1 = ehobby.jp DNS.2 = *.ehobby.jp 方法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/ 例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 を付与すると、指定用途以外での使用を禁止する。 ※その他、設定ファイルの詳細は、man v509v3_config を参照ください。 ---- #navi2(RaspberryPi/証明書,toc,prev,next)