見出し画像

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
    期間情報アクセス

参考


証明書の透明性、信頼の連鎖、公開鍵基盤

  • 証明書の透明性(CT:Certificate Transparency)
    TLSで用いられる電子証明書について、 認証局による誤発行や悪意のある攻撃者などによる不正な発行を検知する仕組みであり、 Google社が提唱してRFC6962で標準化されています。

  • 信頼の連鎖(証明書チェイン)
    証明書チェインとは、検証したい証明書からトラストポイントもしくはルートCAの証明書までの一連の証明書が連鎖している状態のこと。

  • 公開鍵基盤(PKI:Public-Key Infrastructure)
    公開鍵暗号を利用した認証基盤

参考文献


公開鍵と秘密鍵の生成と管理

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認証局構築』を参照

認証局の操作や証明書の発行方法については以下のとおり。
ファイル名は任意だが、秘密鍵は大切に保管する。
また、秘密鍵に設定するパスフレーズも任意。

認証局作成

  1. CA認証局で秘密鍵(cakey.pem)を作成する

  2. CA認証局の秘密鍵(cakey.pem)からCACSR(cacsr.pem)を作成する

  3. CA認証局がCACSR(cacsr.pem)にCA秘密鍵(cakey.pem)で署名してCA証明書(cacert.pem)を作成する

サーバー証明書

  1. サーバー秘密鍵(serverkey.key)を作成する

  2. サーバー秘密鍵(serverkey.key)からサーバーCSR(servercsr.csr)

  3. CA認証局がサーバーCSR(servercsr.csr)にCA秘密鍵(cakey.pem)で署名してサーバー証明書(servercert.crt)を作成する

クライアント証明書

  1. クライアント秘密鍵(clientkey.key)を作成する

  2. クライアント秘密鍵(clientkey.key)からクライアントCSR(clientcsr.csr)

  3. クライアント自身がクライアント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 がある。

参考文献


CFSSLの基本的な知識

CloudFlare's PKI toolkit

CFSSL is CloudFlare's PKI/TLS swiss army knife. It is both a command line tool and an HTTP API server for signing, verifying, and bundling TLS certificates. It requires Go 1.16+ to build.
↓↓↓Google翻訳↓↓↓
CFSSL は CloudFlare の PKI/TLS スイス アーミー ナイフです。 これは、TLS 証明書の署名、検証、バンドルを行うためのコマンド ライン ツールであると同時に HTTP API サーバーでもあります。 ビルドするには Go 1.16 以降が必要です。

GitHub - cloudflare/cfssl: CFSSL: Cloudflare's PKI and TLS 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  219 22:16 cfssl
-rwxr-xr-x 1 root root 14297696  219 22:16 cfssl-bundle
-rwxr-xr-x 1 root root 17950264  219 22:16 cfssl-certinfo
-rwxr-xr-x 1 root root 15063944  219 22:16 cfssl-newkey
-rwxr-xr-x 1 root root 14759880  219 22:16 cfssl-scan
-rwxr-xr-x 1 root root 11577952  219 22:16 cfssljson
-rwxr-xr-x 1 root root  7603224  219 22:16 mkbundle
-rwxr-xr-x 1 root root 22019776  219 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  219 22:15 cfssl
-rwxr-xr-x 1 root root 13261789  219 22:15 cfssl-bundle
-rwxr-xr-x 1 root root 16675728  219 22:15 cfssl-certinfo
-rwxr-xr-x 1 root root 13993476  219 22:15 cfssl-newkey
-rwxr-xr-x 1 root root 13728542  219 22:15 cfssl-scan
-rwxr-xr-x 1 root root 10753476  219 22:15 cfssljson
-rwxr-xr-x 1 root root  6768144  219 22:15 mkbundle
-rwxr-xr-x 1 root root 20642200  219 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 ~]#

参考


この記事が気に入ったらサポートをしてみませんか?