Skip to main content

WebサイトのSSL/TSL化

note

この資料は大部分をAIで生成しています。

TLS(Transport Layer Security)は、インターネット上でデータを暗号化して安全に通信するためのプロトコルです。TLSは、ウェブサイトのセキュリティを強化し、ユーザーのプライバシーを保護するために広く使用されています。TLSは、HTTP通信を暗号化するために使用されることが多く、HTTPS(HTTP Secure)として知られています。

SSL(Secure Sockets Layer)は、TLSの前身であり、同様の目的で使用されていましたが、現在ではTLSが主流となっています。

TLSの主な機能は以下の通りです。

  1. 暗号化: TLSは、通信内容を暗号化することで、第三者がデータを傍受しても内容を理解できないようにします。これにより、ユーザーの個人情報やクレジットカード情報などが保護されます。
  2. 認証: TLSは、サーバーの身元を確認するためにデジタル証明書を使用します。これにより、ユーザーは接続しているウェブサイトが正当なものであることを確認できます。
  3. データの整合性: TLSは、通信中にデータが改ざんされていないことを保証します。これにより、データが途中で変更されるリスクが軽減されます。

TLSはデジタル証明書を使用して、サーバーの身元を確認し、通信を暗号化します。デジタル証明書は、信頼できる認証局(CA: Certificate Authority)によって発行され、ウェブサイトの所有者情報や公開鍵などが含まれています。

デジタル証明書について

デジタル証明書は、公開鍵暗号方式に基づいており、主に以下の要素で構成されています。

  • 公開鍵(Public Key): 通信相手に提供される鍵で、データの暗号化署名の検証に使用されます。
  • 秘密鍵(Private Key): 公開鍵に対応する鍵で、データの復号化署名の生成に使用されます。秘密鍵は厳重に管理され、第三者に知られてはなりません。
  • 証明書の所有者情報: 証明書の所有者(個人や組織)の名前、住所、ドメイン名などの情報が含まれます。
  • 発行者情報: 証明書を発行した認証局(CA)の名前や情報が含まれます。
  • 有効期限: 証明書の有効期間が設定されており、期限が切れると証明書は無効になります。
  • 署名: 証明書の内容が改ざんされていないことを保証するために、発行者がデジタル署名を行います。

PKIとは

PKI(Public Key Infrastructure)は、公開鍵暗号方式を利用したセキュリティ基盤のことを指します。PKIは、デジタル証明書の発行、管理、検証、および失効を行うための一連の技術と手続きを含んでいます。PKIは、インターネット上で安全な通信を実現するために不可欠な要素です。

PKIの主な要素は以下の通りです。

  1. 認証局(CA: Certificate Authority): デジタル証明書を発行し、管理する組織です。CAは、証明書の所有者の身元を確認し、信頼性を保証します。
  2. 登録局(RA: Registration Authority): 証明書の発行を申請するユーザーの身元確認を行う役割を担います。RAは、CAに対して証明書の発行を依頼します。
  3. 証明書リポジトリ: 発行されたデジタル証明書を保存し、公開するためのデータベースです。ユーザーはここから証明書を取得できます。
  4. 証明書失効リスト(CRL: Certificate Revocation List): 失効した証明書の一覧を管理するリストです。ユーザーは通信相手の証明書が有効かどうかを確認するためにCRLを参照します。
  5. ユーザー: PKIを利用して安全な通信を行う個人や組織です。ユーザーは、デジタル証明書を使用して自分の身元を証明し、通信の暗号化や署名の検証を行います。

WebのTLSの利用

