「保護されていない通信」と表示される恐怖。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
今回から全8回にわたり、Webサーバー管理者にとって避けては通れない「SSL/TLS証明書とHTTPS化」についての集中講座をスタートします!
皆さんは、自分の管理しているWebサイトにアクセスした時、ブラウザのアドレスバーに「保護されていない通信」や「安全ではありません」という警告が出ているのを見たことがありませんか?
先生、それ気になってました!
僕が作ったテスト用のサイト、Chromeで見るとアドレスバーに赤い警告が出るんです。
別に怪しいサイトじゃないのに、なんだか犯罪者のサイトみたいに見えてしまって…。
これって、どうやったら緑色の「鍵マーク」になるんですか?
それは通信が「暗号化されていない(HTTP)」からよ。
インターネットは「盗聴」や「改ざん」のリスクと隣り合わせ。
Webサイトを「HTTPS(SSL/TLS)」に対応させて、通信を暗号化し、サイトの身元を証明する必要があるの。
今はGoogleもHTTPS化を強く推奨しているから、SEO(検索順位)にも影響する重要な技術なのよ!
本連載では、世界で最も使われているWebサーバーの一つである Apache HTTP Server (httpd) を使い、AlmaLinux 9 上で安全なHTTPSサイトを構築する手順をゼロから学びます。
第1回は、技術の仕組みを理解し、まずは無料で試せる「自己署名証明書」を使ってHTTPS通信を成功させるところまでを目指します。
🔒 Apache SSL/TLS 完全攻略講座(全8回)目次
現在地:【第1回】Webサーバーの常時SSL化!TLSの仕組みと自己署名証明書の作成
- 【第2回】無料証明書のスタンダード!Let’s Encrypt (Certbot) の導入と自動更新
- 【第3回】企業サイトならこれ!有料証明書(JPRS/GlobalSign)のCSR生成とインストール
- 【第4回】セキュリティ強度を上げる!プロトコル(TLS1.3)と暗号スイートの最適化
- 【第5回】1つのIPで複数ドメイン!バーチャルホストでのSSL設定とSNIの仕組み
- 【第6回】「繋がらない」を解決!中間証明書チェーンとトラブルシューティング
- 【第7回】運用を楽にする!証明書期限監視と更新プロセスの自動化
- 【第8回】大規模構成!ロードバランサ連携とHTTP/2・HTTP/3 (QUIC) 対応
第1章:SSL/TLS の仕組みを理解しよう
作業を始める前に、言葉の定義と仕組みを整理しましょう。
ここを理解していないと、後のトラブルシューティングで詰まります。
1. SSL と TLS の違い
一般的に「SSL(Secure Sockets Layer)」と呼ばれていますが、現在の技術的な正式名称は「TLS(Transport Layer Security)」です。
- SSL: Netscape社が開発した古い規格。脆弱性が見つかり、現在は使用禁止(SSL 3.0まで)。
- TLS: SSLを継承・標準化した規格。現在は TLS 1.2 および TLS 1.3 が主流。
「SSL」という言葉があまりに普及してしまったため、今でも「SSL証明書」と呼ばれますが、実際に行っている通信は「TLS」です。
本講座でも便宜上「SSL/TLS」や「SSL証明書」と表記しますが、中身はTLSであることを意識してください。
2. HTTPSが提供する「3つの価値」
HTTPをHTTPSにする(Sをつける)ことで、以下の3つが実現されます。
| 機能 | 説明 | リスク対策 |
|---|---|---|
| 暗号化 (Encryption) |
通信内容を第三者が読めないように暗号化する。 | 盗聴(パスワードやカード情報の流出) |
| 認証 (Authentication) |
「アクセスしているサーバーが本物である」ことを証明する。 | なりすまし(フィッシング詐欺) |
| 改ざん検知 (Integrity) |
通信途中でデータが書き換えられていないかチェックする。 | データの改ざん(ウイルス混入など) |
3. SSLハンドシェイク(通信開始の握手)
HTTPS通信が始まる時、ブラウザとサーバーの間では以下のようなやり取り(ハンドシェイク)が一瞬で行われています。
- Client Hello: ブラウザが「HTTPSで通信したい!対応している暗号方式はこれだよ」と伝える。
- Server Hello: サーバーが「OK、この暗号方式を使おう。これが私の証明書(公開鍵付き)だよ」と返す。
- 検証: ブラウザが受け取った証明書が信頼できるか(認証局の署名があるか)確認する。
- 鍵交換: 証明書の公開鍵を使って「共通鍵(セッションキー)」の元データを暗号化して送る。
- 暗号化通信開始: 生成した共通鍵を使って、実際のWebページのデータを暗号化してやり取りする。
この第2ステップでサーバーが提示するのが「SSLサーバー証明書」です。
これがなければHTTPS通信は成立しません。
第2章:環境準備とmod_sslの導入
それでは、実際にAlmaLinux 9のサーバーでHTTPS環境を作っていきましょう。
1. Apache (httpd) のインストール
まずは基本となるWebサーバーが入っていなければ始まりません。
# インストール sudo dnf install httpd -y # 起動と自動起動 sudo systemctl start httpd sudo systemctl enable httpd # ファイアウォール設定(HTTP/HTTPS許可) sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --reload
2. mod_ssl のインストール
Apache標準の状態ではSSL機能は有効になっていません。
SSL/TLS機能を提供するモジュール mod_ssl を追加インストールします。
sudo dnf install mod_ssl -y
インストールが完了すると、/etc/httpd/conf.d/ ディレクトリの中に ssl.conf という重要な設定ファイルが生成されます。
これがHTTPSの設定を司るファイルです。
3. インストール後の確認
モジュールが読み込まれているか確認します。
httpd -M | grep ssl
ssl_module (shared) と表示されれば準備OKです。
第3章:OpenSSLによる「自己署名証明書」の作成
証明書には、大きく分けて2種類あります。
- 公的な証明書: 認証局(CA)にお金を払ったりして発行してもらうもの。ブラウザで「安全」と表示される。
- 自己署名証明書(オレオレ証明書): 自分で勝手に発行したもの。暗号化はできるが、ブラウザで「警告」が出る。
今回は練習として、後者の「自己署名証明書」を作成します。
社内テスト環境や、IPアドレスでアクセスするだけの管理画面ならこれで十分な場合もあります。
1. 証明書ファイルの保存場所
RHEL/AlmaLinux系では、証明書を置く標準的なディレクトリが決まっています。
- 証明書(公開鍵):
/etc/pki/tls/certs/ - 秘密鍵:
/etc/pki/tls/private/
作業ディレクトリに移動します。
cd /etc/pki/tls/private/
2. 秘密鍵(Private Key)の生成
まずは、誰にも見せてはいけない「秘密鍵」を作ります。
暗号化方式はRSA、鍵長は2048bitが一般的です。
# server.key という名前で生成 sudo openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048 # 権限を変更(root以外読めないようにする) sudo chmod 600 server.key
3. CSR(証明書署名要求)の生成
次に、証明書を発行するための申請書(CSR)を作ります。
ここには「国」や「組織名」、「ドメイン名(Common Name)」などの情報が含まれます。
sudo openssl req -new -key server.key -out server.csr
実行すると、いくつか質問されます。
自己署名なので適当で構いませんが、「Common Name」だけはサーバーのIPアドレスやホスト名を入れるのが通例です。
Country Name (2 letter code) [XX]:JP State or Province Name (full name) []:Tokyo Locality Name (eg, city) [Default City]:Shibuya Organization Name (eg, company) [Default Company Ltd]:MyTestServer Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:192.168.1.100 <-- 重要 Email Address []:
4. 証明書(CRT)の生成(自己署名)
最後に、CSRに対して「自分の秘密鍵」で署名を行い、証明書(CRT)を完成させます。
有効期限は -days 365 で1年間に設定してみます。
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out /etc/pki/tls/certs/server.crt
これで以下の2つの重要なファイルが揃いました。
- 秘密鍵:
/etc/pki/tls/private/server.key - 証明書:
/etc/pki/tls/certs/server.crt
💡 コラム:PEM形式とは?
作成されたファイルの中身を cat で見てみると、-----BEGIN CERTIFICATE----- という文字で始まる乱数のようなテキストになっています。
これをPEM形式(Base64エンコードされたデータ)と呼びます。
ApacheやNginxなどのWebサーバーは、このテキストデータを読み込んで動作します。
第4章:Apacheの設定(ssl.conf)
作成した鍵と証明書を使うように、Apacheを設定します。/etc/httpd/conf.d/ssl.conf を編集します。
1. 設定ファイルのバックアップ
sudo cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak
2. ssl.conf の編集
sudo nano /etc/httpd/conf.d/ssl.conf
以下の2箇所を探し、先ほど作成したファイルのパスに書き換えます。
(mod_sslのデフォルトパスと同じ場所に作ったので、実は変更不要の場合も多いですが、明示的に指定します)
# サーバー証明書のパス SSLCertificateFile /etc/pki/tls/certs/server.crt # 秘密鍵のパス SSLCertificateKeyFile /etc/pki/tls/private/server.key
3. 構文チェックと再起動
設定にミスがないかチェックします。
sudo apachectl configtest
Syntax OK と出たら、Apacheを再起動して設定を反映させます。
sudo systemctl restart httpd
第5章:ブラウザでの動作確認と「警告」の正体
いよいよブラウザからアクセスしてみましょう。
URLは http:// ではなく https://(サーバーのIPアドレス) です。
1. 「この接続はプライバシーが保護されていません」
アクセスすると、ChromeやEdgeでは真っ赤な警告画面が表示されるはずです。
「攻撃者が、情報を盗み取ろうとしている可能性があります」などと怖いことが書かれています。
失敗ではありません。これが正常です。
なぜなら、今回使ったのは「自己署名証明書(オレオレ証明書)」だからです。
「通信の暗号化」はできていますが、「サーバーの身元保証(認証)」ができていないため、ブラウザが「誰だかわからないサーバーだよ!危険かもよ!」と警告してくれているのです。
2. 無視してアクセスする
Chromeの場合、「詳細設定」をクリックし、「(IPアドレス) にアクセスする(安全ではありません)」というリンクをクリックすれば、Webサイトが表示されます。
アドレスバーを見ると、鍵マークに斜線が入っていたり、「保護されていない通信」と出ているはずです。
しかし、詳細情報を見ると「証明書:有効」となっており、通信経路自体は暗号化されています。
まとめ:まずは暗号化の第一歩を踏み出した
お疲れ様でした!
これで、あなたのWebサーバーはHTTPSでの通信を受け付けられるようになりました。
今回の重要ポイント:
- SSL/TLSは「暗号化」「認証」「改ざん検知」を提供する。
- Apacheには
mod_sslモジュールが必要。 opensslコマンドで秘密鍵と証明書を作成できる。- 自己署名証明書ではブラウザの警告が出るが、暗号化はされている。
しかし、一般公開するWebサイトで「警告画面」が出るのはNGですよね。
訪問者は怖がって帰ってしまいます。
次回、第2回は「無料証明書のスタンダード!Let's Encrypt (Certbot) の導入と自動更新」です。
警告が出ない、信頼された正式な証明書を完全無料で取得し、Apacheに設定する手順を解説します。
ここからが本番です。お楽しみに!
▼ エンジニアとしてのキャリアを加速させる ▼
HTTPS環境を構築
「VPS」で自分専用環境
サーバー知識を年収に
「ITエンジニア転職」


コメント