変更要約: 初版(主題2.09・副主題2.09.1〜2.09.4に対応)
3.2OpenSSLとHTTPSの設定
OpenSSLを使ったApacheのHTTPS化を学びます。証明書・秘密鍵の保管場所(/etc/ssl/・/etc/pki/)、SSLEngineでのSSL/TLS有効化、SSLCertificateFile・SSLCertificateKeyFileによる証明書と秘密鍵の指定、SSLProtocol・SSLCipherSuiteによるプロトコル/暗号スイートの制御、SSLCACertificateFile・SSLCACertificatePathによるCA証明書の指定、opensslコマンドでの鍵・証明書操作を押さえます。
平文のHTTPは通信内容が盗聴・改ざんされうるため、実運用のWebサーバーはほぼ例外なくHTTPS化されています。ApacheでのTLS設定と、その裏側で鍵・証明書を扱うOpenSSLの基本操作は、L2で問われる実務スキルの中核です。
3.2.1証明書・鍵の保管場所とopenssl操作
- 証明書・秘密鍵・CA証明書は慣習的に/etc/ssl/(Debian系に多い)または/etc/pki/(RHEL系に多い)配下に配置されます。
- opensslコマンドは秘密鍵の生成、証明書署名要求(CSR)の作成、自己署名証明書の発行、証明書内容の確認など、鍵・証明書のライフサイクル全般を扱います。
3.2.2ApacheのTLSディレクティブ
- SSLEngine onでそのVirtualHostにSSL/TLSを有効化。SSLCertificateFileでサーバー証明書、SSLCertificateKeyFileで対応する秘密鍵のパスを指定します(証明書と鍵は必ずペア)。
- SSLProtocolで許可するプロトコルバージョン(例:古いSSLv3を無効化しTLSのみ許可)、SSLCipherSuiteで許可する暗号スイートの組み合わせを制御し、脆弱な設定を排除します。
- クライアント証明書認証などでCAを検証させたい場合はSSLCACertificateFile(1ファイルにまとめたCA証明書)またはSSLCACertificatePath(CA証明書を格納したディレクトリ)を指定します。
「SSLCertificateFile=証明書、SSLCertificateKeyFile=秘密鍵」「SSLProtocol=許可プロトコル、SSLCipherSuite=許可暗号スイート」「SSLCACertificateFile=1ファイル、SSLCACertificatePath=ディレクトリ」の対応関係が定番です。SSLEngineをonにし忘れると証明書を指定していてもHTTPSが有効になりません。
典型的な導入手順を追うと理解が深まります。まずopensslで秘密鍵を生成し、その鍵をもとにCSR(証明書署名要求)を作成して認証局へ送るか、社内検証用なら自己署名証明書をその場で発行します。得られた証明書と秘密鍵は/etc/ssl/や/etc/pki/配下に配置し、パーミッションを絞って秘密鍵が読めるのはroot(またはApacheの実行ユーザー)に限定します。ApacheのVirtualHost設定では、まずSSLEngine onでTLSを有効化し、SSLCertificateFile /etc/ssl/certs/example.crt、SSLCertificateKeyFile /etc/ssl/private/example.keyのように証明書と鍵のパスをそれぞれ指定します。ここで証明書と鍵の組み合わせを取り違えると起動時にエラーになるため、ペアの整合性は最初に確認すべき点です。さらにSSLProtocol -all +TLSv1.2 +TLSv1.3のように古いプロトコルを明示的に無効化し、SSLCipherSuiteで弱い暗号を除外した組み合わせのみを許可することで、脆弱ないわゆる「なんでも許可」の設定を避けます。クライアント証明書による相互TLSが必要な場合は、SSLCACertificateFileまたはSSLCACertificatePathで信頼するCAの情報を追加します。これらのディレクティブはApache固有ですが、鍵や証明書そのものの生成・検証・変換は一貫してopensslコマンドの守備範囲です。
| ディレクティブ | 指定内容 | 備考 |
|---|---|---|
| SSLEngine | SSL/TLSの有効化 | onにしないと他の設定があっても無効 |
| SSLCertificateFile | サーバー証明書 | SSLCertificateKeyFileと必ずペア |
| SSLCertificateKeyFile | 秘密鍵 | パーミッションを限定 |
| SSLCACertificateFile / SSLCACertificatePath | 信頼するCA証明書 | ファイル1つ/ディレクトリ |
ひっかけ: 「SSLCertificateKeyFileに証明書を、SSLCertificateFileに秘密鍵を指定する」ように役割を逆に書いた選択肢は誤りです。Fileが証明書、KeyFileが秘密鍵です。また「SSLCipherSuiteはプロトコルバージョンを指定する」も誤り=プロトコルバージョンはSSLProtocol、暗号スイートの組み合わせはSSLCipherSuiteという別ディレクティブです。
3.2.3この節のまとめ
- SSLEngine onで有効化、SSLCertificateFile=証明書/SSLCertificateKeyFile=秘密鍵。保管は/etc/ssl/・/etc/pki/
- SSLProtocol=許可プロトコル/SSLCipherSuite=許可暗号、CA検証はSSLCACertificateFile(1ファイル)/SSLCACertificatePath(ディレクトリ)。鍵・証明書操作はopenssl
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. ApacheのVirtualHostでHTTPSを有効化し、証明書と秘密鍵をそれぞれ指定したい。正しい組み合わせは?
Q2. 脆弱な古いプロトコル(SSLv3等)を無効化し、TLS1.2以降のみを許可したい。使うべきディレクティブは?
Q3. クライアント証明書認証のため、信頼するCA証明書をまとめた1つのファイルを指定したい。適切なディレクティブは?

