331.1 X.509証明書と公開鍵基盤
課題 331: 暗号化
331.1 X.509証明書と公開鍵基盤
LPIC303の試験範囲である主題331~335まであるうちの「331 暗号化」から「331.1 X.509証明書と公開鍵基盤」についてのまとめ
総重量:5
説明:
X.509証明書と公開鍵基盤を理解している必要がある。認証局/CAを実装するのために、OpenSSLを設定し利用したり、様々な目的のために、SSL証明書を発行することを知っている必要があります。主要な知識範囲:
X.509証明書、X.509証明書のライフサイクル、X.509証明書のフィールドとX.509v3証明書拡張を理解している。
証明書の透明性(CT: certificate transparency)を含む、信頼の連鎖(trust chains)と公開鍵基盤を理解している。
公開鍵と秘密鍵の生成と管理。
認証局/CAを作成・操作・厳重に管理する。
サーバ・クライアント証明書を、要求・署名・管理する。
証明書と認証局/CAを無効にする。
Let's Encrypt, ACME, certbotの基本的な特徴の知識。
CFSSLの基本的な特徴の知識。
重要なファイル、用語、ユーティリティ:
openssl (関連するサブコマンドを含む)
OpenSSLの設定
PEM, DER, PKCS
CSR
CRL
OCSP
X.509証明書、X.509証明書のライフサイクル、X.509証明書のフィールドとX.509v3証明書拡張を理解している
X.509証明書
エンコードタイプ
DER : Distinguished Encoding Rules
バイナリ形式PEM : Privacy Enhanced Mail
base64形式
ファイルの拡張子
*.der : DER形式の証明書
*.pem : 証明書または秘密鍵
*.key : 秘密鍵
*.cer : Windowsで使われる証明書
*.crt : Linuxで使われる証明書
*.csr : 証明書署名要求(CSR)
PKCS : Public-Key Cryptography Standards
RSAセキュリティ社によって策定された標準規格。 PKCS#1~#15がある。PKCS#1 / v2.2 / RSA暗号標準
PKCS#2 - 廃止
PKCS#3 / v1.4 / Diffie-Hellman鍵共有標準
PKCS#4 - 廃止
PKCS#5 / v2.1 / パスワードに基づく暗号化の標準
PKCS#6 / v1.5 / 拡張された証明書構文の標準
PKCS#7 / v1.5 / 暗号メッセージ構文標準
PKCS#8 / v1.2 / 秘密鍵情報構文の標準
PKCS#9 / v2.0 / 選択された属性タイプ
PKCS#10 / v1.7 / 証明書署名要求
PKCS#11 / v2.40 / 暗号トークンインタフェース (Cryptoki)
PKCS#12 / v1.1 / 個人情報交換構文の標準
PKCS#13 / - / 楕円曲線暗号の標準
PKCS#14 / - / 擬似乱数
PKCS#15 / v1.1 / 暗号トークン情報フォーマットの標準
X.509証明書のライフサイクル
証明書の発行
申請者が証明書署名要求(CSR:Certificate Signing Request)を認証局(CA:Certificate Authority)に申請する。
認証局(CA)はCSRをもとに証明書を発行する。証明書の使用
申請者が証明書を使用する。証明書の更新
有効期限が到来する前に更新をすることができる。証明書の失効
証明書を使えない状態にする。無効化する。
証明書失効リスト(CRL : Certificate Revocation List)に登録する。証明書の保留
証明書を一時的に失効させる。
保留した証明書はCRLに登録される。OCSP : Online Certificate Status Protocol
証明書の失効状態をオンラインで取得するための通信プロトコル
X.509証明書のフィールド
tbsCertificate(署名前証明書)
version
証明書のバージョンserialNumber
証明書のシリアル番号。認証局(CA)が割り当てる。signature
署名アルゴリズム
ハッシュ関数:MD5、SHA-1、SHA-2など
署名アルゴリズム:RSA、DSA、ECDSAなどissuer
証明書発行者
証明書を発行した認証局(CA)の名前varidity
証明書の有効期間
有効期限開始(NotBefore)。有効期限終了(Not After)。subject
主体者
公開鍵の所有者subjectPublicKeyInfo
主体者の公開鍵情報
公開鍵アルゴリズムと公開鍵extensions
X.509v3拡張領域
signatureAlgorithm
署名アルゴリズムsignatureValue
署名値
X.509v3証明書拡張
basicConstraints
基本制約authorityKeyIdentifier
認証局鍵識別子subjectKeyIdentifier
サブジェクト識別子keyUsage
鍵の用途extKeyUsage
拡張した鍵の用途subjectAltName
所有者の別名cRLDistributionPoints
CRL配布ポイントcertificatePolicies
証明書ポリシーauthorithInfoAccess
期間情報アクセス
参考
X.509とは - @IT
https://atmarkit.itmedia.co.jp/ait/articles/0401/01/news098.htmlSSLの各種証明書について(csr, pem, der, cerなど) #SSL - Qiita
https://qiita.com/ling350181/items/2ac60698779088b14deaPKCS - Wikipedia
https://ja.wikipedia.org/wiki/PKCS
証明書の透明性、信頼の連鎖、公開鍵基盤
証明書の透明性(CT:Certificate Transparency)
TLSで用いられる電子証明書について、 認証局による誤発行や悪意のある攻撃者などによる不正な発行を検知する仕組みであり、 Google社が提唱してRFC6962で標準化されています。信頼の連鎖(証明書チェイン)
証明書チェインとは、検証したい証明書からトラストポイントもしくはルートCAの証明書までの一連の証明書が連鎖している状態のこと。公開鍵基盤(PKI:Public-Key Infrastructure)
公開鍵暗号を利用した認証基盤
参考文献
インターネット10分講座 - JPNIC
https://www.nic.ad.jp/ja/newsletter/No23/080.html
公開鍵と秘密鍵の生成と管理
OpenSSLコマンド
openssl [サブコマンド] [オプション]
OpenSSL サブコマンド
ca
crl
dgst
genrsa
md5
pkcs12
req
rsa
rsautl
s_client
s_server
version
x590
ciphers
verify
opensslコマンドの使い方
genrsa:秘密鍵を作成する
openssl genrsa -out <key-filename> 2048
rsa:秘密鍵から公開鍵を作成する
openssl rsa -in <key-filename> -pubout > <pubkey-filename>
rsa:秘密鍵の内容を確認する
openssl rsa -in <key-filename> -text
rsa:公開鍵の内容を確認する
openssl rsa -pubin -in <pubkey-filename> -text
req:証明書署名要求(CSR)を作成する
openssl req -new -key <key-filename> -out <csr-filename>
req:自己署名のサーバー証明書を作成する
openssl req -new -x509 -key <key-filename> -out <csr-filename> -days <days>
req:証明書署名要求(CSR)の内容を確認する
openssl req -in <csr-filename> -text
x509:証明書の形式を変換する
openssl x509 -inform PEM -ouform DER -in <pem-cert-filename> -out <der-cert-filename>
ca:証明書を発行する
openssl ca -out <cert-filename> -days <days> -keyfile <CA-key-filename> -infiles <csr-filename>
ca:証明書失効リスト(CRL)
openssl ca -revoke <cert-filename> -gencrl
verify:証明書の検証
openssl verify -CAfile <CA-cert-filename> <cert-filename>
s_client:サーバーへの接続テスト
openssl s_client -connect <server> -servername <SNI-servername> -showcert
認証局の作成、操作、管理
認証局の構築については別記事『Appendix CA認証局構築』を参照
認証局の操作や証明書の発行方法については以下のとおり。
ファイル名は任意だが、秘密鍵は大切に保管する。
また、秘密鍵に設定するパスフレーズも任意。
認証局作成
CA認証局で秘密鍵(cakey.pem)を作成する
CA認証局の秘密鍵(cakey.pem)からCACSR(cacsr.pem)を作成する
CA認証局がCACSR(cacsr.pem)にCA秘密鍵(cakey.pem)で署名してCA証明書(cacert.pem)を作成する
サーバー証明書
サーバー秘密鍵(serverkey.key)を作成する
サーバー秘密鍵(serverkey.key)からサーバーCSR(servercsr.csr)
CA認証局がサーバーCSR(servercsr.csr)にCA秘密鍵(cakey.pem)で署名してサーバー証明書(servercert.crt)を作成する
クライアント証明書
クライアント秘密鍵(clientkey.key)を作成する
クライアント秘密鍵(clientkey.key)からクライアントCSR(clientcsr.csr)
クライアント自身がクライアントCSR(clientcsr.csr)にクライアント秘密鍵(clientkey.key)で署名してクライアント証明書(clientcert.crt)を作成する
参考
Let’s Encrypt, ACME, certbotの基本的な知識
Let’s Encrypt
無料でWebサーバ向けのSSL/TLS証明書を発行している認証局。
すべてのWebサーバへの接続を暗号化することを目指したプロジェクトで、米国の非営利団体であるISRG(Internet Security Research Group)により運営されている。
発行できるのはドメイン名の登録者または管理者であることを証明するDV(Domain Validation)証明書のみ。
組織の実在を確認するOV(Organization Validation)証明書、さらに厳密な実在確認を行うEV(Extended Validation)証明書は発行していません。有効期限は90日と他の証明書と比較して短い。
ACMEの仕組みによって証明書の更新を自動化できる。
ACME(Automatic Certificate Management Environment)
証明書のライフサイクルにおける手続きを自動化する仕組みで、以下の操作が自動化できる。
鍵ペアの作成
CSRの作成・認証局への送信
ドメイン名利用権の検証
証明書の設定・更新
certbot
Pythonで書かれた ACME クライアント
非営利法人である電子フロンティア財団(Electronic Frontier Foundation: EFF)が開発・公開している
その他、WindowsPowerShell向けの Posh-ACME や Go言語で書かれた LEGO がある。
参考文献
ACMEについて | JPRS
https://jprs.jp/pubcert/about/ACME/ACMEクライアント:certbot
https://certbot.eff.org/ACMEクライアント:Posh-ACME
https://poshac.me/docs/v4/ACMEクライアント:LEGO
https://go-acme.github.io/lego/
CFSSLの基本的な知識
CloudFlare's PKI toolkit
インストール
RockyLinux 9
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# dnf install golang
[root@lpic303-rocky34 ~]# go install github.com/cloudflare/cfssl/cmd/...@latest
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# ls -l ./go/bin/
合計 121916
-rwxr-xr-x 1 root root 21553904 2月 19 22:16 cfssl
-rwxr-xr-x 1 root root 14297696 2月 19 22:16 cfssl-bundle
-rwxr-xr-x 1 root root 17950264 2月 19 22:16 cfssl-certinfo
-rwxr-xr-x 1 root root 15063944 2月 19 22:16 cfssl-newkey
-rwxr-xr-x 1 root root 14759880 2月 19 22:16 cfssl-scan
-rwxr-xr-x 1 root root 11577952 2月 19 22:16 cfssljson
-rwxr-xr-x 1 root root 7603224 2月 19 22:16 mkbundle
-rwxr-xr-x 1 root root 22019776 2月 19 22:16 multirootca
[root@lpic303-rocky34 ~]#
Ubuntu 22.04
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# apt install golang
root@lpic303-ubuntu35:~# go install github.com/cloudflare/cfssl/cmd/...@latest
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# ls -l ./go/bin/
合計 113328
-rwxr-xr-x 1 root root 20186912 2月 19 22:15 cfssl
-rwxr-xr-x 1 root root 13261789 2月 19 22:15 cfssl-bundle
-rwxr-xr-x 1 root root 16675728 2月 19 22:15 cfssl-certinfo
-rwxr-xr-x 1 root root 13993476 2月 19 22:15 cfssl-newkey
-rwxr-xr-x 1 root root 13728542 2月 19 22:15 cfssl-scan
-rwxr-xr-x 1 root root 10753476 2月 19 22:15 cfssljson
-rwxr-xr-x 1 root root 6768144 2月 19 22:15 mkbundle
-rwxr-xr-x 1 root root 20642200 2月 19 22:17 multirootca
root@lpic303-ubuntu35:~#
コマンド
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# ./go/bin/cfssl -h
Usage:
Available commands:
gencsr
gencrl
print-defaults
revoke
certinfo
version
gencert
ocspserve
selfsign
info
genkey
ocspsign
serve
ocspdump
ocsprefresh
scan
bundle
crl
sign
Top-level flags:
[root@lpic303-rocky34 ~]#
参考
この記事が気に入ったらサポートをしてみませんか?