SSL/TLSの基本的な仕組みと設定方法

Security

現在、WEBサーバを公開する際、サイト全体を常時HTTPS(HTTP over SSL/TLS)化することが一般的とされています。

SSL/TLSの目的、役割、必要性
  • WEBサーバおよびクライアント間で通信を暗号化する
    • データの盗聴や改竄かいざんの検知
  • 接続先のWEBサーバが正規のサイトであることを証明する
    • なりすましを防ぐ、会社の実在証明ができる

上記の他にも、HTTP/2プロトコルによる高速化やSEO対策なども期待できます。

スポンサーリンク

SSLの仕組み

当初、HTTPSを実装する技術はSSL(Secure Sockets Layer)でしたが、その後、セキュリティ上の問題を改善するために、TLS(Transport Layer Security)が誕生しました。基本的にはSSLとTLSは同じような技術と理解して問題ありません。

既に、SSL 1.0、SSL 2.0、SSL 3.0および、TLS 1.0、TLS 1.1は非推奨であり、現在ではTLS 1.2またはTLS 1.3(試験段階)のみが推奨されています。

一般的なSSL通信の仕組み(前提条件)
  • WEBブラウザとWEBサーバは共通鍵暗号方式で暗号化されたデータを送受信する
  • 共通鍵を安全に配布するための手段として公開鍵暗号方式を採用する
  • ルート証明書、中間証明書、SSLサーバ証明書の3種類によりセキュリティを確保する

共通鍵暗号方式と公開鍵暗号方式

HTTPS(HTTP over SSL/TLS)を実装するには、共通鍵暗号方式と公開鍵暗号方式の技術が利用されています。主な特徴は以下の通りです。

共通鍵暗号方式と公開鍵暗号方式の特徴
  • 共通鍵暗号方式の特徴
    • 暗号化と復号化を同一の共通の鍵(共通鍵)を使って行う
    • 公開鍵暗号方式と比べ、暗号化および復号化が高速
    • 通信相手に共通鍵を安全に渡すことが課題
    • 暗号化アルゴリズムとして、DES、RC4、AESなどがある
  • 公開鍵暗号方式の特徴
    • 暗号化と復号化を別々の鍵(公開鍵と秘密鍵)を使って行う
      • 受信者側が公開鍵と秘密鍵を作成する
      • 送信者側がその公開鍵をもとに暗号化する
      • 受信者側は秘密鍵を使い復号化する
    • 暗号化アルゴリズムとして、RSA、楕円曲線暗号などがある
    • データ改ざんを検知するためのデジタル署名も公開鍵暗号の技術が応用されている

公開鍵暗号方式を実現するためのアルゴリズムにはさまざまなものがありますが、主にRSAまたは楕円曲線暗号が採用されます。

公開鍵暗号方式を実現するためのアルゴリズム
  • RSA暗号(Ron Rivest/Adi Shamir/Leo Adleman)
    • 開発者3名の頭文字が由来
    • 大きな数の素因数分解が難しいことを利用したアルゴリズム
    • 一般的な鍵長は2048bit
  • 楕円曲線暗号(ECC/Elliptic Curve Cryptography)
    • 楕円曲線上の離散対数問題が難しいことを利用したアルゴリズム
    • 一般的な鍵長は256bit
      • RSAと比べて短い鍵長でセキュリティを担保できる
    • 具体的な暗号化アルゴリズムとして以下の2点が挙げられる
      • 楕円曲線デジタル署名アルゴリズム(ECDSA/Elliptic Curve Digital Signature Algorithm)
      • 楕円曲線Diffie Hellman鍵交換(ECDH/Elliptic curve Diffie Hellman key exchange)

共通鍵暗号方式の暗号化アルゴリズムとしては主に以下の3点が有名です。

共通鍵暗号方式を実現するためのアルゴリズム
  • RC4(Rivest’s Cipher 4)
  • DES(Data Encryption Standard)
  • AES(Advanced Encryption Standard)

RC4、DESについてはセキュリティ上の問題があるため、現在の主流はAESです。

デジタル署名の仕組み

デジタル署名の技術によって証明書の正当性を証明(検証)することができます。デジタル署名は公開鍵暗号の他にハッシュ関数の技術が採用されています。

  • SHA-1
    • 脆弱性が確認されたため、現在は非推奨
  • SHA-2
    • ビット長ごとに、SHA-224、SHA-256、SHA-384、SHA-512の4種類がある
    • 現在、推奨されているハッシュ関数、一般的にはSHA-256が採用される
  • SHA-3
    • 2015年にリリースされた次世代ハッシュ関数、将来的には普及する見込み