WebにおけるTLSの利用は、主にHTTPS(HTTP Secure)として知られています。HTTPSは、HTTPプロトコルにTLSを組み合わせたもので、ウェブサイトとユーザー間の通信を暗号化し、セキュリティを強化します。以下に、WebにおけるTLSの利用方法とその利点を説明します。

  1. HTTPSの導入: ウェブサイトがTLSを利用するためには、まずデジタル証明書を取得し、ウェブサーバにインストールする必要があります。証明書は、信頼できる認証局(CA)から取得することが一般的です。証明書をインストールした後、ウェブサーバの設定を変更してHTTPSを有効にします。
  2. 通信の暗号化: HTTPSを使用すると、ウェブサイトとユーザー間の通信がTLSによって暗号化されます。これにより、第三者が通信内容を傍受しても、内容を理解できなくなります。これにより、ユーザーの個人情報やクレジットカード情報などが保護されます。
  3. 認証と信頼性の向上: TLSは、デジタル証明書を使用してウェブサイトの身元を確認します。ユーザーは、ブラウザのアドレスバーに表示される鍵アイコンや「https://」の表示を確認することで、接続しているウェブサイトが正当なものであることを確認できます。これにより、フィッシング攻撃などのリスクが軽減されます。
  4. SEOの向上: Googleなどの検索エンジンは、HTTPSを使用しているウェブサイトを優先的に評価する傾向があります。これにより、TLSを導入することで、ウェブサイトの検索ランキングが向上する可能性があります。
  5. ユーザーの信頼獲得: HTTPSを使用することで、ユーザーはウェブサイトが安全であると感じやすくなります。これにより、ユーザーの信頼を獲得し、ウェブサイトの利用率やコンバージョン率の向上につながることがあります。

ブラウザとWebサーバの処理の流れ

  1. 接続の確立: ユーザーがブラウザでHTTPSのURLにアクセスすると、ブラウザはウェブサーバに接続要求を送信します。
  2. サーバ証明書の送信: ウェブサーバは、デジタル証明書をブラウザに送信します。この証明書には、サーバの公開鍵や所有者情報が含まれています。
  3. 証明書の検証: ブラウザは、受信した証明書を検証します。これには、証明書の有効期限、発行者の信頼性、証明書の失効状況などが含まれます。
  4. セッション鍵の生成: 証明書が有効であると判断された場合、ブラウザはセッション鍵を生成し、サーバの公開鍵を使用して暗号化します。このセッション鍵は、後続の通信で使用される対称鍵です。
  5. セッション鍵の送信: ブラウザは、暗号化されたセッション鍵をウェブサーバに送信します。
  6. セッション鍵の復号化: ウェブサーバは、自身の秘密鍵を使用して、受信したセッション鍵を復号化します。
  7. 暗号化通信の開始: 以降、ブラウザとウェブサーバは、セッション鍵を使用して通信内容を暗号化し、安全な通信が確立されます。

サーバ証明書の検証

サーバ証明書の検証は、ブラウザがウェブサーバから受信したデジタル証明書の有効性と信頼性を確認するプロセスです。以下に、サーバ証明書の検証手順を説明します。

  1. 証明書の有効期限の確認: ブラウザは、証明書の発行日と有効期限を確認します。証明書が有効期限内であることを確認し、期限切れの場合は警告を表示します。
  2. 発行者の信頼性の確認: ブラウザは、証明書の発行者(認証局: CA)が信頼できるかどうかを確認します。ブラウザには、信頼されたCAのリストが組み込まれており、発行者がこのリストに含まれている場合、証明書は信頼されます。
  3. 証明書のチェーンの確認: ブラウザは、証明書のチェーンを確認します。これは、サーバ証明書が中間CA証明書を経由してルートCA証明書に連結されていることを確認するプロセスです。チェーンが正しく連結されていない場合、警告が表示されます。
  4. 証明書の失効状況の確認: ブラウザは、証明書が失効していないことを確認します。これには、CRL(Certificate Revocation List)やOCSP(Online Certificate Status Protocol)を使用して、証明書の失効状況をチェックします。失効している場合、警告が表示されます。
  5. ドメイン名の一致の確認: ブラウザは、証明書に記載されているドメイン名が、ユーザーがアクセスしようとしているウェブサイトのドメイン名と一致していることを確認します。一致しない場合、警告が表示されます。

Apache HTTP ServerでのTLS設定

Apache HTTP ServerでTLSを設定する手順は以下の通りです。

自己署名証明書の作成

証明書を作成するための設定ファイルを作成します。

cd # ホームディレクトリに移動
vi host1.example1.jp.cnf # ファイル名は任意
[ req ]
default_bits = 2048 # 鍵長(ビット数)
prompt = no # 対話式入力を無効化
default_md = sha256 # 署名アルゴリズム
req_extensions = req_ext # 拡張設定の指定
distinguished_name = dn # 識別名のセクション指定

[ dn ]
C = JP # 国名(Japan)
ST = Ibaraki # 都道府県名
L = Jyoso # 市区町村名
O = Polytech Center # 組織名
OU = IS # 部署名
CN = example1.jp # コモンネーム(FQDN)

