はじめに
LinuC 303の「主題325.2」では、サーバー認証およびクライアント認証におけるX.509証明書の活用方法、ならびにApache HTTPD(2.4以降)による証明書ベースのユーザー認証の理解と実装能力が求められます。
TLS(旧SSL)プロトコルの仕組み、証明書の使い方、Apacheのmod_sslの設定、セキュリティ脅威への対応策など、実務で必要な幅広い知識を身につけましょう。
1. TLS/SSLとX.509証明書の基本
1.1 TLS/SSLの役割
TLS(Transport Layer Security)は、インターネット通信を暗号化するためのプロトコルで、以下の3つの基本目的があります:
- 機密性(Confidentiality):盗聴を防ぐ
- 完全性(Integrity):改ざんを検知
- 認証(Authentication):正当な相手との通信を保証
TLSはSSLの後継。現在、TLS 1.2 以降が推奨されています(TLS 1.0/1.1は非推奨)。
1.2 X.509証明書とは?
X.509証明書は、公開鍵とその所有者情報を含む電子証明書です。主に以下の用途に使われます:
- サーバー認証:Webブラウザが通信相手(サーバー)の正当性を検証
- クライアント認証:サーバーが接続元クライアントの正当性を検証
- データ署名と暗号化
2. トランスポート層の脅威とセキュリティ対策
2.1 代表的な脅威
- Man-in-the-Middle攻撃(MITM)
攻撃者が通信の途中に介入し、通信を盗聴または改ざんする。 - ダウングレード攻撃
クライアントとサーバーの間で弱い暗号プロトコルにフォールバックさせる。
3. Apache HTTPD 2.4以降でのTLS/SSLの実装
3.1 必要なモジュールと設定ファイル
- モジュール:
mod_ssl - 設定ファイル:
httpd.conf,ssl.conf(通常は/etc/httpd/conf.d/ssl.conf)
モジュールの有効化
a2enmod ssl # Debian系
サンプル設定
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
SSLCertificateChainFile /etc/ssl/certs/intermediate.crt
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
SSLHonorCipherOrder on
</VirtualHost>
3.2 HTTPSの強化設定
- SNI(Server Name Indication):1台のサーバーで複数のSSL証明書を利用可能にする
- HSTS(HTTP Strict Transport Security):ブラウザにHTTPSのみを強制する
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
4. Apacheでのクライアント証明書によるユーザー認証
4.1 証明書ベース認証の仕組み
- クライアントが証明書を提示
- サーバーがその証明書のCAを信頼しているか検証
- 検証が成功すればアクセスを許可
設定例
SSLVerifyClient require
SSLVerifyDepth 2
SSLCACertificateFile /etc/ssl/certs/ca.crt
<Location "/secure/">
SSLRequireSSL
Require ssl-verify-client
</Location>
5. OCSP Staplingによる証明書失効確認の高速化
- OCSP(Online Certificate Status Protocol):証明書が失効しているか確認
- OCSP Stapling:Webサーバーが証明書の有効性情報を事前取得してクライアントへ提供(パフォーマンス向上)
設定例
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
6. SSL/TLS通信のテスト方法
OpenSSLでの接続テスト
openssl s_client -connect example.com:443
出力例のポイント
- 証明書チェーン(Certificate chain)
- セッションプロトコル(Protocol, Cipher)
- Server public key info
7. 重要なファイルと用語のまとめ
| 用語/ファイル | 内容 |
|---|---|
httpd.conf | Apache HTTPDの主設定ファイル |
mod_ssl | ApacheでSSLを扱うモジュール |
openssl | TLS/証明書管理を行うCLIツール |
| 中間認証局 | ルートCAとサーバー証明書をつなぐCA |
| Cipherの設定 | 暗号スイートの選定と順序設定 |
SSLCertificateFile | サーバーの公開鍵証明書 |
SSLCertificateKeyFile | サーバーの秘密鍵ファイル |
SSLCACertificateFile | クライアント証明書検証用CA証明書 |
章末問題(理解度チェック)
以下の各設問に対して、最も適切な選択肢を1つ選んでください。
問題1
TLS/SSLプロトコルの主な目的として正しくないものはどれか?
A. 通信内容の機密性を確保する
B. データの改ざんを検出する
C. クライアント側にウイルスがないことを確認する
D. 通信相手の正当性を認証する
解説
正解:C
TLS/SSLはウイルススキャンを行いません。通信の安全性(暗号化、完全性、認証)を確保するためのものです。
問題2
次のうち、Man-in-the-Middle(MITM)攻撃の説明として最も適切なものはどれか?
A. 攻撃者がサーバーにウイルスを送信して破壊する
B. 攻撃者が通信経路に割り込み、内容を盗聴または改ざんする
C. 攻撃者がTLS通信を無効化するような設定をサーバーに適用する
D. 攻撃者がファイアウォールをバイパスして内部に侵入する
解説
正解:B
MITM攻撃は通信の途中に割り込むことで、データの盗聴や改ざんを行います。
問題3
Apache HTTPDでクライアント証明書認証を設定する際に使われるディレクティブはどれか?
A. SSLEngine off
B. SSLCipherSuite
C. SSLVerifyClient
D. SSLCertificateChainFile
解説
正解:C
SSLVerifyClientはクライアント証明書の検証の有効化に使います。
問題4
OCSP Staplingについての正しい説明はどれか?
A. クライアントが毎回OCSPレスポンダーに接続し、証明書の有効性を確認する仕組み
B. サーバーが証明書の署名に使う鍵の種類
C. OCSPレスポンスをサーバーが事前取得し、クライアントに渡す仕組み
D. 中間認証局による証明書失効管理の方法
解説
正解:C
OCSP Staplingは、サーバーが事前に失効情報を取得し、クライアントに渡すことで通信の高速化と信頼性を高めます。
問題5
以下のうち、openssl s_client コマンドで確認できる内容として誤っているものはどれか?
A. 使用しているTLSのバージョン
B. クライアントのIPアドレス
C. サーバー証明書のチェーン
D. 使用中の暗号スイート(Cipher)
解説
正解:B
openssl s_clientはクライアントのIPアドレスは表示しません。サーバーの証明書、TLSバージョン、Cipherなどを確認できます。
コメント