なお、デジタル証明書の基本的な仕組みは以下の通りです。

デジタル証明書の仕組み
  • データ送信者の改ざんを検知する(正規の送信者であることを担保する)
  • 送信者はデータをハッシュ化し秘密鍵により署名を作成しデータと署名を送信する
  • 受信者は以下の情報を比較する
    • データ部分をハッシュ関数によりハッシュ化する(ハッシュ値の算出)
    • 署名部分を送信者の公開鍵により複合する(ハッシュ値の算出)
    • 双方のハッシュ値がして一致すれば改ざんが無いと判断できる

主にWEBクライアントがWEBサーバから受け取った証明書(SSLサーバ証明書および中間証明書)が正規の証明書であるかを判断する際に利用される技術です。

最低限のセキュリティ要件

2010年代以降、最低限のセキュリティ要件は以下の通りです。

2010年代以降の最低限のセキュリティ要件
  • RSA
    • 2048bit(2030年以降は3072bit推奨)
  • ECC
    • 224bit(鍵長224bit⇒RSA2048bit、鍵長256bit⇒RSA3072bit相当の強度)
  • 署名ハッシュアルゴリズム
    • SHA-2(SHA-256)(将来的にはSHA-3に移行される予定)

SSL証明書の種類

SSL証明書の違い
  • ルート証明書
    • WEBブラウザ(Google ChromやFirefox)に予めインストールされている
    • WindowsUpdateにより最新版に更新される
    • ルート証明書にはルート認証局の公開鍵が含まれている
  • 中間CA証明書
    • 各認証局のホームページより自由にダウンロードできる
    • 管理者がWEBサーバ側にインストールする
    • セキュリティインシデントによる失効処理時の影響を軽減する
    • 中間CA証明書には中間認証局の公開鍵が含まれている
  • SSLサーバ証明書
    • CSR(証明書署名要求)を作成して送ることで認証局により発行される
    • 管理者がWEBサーバ側にインストールする
    • 有効期限が最長で397日
    • ドメイン認証、OV認証、EV認証の3種類に分けられる
    • サーバ証明書にはWEBサーバの公開鍵が含まれている

ルート証明書はクライアント(WEBブラウザ)側に予めインストールされているのに対して、サーバ証明書および中間CA証明書については、httpsアクセス時にWEBサーバ側からクライアント側に送られます。

SSLサーバ証明書にはサーバの公開鍵が含まれています。

SSLサーバ証明書の種類
  • ドメイン認証型、クイック認証SSL、(Domain Validation)
    • ドメインの所有権を確認
  • 企業認証型OV(Organization Validation)
    • ドメイン認証に加え企業の存在確認
  • 企業実在拡張認証型EV(Extended Validation)
    • ドメイン認証、企業認証に加え登記事項証明書等の確認
    • アドレスバーが緑色になる

有名な認証局

認証局
  • GMO GlobalSign(GMOグローバルサイン)
  • Cybertrust(サイバートラスト)
  • GeoTrust(ジオトラスト)
  • DigiCert(デジサート)
    • 2017年にはシマンテック(VeriSign)の電子証明書事業を買収

有名企業の証明書情報

有名企業の証明書情報を調べてみました。調べた企業の中では全て、X.509フォーマットのV3が採用されていました。

発行先発行者署名アルゴリズム署名ハッシュアルゴリズム公開キー
AppleApplesha256RSAsha256RSA
GoogleGTSsha256RSAsha256ECC(ECDSA)
MocrosoftMocrosoftsha256RSAsha256RSA
FacebookDigiCertsha256RSAsha256ECC(ECDSA)
AmazonDigiCertsha256RSAsha256RSA
ヤフーCybertrustsha256RSAsha256RSA
LINEGlobalSignsha256RSAsha256RSA
メルカリGlobalSignsha256RSAsha256RSA

GoogleやMicrosoftのような海外の大企業では自社で証明書を発行している企業もありますが、基本的には認証局に証明書発行を依頼している企業が多かったです。

大企業では企業実在拡張認証型の証明書を採用することが多いかと思っていましたが、企業実在拡張認証型の証明書を採用している企業は意外と少なかったです。

スポンサーリンク

一般的なSSL通信の仕組み

SSL通信時、WEBサーバとWEBクライアント(WEBブラウザ)との間では、以下のようなやり取りが行われています。