[ req_ext ]
subjectAltName = @alt_names # SAN(Subject Alternative Name)の指定

[ alt_names ]
DNS.1 = example1.jp # SAN: DNS名1
DNS.2 = host1.example1.jp # SAN: DNS名2
DNS.3 = www.example1.jp # SAN: DNS名3
IP.1 = 192.168.56.101 # SAN: IPアドレス
info

SAN(Subject Alternative Name)は、証明書に複数のドメイン名やIPアドレスを含めるための拡張フィールドです。SANを使用することで、1つの証明書で複数のホスト名をカバーできます。

OpenSSLコマンドで自己署名証明書を作成します。秘密鍵と証明書ファイルを作成します。 証明書に公開鍵と所有者情報、SAN情報が含まれます。 秘密鍵は/etc/pki/tls/private/server.keyに、証明書は/etc/pki/tls/certs/server.crtに保存されます。

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.crt -config host1.example1.jp.cnf
オプション説明
-x509X.509形式の証明書を生成
-newkey rsa:20482048ビットのRSA鍵
-nodesパスフレーズなし
-days 365有効期限1年
-keyout秘密鍵の保存先
-out証明書の保存先
-config設定ファイルの指定
info

RSA鍵は、公開鍵暗号方式で広く使用される鍵の形式です。2048ビットの鍵長は、現在のセキュリティ基準において十分な強度を提供します。その他の鍵形式として、ECDSA(Elliptic Curve Digital Signature Algorithm)もあります。ECDSAは、同じセキュリティレベルを提供しながら、より短い鍵長で済むため、パフォーマンスが向上します。

ApacheのSSL設定ファイルを編集します。

sudo vi /etc/httpd/conf.d/ssl.conf

ssl.confの編集個所の差分情報を表示です。 SSLCertificateFileに証明書ファイルのパスを、SSLCertificateKeyFileに秘密鍵ファイルのパスを指定します。

差分を表示するためのgitコマンドをインストールします。

sudo dnf install -y git

次の表示例は差分 (2つのファイルの差) を表示しています。

$ git diff --no-index ./ssl.conf /etc/httpd/conf.d/ssl.conf
diff --git a/./ssl.conf b/etc/httpd/conf.d/ssl.conf
index d28adf3..47e62ec 100644
--- a/./ssl.conf
+++ b/etc/httpd/conf.d/ssl.conf
@@ -82,7 +82,8 @@ SSLProxyCipherSuite PROFILE=SYSTEM
# Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
# require an ECC certificate which can also be configured in
# parallel.
-SSLCertificateFile /etc/pki/tls/certs/localhost.crt
+#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
+SSLCertificateFile /etc/pki/tls/certs/server.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
@@ -90,7 +91,8 @@ SSLCertificateFile /etc/pki/tls/certs/localhost.crt
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
# ECC keys, when in use, can also be configured in parallel
-SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
+#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
+SSLCertificateKeyFile /etc/pki/tls/private/server.key

# Server Certificate Chain:
# Point SSLCertificateChainFile at a file containing the

ファイアウォールの設定を行い、HTTPとHTTPSのサービスを許可します。

sudo firewall-cmd --add-service=https --permanent # HTTPSサービスを許可
sudo firewall-cmd --add-service=http --permanent # HTTPサービスを許可
sudo systemctl enable httpd --now # Apacheを有効化・起動
sudo firewall-cmd --reload # ファイアウォール設定を反映
sudo firewall-cmd --list-all # 現在のファイアウォール設定を表示

ブラウザでhttps://host1.example1.jpにアクセスします。 自己署名証明書のため、警告が表示されますが、無視して続行します。 デジタル証明書を確認します。

HTTPのHTTPSへのリダイレクト(オプション)

HTTP(ポート80)でアクセスされた場合に、自動的にHTTPS(ポート443)にリダイレクトする設定を行います。 Apacheに設定ファイルを追加します。

sudo vi /etc/httpd/conf.d/ssl.conf
<VirtualHost *:80>
ServerName host1.example1.jp
Redirect permanent / https://host1.example1.jp/
</VirtualHost>

Apacheを再起動します。

sudo systemctl restart httpd

ブラウザでhttp://host1.example1.jpにアクセスし、HTTPSにリダイレクトされることを確認します。