一般的なSSL通信の仕組み
  • 手順1
    HTTPSリクエスト(WEBブラウザ→WEBサーバ)
    • WEBブラウザからWEBサーバへ[https://]によるアクセスを開始
  • 手順2
    SSLサーバ証明書を送信(WEBサーバ→WEBブラウザ)
    • WEBサーバから以下の情報をWEBブラウザ側へ送信
      • 中間CA証明書および中間認証局の公開鍵
      • SSLサーバ証明書およびWEBサーバの公開鍵
  • 手順3
    ルート証明書による照合(WEBブラウザ)
    • ルート認証局の公開鍵で中間CA証明書を復号化して中間認証局の公開鍵を取り出す
    • 中間認証局の公開鍵でSSLサーバ証明書を復号化してWEBサーバの公開鍵を取り出す
    • 共通鍵を生成しWEBサーバの公開鍵で暗号化してWEBサーバへ送信する
  • 手順4
    共通鍵の送信(WEBブラウザ→WEBサーバ)
    • WEBブラウザにて暗号化された共通鍵を送付する
    • 暗号化した共通鍵をWEBサーバに送信
  • 手順5
    共通鍵による通信(WEBサーバ)
    • 共通鍵を秘密鍵で復号する
  • 手順6
    共通鍵による通信(WEBブラウザ⇔WEBサーバ)
    • WEBブラウザによって作成された共通鍵いより暗号化通信を実現

X.509証明書のフォーマット

X.509証明書のフォーマットは以下の通りです。

X.509証明書のフォーマット
  • tbsCertificate
    • バージョン(X.509証明書のバージョン、基本的にはバージョン3)
    • シリアル番号(認証局より割り当てられる番号)
    • 署名アルゴリズム(証明書付与の署名アルゴリズム、基本的にはsha256RSA)
    • 発行者(証明書を発行した認証局の情報)
    • 有効期限(証明書が有効な期間、最大で397日まで、90日前から更新可能)
    • サブジェクト(所有者情報、都道府県、会社情報など)
    • 公開鍵情報(公開鍵の情報、RSAまたはECC(ECDSA)が一般的)
  • signatureAlgorithm
    • 署名アルゴリズム(sha256RSA、認証局がtbsCertificate部分をハッシュ化する)
  • signatureValue
    • 署名(認証局がtbsCertificate部分をハッシュ化した情報)
X.509とは
X.509(エックス ポイント ゴーマルキュー)とは、もともとITU(International Telecommunications Union:国際電気通信連合電気通信標準化部門)が定めたデジタル証明書の標準仕様だが、今日ではIETF PKIX Working Groupが定めたPKIに関する規格(RFC 5280...

証明書の正当性を検証する仕組み

証明書の正当性を検証するには、

  1. 証明書の署名部分を認証局の公開鍵で復号したハッシュ値
  2. 証明書のデータ部分をハッシュ化したハッシュ値

が一致していることを確認する必要があります。

証明書チェーンの仕組み

実際には、証明書チェーンにより、ルート証明書、中間証明書、SSL証明書により構成されているため、もう少し複雑です。

まず、ルート証明書およびルート認証局の公開鍵はWebクライアント(ブラウザ)にあらかじめプリインストールされています。

次に、中間証明書をチェックするには、

  1. 中間証明書の署名部分をルート認証局の公開鍵で復号化したハッシュ値
  2. 中間証明書のデータ部分をハッシュ化したハッシュ値

が一致していることを検証する必要があります。

最後に、SSLサーバ証明書のチェックをするには、

  1. SSLサーバ証明書の署名部分を中間認証局の公開鍵で復号したハッシュ値
  2. SSLサーバ証明書のデータ部分をハッシュ化したハッシュ値

が一致している必要があります。

 ルート証明書および中間証明書の関係性などについては以下の記事が参考になりました。

図解 X.509 証明書 - Qiita
はじめに X.509 証明書について解説します。(English version is here → "Illustrated X.509 Certificate") ※ この記事は 2020 年 7 月 1 日にオンラインで開催さ...
【図解】よく分かるデジタル証明書(SSL証明書)の仕組み 〜https通信フロー,発行手順,CSR,自己署名(オレオレ)証明書,ルート証明書,中間証明書の必要性や扱いについて〜
前提知識デジタル証明書 (電子証明書) の理解のためにはまず RSA 公開鍵・秘密鍵について知る必要があります。簡単に言うと以下がポイントになります。 公開鍵で暗号化すると、秘密鍵でしか復号できない (公開鍵では復号できない) 秘密鍵で

クロスルート証明書の仕組み

Webクライアント側のルート証明書が最新でない場合、取得した中間証明書の正当性を正しく検証できない可能性があります。

クロスルート証明書を利用することで、(古いルート証明書も含め)複数のルート証明書での検証が可能になります。

証明書失効リストとOCSP

証明書の秘密鍵の流出(危殆化)により、有効期限より前に証明書を失効させる必要がある場合は、証明書失効リスト(CRL/Certificate Revocation List)に登録して管理します。

また証明書の有効性をリアルタイムで確認する場合は、OCSP(Online Certificate Status Protocol)による確認が有効です。

スポンサーリンク

SSL証明書の運用方法

Windows(IIS)によるサーバ証明書の構築手順

IIS(Internet Information Services)によるサーバ証明書の一般的な構築手順は以下の通りです。

一般的なSSL証明書の運用手順通信の仕組み
  • 手順1
    CSRファイル(Certificate Signing Request)の作成(WEBサーバ)
    • IISよりCSRを作成する
      • 国名、住所、組織名、部門名、コモンネームを入力する
      • 暗号化の種類、ビット長を入力する
      • 必要に応じてTSV形式に変換する
      • CSRには公開鍵の情報も含まれる
  • 手順2
    SSLサーバ証明書の発行申請を送る
    • 認証局に対して証明書の発行申請書を送る
  • 手順3
    SSLサーバ証明書を受け取る
    • 認証局側にて発行申請書をもとに証明書を作成する
    • 認証局より証明書を受け取る
  • 手順4
    中間CA証明書を取得、インストールする
    • 認証局のホームページなどから中間証明書をダウンロードする
      • 中間CA証明書の更新が無い場合は不要
    • 中間証CA明書をインストールする
      • ダウロードした中間CA証明書を実行する
      • 証明書インポートウィザードより保存場所を設定する
  • 手順5
    IISマネージャーよりSSLサーバ証明書をインストールする
    • 新しい証明書をインストールする
    • 古い証明書をバックアップ(エクスポート)および削除する
    • 新しい証明書を設定(サイトバウンド)する

Linux(Nginx/Apache) によるサーバ証明書の構築手順

Linuxサーバでのサーバ証明書の構築手順は以下の通りです。基本的な流れはIISとそれ程変わらないです。

一般的なSSL証明書の運用手順通信の仕組み
  • 手順1
    CSRファイル(Certificate Signing Request)の作成
    • 必要なパッケージをインストールする
    • 秘密鍵を作成(opensslコマンド)
    • CSR(証明書署名要求)の作成(opensslコマンド)
      • CSRには公開鍵の情報も含まれる
  • 手順2
    SSLサーバ証明書の発行申請を送る
    • 認証局に対して証明書の発行申請書を送る
    • 認証局側にて発行申請書をもとに証明書を作成する
  • 手順3
    SSLサーバ証明書の発行申請を送る
    • 認証局より証明書を受け取る
  • 手順4
    中間CA証明書を結合する
    • 必要に応じて中間CA証明書とSSL証明書を結合する
      • WEBサーバの仕様により異なる
  • 手順5
    WEBサーバ上に保存し、設定ファイルで定義する
    • SSLサーバ証明書、中間CA証明書を任意のディレクトリに保存する
    • Webサーバの設定ファイルで各種証明書の保存場所を定義する
    • Webサーバを再起動する

Linuxサーバ側での必要なパッケージ

LinuxサーバでHTTPS(SSL/TLS)を構築するには以下のパッケージをインストールする必要があります。

  • OpenSSL…SSL/TLSの機能を提供する、opensslコマンドが利用できる
  • mod_ssl…ApacheをSSLに対応させる、インストール時にssl.confが自動作成される

ファイル形式の種類と関連用語

ファイル形式と関連技術を簡単にまとめてみました。

ファイル形式/用語内容
CSR(証明書発行要求/Certificate Signing Request)CSRを認証局に送り証明書を発行する
TSV(Tab Separated Values)タブ区切りのファイルの形式
DER(Distinguished Encoding Rules)DERでエンコーディング(符号化)されたバイナリ形式(証明書の形式)
PEM(Privacy Enhanced Mail)Base64でエンコーディング(符号化)されたテキスト形式(証明書の形式)
CRT証明書、主にLinux系で採用される
CER証明書、主にWindows系で採用される
PKCS12(Public-Key Cryptography Standards/p12)証明書と秘密鍵の組み合わせ
バイナリ形式
古い証明書をバックアップする際などにも作成
pfx(Personal Information Exchange)PKCS#12の旧称
X.509デジタル証明書、証明書失効リストのデータ形式を定めた標準規格
スポンサーリンク

自己証明書(オレオレ証明書)の作成手順

自己証明書はオレオレ証明書とも呼ばれます。証明書の作成を外部の認証局に依頼せずに、自身のサーバ内で作成する仕組みです。

自己証明書(オレオレ証明書)
  • 実現できること
    • WEBサーバおよびクライアント間で通信を暗号化する
  • 実現できないこと
    • 接続先のWEBサーバが正規のサイトであることを証明する

WEBサーバを外部公開するのであれば、外部の認証局より正式な証明書を取得することになりますが、社内環境や検証環境などでは、自己証明書(オレオレ証明書)を利用することもあります。

作成手順は以下の通りです。

秘密鍵、CSR(証明書署名要求)、証明書の作成手順

主に以下の4ステップにより自己証明書(オレオレ証明書)を構築します。

  1. 秘密鍵を作成(opensslコマンド)
  2. CSR(証明書署名要求)を作成(opensslコマンド)
  3. SSLサーバ証明書の作成(opensslコマンド)
  4. Webサーバの設定ファイルで秘密鍵および証明書の保存場所を定義し、サービス再起動

opensslコマンドはサブコマンドやオプションの種類が豊富ですが、まずは最低限のオプションを把握できれば良いでしょう。

opensslコマンドのオプション

サブコマンドオプション内容
openssl genrsa秘密鍵の作成
-out出力する秘密鍵のファイル名(リダイレクトでも指定可能)
-aes256暗号化方式(DES、DES3、AESなどが利用可能)
openssl reqCSRの作成
-new新規CSR作成
-key入力する秘密鍵のファイル名
openssl x509サーバー証明書の作成
-days証明書の有効期限
-signkey 署名に使い秘密鍵

秘密鍵の作成

秘密鍵はopenssl genrsaコマンドで作成します。ファイル名は[server.key]とします。

[root@localhost conf]# openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
.........................................+++++
............+++++
e is 65537 (0x010001)
Enter pass phrase:(パスフレーズを入力)
Verifying - Enter pass phrase:(もう一度、同じパスフレーズを入力)
[root@localhost conf]#

opensslコマンドで中身を確認できます。

[root@localhost conf]# openssl rsa -in server.key -text -noout
Enter pass phrase for server.key:(パスフレーズを入力)
RSA Private-Key: (2048 bit, 2 primes)
modulus:
    00:ca:bc:46:58:92:46:a2:8c:3e:41:63:2a:9b:23:
(省略)...............................................
    b1:29
publicExponent: 65537 (0x10001)
privateExponent:
    66:54:07:91:b7:2b:4d:ea:49:96:09:6e:bc:e5:a5:
(省略)...............................................
    81
prime1:
    00:e7:6d:fd:2f:10:2e:f8:1b:6f:82:95:1b:02:fb:
(省略)...............................................
    5c:36:e0:dd:16:9a:76:6c:19
prime2:
    00:e0:42:68:7b:43:c9:1d:5a:89:f4:44:9e:64:f1:
(省略)...............................................
    0d:64:08:26:86:af:50:0f:91
exponent1:
    6c:8c:4f:4b:8a:c8:ad:00:99:4d:e3:47:d7:1f:58:
(省略)...............................................
    2c:ea:4d:68:b3:ac:45:c9
exponent2:
    00:a5:95:a3:1b:d0:d3:40:8f:47:69:4a:f9:41:43:
(省略)...............................................
    21:90:08:cc:99:89:fc:ad:61
coefficient:
    66:7a:4c:77:e8:b8:4e:a2:b4:76:21:6d:b7:87:b6:
(省略)...............................................
    ec:4f:69:ea:c6:85:bf:40
[root@localhost conf]#

catコマンドで中身を確認することもできます。

[root@localhost conf]# cat server.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,721FC6A95326E69836E5BC7A8D8CBF29

hE4iMooZud9U6h4YEUonjk4I6XquIzBiebX4Ihu0iYmZy4/1H18fctLgzUuY/5Lj
(省略)...............................................
0J+hqGDNrLZFpWefP1ujyF1qU6ySfgeCr2XE4Rz2X6hsWS+ZerGomor+bw2Ny87H
-----END RSA PRIVATE KEY-----
[root@localhost conf]#

2021年にリリースされたOpenSSL 3.0以降、genrasサブコマンドは非推奨になり、代わりにgenpkeyを利用するようです。

[root@localhost conf]# openssl genpkey -aes128 -out server.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
...........................................................................+++++
.+++++
Enter PEM pass phrase:(パスフレーズを入力)
Verifying - Enter PEM pass phrase:(もう一度、同じパスフレーズを入力)
[root@localhost conf]#

opensslコマンドで中身を確認できます。

[root@localhost conf]# openssl rsa -in server.key -text -noout
Enter pass phrase for server.key:
RSA Private-Key: (2048 bit, 2 primes)
modulus:
    00:c6:ca:28:fe:d4:00:6f:87:37:8a:e8:2f:37:af:
(省略)...............................................
    ce:31
publicExponent: 65537 (0x10001)
privateExponent:
    45:5b:af:a6:09:ae:05:3b:b6:63:5e:d3:6a:a8:75:
(省略)...............................................
    e1
prime1:
    00:f2:63:e9:9f:37:98:c3:4a:bf:2b:dc:b1:da:0d:
(省略)...............................................
    88:48:4d:61:17:ee:a8:e2:0d
prime2:
    00:d1:f3:89:bf:cf:f7:d2:6c:3a:c9:ae:18:b1:54:
(省略)...............................................
    a7:7d:da:7e:64:ad:4f:27:b5
exponent1:
    71:84:d3:74:2a:d0:93:9d:dd:1c:88:b6:8e:bd:e7:
(省略)...............................................
    e0:69:c4:f0:35:68:c8:bd
exponent2:
    00:b2:39:2b:99:01:60:dd:66:74:ad:19:b5:ea:6b:
(省略)...............................................
    6c:7d:40:8a:04:ca:be:23:f5
coefficient:
    00:e4:53:4c:97:55:c7:cd:cd:1d:38:29:07:41:58:
(省略)...............................................
    10:31:22:74:d5:a2:d9:7d:9c
[root@localhost conf]#

catコマンドで中身を確認することもできます。

[root@localhost conf]# # cat server.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,99F3789085E27A4ABAD3EF9A8B834291

uYe/ctq07dYjEblmfP4UFemGP0fwpu5cCvptnsqPoA8XthoIzuWZOGRgGpNzYjFC
(省略)...............................................
tgbyL8AFoobvv8N2WuHWVcg0RuHE2ML83MFy59rFa3GayD7FEpjaNBt3bjKL5kFF
-----END RSA PRIVATE KEY-----
[root@localhost conf]#

なお、OpenSSLのバージョンは openssl version コマンドで確認できます。

[root@localhost conf]# openssl version
OpenSSL 1.1.1k  FIPS 25 Mar 2021
[root@localhost conf]#

CSR(証明書署名要求)を作成

先ほど作成した秘密鍵をもとにCSR(証明書署名要求)を作成します。ファイル名は[server.csr]とします。

なお、あらかじめ、/etc/pki/tls/openssl.cnfに情報に必要な情報を定義しておくことで、 CSR(証明書署名要求) 作成時の対話入力を簡略化(省略)できます。

対話式で必要な情報を入力します。入力必須の項目と未入力可の項目とがあります。ここで入力した内容はSSLサーバ証明書内の所有者情報(サブジェクト)から確認できます。

[root@localhost conf]# openssl req -new -key server.key > server.csr
Enter pass phrase for server.key:(パスフレーズを入力)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka-City
Organization Name (eg, company) [Default Company Ltd]:(未入力でも可)
Organizational Unit Name (eg, section) []:(未入力でも可)
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:info@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(未入力でも可)
An optional company name []:(未入力でも可)
[root@localhost conf]# cat server.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICzTCCAbUCAQAwgYcxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTETMBEG
(省略)...............................................
FQ==
-----END CERTIFICATE REQUEST-----
[root@localhost conf]#

opensslコマンドで中身を確認できます。

[root@localhost conf]# openssl req -in server.csr -text -noout
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Osaka, L = Osaka-City, O = Default Company Ltd, CN = example.com, emailAddress = info@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:ca:bc:46:58:92:46:a2:8c:3e:41:63:2a:9b:23:
(省略)...............................................
                    b1:29
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         8d:44:99:f5:d7:4f:6b:b3:5a:b0:1a:3a:c8:ca:0a:46:44:26:
(省略)...............................................
         f4:50:60:15
[root@localhost conf]#

catコマンドで中身を確認することもできます。


[root@localhost conf]# cat server.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICzTCCAbUCAQAwgYcxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTETMBEG
(省略)...............................................
FQ==
-----END CERTIFICATE REQUEST-----
[root@localhost conf]#

自己証明書を作成

先ほど作成したCSR(証明書署名要求)をもとに自己証明書を作成します。ファイル名は[server.crt]とします。

[root@localhost conf]# openssl x509 -in server.csr -days 36500 -req -signkey server.key > server.crt
Signature ok
subject=C = JP, ST = Osaka, L = Osaka-City, O = Default Company Ltd, CN = example.com, emailAddress = info@example.com
Getting Private key
Enter pass phrase for server.key:(パスフレーズを入力)
[root@localhost conf]# cat server.crt
-----BEGIN CERTIFICATE-----
MIIDmTCCAoECFFxL9uil3JVWtZcyKEH1Z6BPrEG/MA0GCSqGSIb3DQEBCwUAMIGH
(省略)...............................................
41wHh/l4m0RO9vojyA==
-----END CERTIFICATE-----
[root@localhost conf]#

opensslコマンドで中身を確認できます。

[root@localhost conf]# openssl x509 -in server.crt -text -noout
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            5c:4b:f6:e8:a5:dc:95:56:b5:97:32:28:41:f5:67:a0:4f:ac:41:bf
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, ST = Osaka, L = Osaka-City, O = Default Company Ltd, CN = example.com, emailAddress = info@example.com
        Validity
            Not Before: Jan  7 06:38:38 2022 GMT
            Not After : Dec 14 06:38:38 2121 GMT
        Subject: C = JP, ST = Osaka, L = Osaka-City, O = Default Company Ltd, CN = example.com, emailAddress = info@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:ca:bc:46:58:92:46:a2:8c:3e:41:63:2a:9b:23:
(省略)...............................................
                    b1:29
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         4e:cd:67:04:71:c1:c2:ed:3d:bc:d2:a7:a7:0a:eb:91:81:81:
(省略)...............................................
         f6:fa:23:c8
[root@localhost conf]#

catコマンドで中身を確認することもできます。

[root@localhost conf]# cat server.crt
-----BEGIN CERTIFICATE-----
MIIDmTCCAoECFFxL9uil3JVWtZcyKEH1Z6BPrEG/MA0GCSqGSIb3DQEBCwUAMIGH
(省略)...............................................
41wHh/l4m0RO9vojyA==
-----END CERTIFICATE-----
[root@localhost conf]#

秘密鍵のパスフレーズ解除

秘密鍵にパスフレーズを設定していると、Apacheなどのサービスを起動するたびに、パスフレーズの入力を求められます。パスフレーズの解除方法は以下の通りです。

[root@localhost conf]# cp -p server.key server.key.org
[root@localhost conf]# openssl rsa -in server.key -out server-nopass.key
Enter pass phrase for server.key:(パスフレーズを入力)
writing RSA key
[root@localhost conf]#

パスフレーズ解除後もopensslコマンドにより、秘密鍵の情報を確認できます。パスフレーズの入力が求められなくなりますが、それ以外の内容は同じのようです。

[root@localhost conf]# openssl rsa -in server-nopass.key -text -noout
RSA Private-Key: (2048 bit, 2 primes)
modulus:
    00:ca:bc:46:58:92:46:a2:8c:3e:41:63:2a:9b:23:
(省略)...............................................
    b1:29
publicExponent: 65537 (0x10001)
privateExponent:
    66:54:07:91:b7:2b:4d:ea:49:96:09:6e:bc:e5:a5:
(省略)...............................................
    81
prime1:
    00:e7:6d:fd:2f:10:2e:f8:1b:6f:82:95:1b:02:fb:
(省略)...............................................
    5c:36:e0:dd:16:9a:76:6c:19
prime2:
    00:e0:42:68:7b:43:c9:1d:5a:89:f4:44:9e:64:f1:
(省略)...............................................
    0d:64:08:26:86:af:50:0f:91
exponent1:
    6c:8c:4f:4b:8a:c8:ad:00:99:4d:e3:47:d7:1f:58:
(省略)...............................................
    2c:ea:4d:68:b3:ac:45:c9
exponent2:
    00:a5:95:a3:1b:d0:d3:40:8f:47:69:4a:f9:41:43:
(省略)...............................................
    21:90:08:cc:99:89:fc:ad:61
coefficient:
    66:7a:4c:77:e8:b8:4e:a2:b4:76:21:6d:b7:87:b6:
(省略)...............................................
    ec:4f:69:ea:c6:85:bf:40
[root@localhost conf]#

一方、catコマンドで確認すると、ファイルの中身はパスフレーズ有りのものと異なるようです。

[root@localhost conf]# cat server-nopass.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyrxGWJJGoow+QWMqmyPTrnOlgtKwrB4QN8tswDzEjZ2ty+VK
(省略)...............................................
4PR3dEYPOtHhpIApye9OA4hzxLjdwbY5q5zxo/LiduxPaerGhb9A
-----END RSA PRIVATE KEY-----
[root@localhost conf]#

秘密鍵、CSR(証明書署名要求)、証明書(自己証明書)などの作成については、以下の記事が参考になりました。

サーバ証明書・TLS/SSL通信・HTTPS暗号アルゴリズム 実践解説【高校情報1・情報セキュリティ】|高校情報科・情報処理技術者試験対策の突破口ドットコム|note
■■はじめに■■ サーバ証明書、HTTPS、TLS/SSL技術はITパスポートレベルでも扱われていますが、あまりにも抽象的なので、試験の為の勉強(実務でほとんど役に立たない)と感じています。 高校情報1も範囲ではありますが、サーバ証明書を実際にCSR生成から行ったことのある方は、ほとんどいないと思われます。 教科書...
RSA鍵、証明書のファイルフォーマットについて - Qiita
RSAの公開鍵暗号技術を利用するためには、鍵や証明書のファイルを扱う必要があるため、そのファイルフォーマットについて理解しておく必要があります。 実際、いろんな拡張子が登場するので、それぞれの意味を理解していないとすぐにわけがわから...
OpenSSLコマンドの備忘録 - Qiita
OpenSSLコマンドはいつも忘れてしまうので備忘に。 秘密鍵の作成 # 暗号化しない openssl genrsa -out server.key 1024 # 3DESを使ってパスフレーズで暗号化する openssl ge...

設定ファイルの修正

上記で作成した秘密鍵および各種証明書を設定ファイルで定義します。

ApacheとNginxで設定ファイルおよび定義項目が微妙に異なります。

 ApacheNginx
設定ファイル/etc/httpd/conf.d/ssl.conf/etc/nginx/nginx.conf
証明書SSLCertificateFilessl_certificate
秘密鍵SSLCertificateKeyFilessl_certificate_key
中間証明書SSLCertificateChainFile

Apacheの場合、SSLの設定ファイル(/etc/httpd/conf.d/ssl.conf)を編集します。 SSLの設定ファイル(/etc/httpd/conf.d/ssl.conf) はmod_sslをインストールしたタイミングで自動的に作成されます。

SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/server-nopass.key

Nginxの場合、設定ファイル(/etc/nginx/nginx.conf)に以下の情報を追記(コメントアウトして編集)します。

    server {
        listen 443 default ssl;
        ssl on;
        ssl_certificate "/etc/httpd/conf/server.crt";
        ssl_certificate_key "/etc/httpd/conf/server-nopass.key";
    }

なお、NginxおよびApacheの2.4.8以降では、中間CA証明書の設定値であるSSLCertificateChainFileディレクティブは廃止(非推奨)になっているため、サーバ証明書の末尾に中間CA証明書を追記して、SSLCertificateFileディレクティブにて定義する必要があります。

スポンサーリンク

まとめ

SSL/TLSの仕組みや証明書の構築手順には関連する知識が多く、とても難しく感じます。最低限、この辺りの知識を理解することで、全体像が分かると思います。

  • SSL/TLSの目的、役割、必要性
  • 各技術の推奨バージョン、暗号化アルゴリズム、鍵長など
  • 共通鍵暗号方式と公開鍵暗号方式(デジタル署名)の特徴、違い
  • 証明書の仕組み、認証局の役割、証明書チェーンの仕組み
  • X.509証明書のフォーマット(内容)
  • クロスルート証明書、証明書失効リストは後回しで良い
  • 自己証明書(オレオレ証明書)の仕組み、実際に構築してみる

一番有効な勉強方法は自己証明書(オレオレ証明書)を構築しながら、不明点を解消していくことだと思いました。

また、前提知識として、Webサーバ(ApacheまたはNginx)とDNSサーバ(BIND)の最低限の知識は必要です。

コメント

タイトルとURLをコピーしました