はじめに
背景
本ドキュメントは、Linux環境で安全な通信を行うための手順をまとめたものです。ウェブサーバーとユーザー間の通信を暗号化するSSL/TLSは、個人情報や認証情報を守る重要な仕組みです。例えば、ブラウザで鍵のマークが表示される仕組みはこの技術によります。
本書の目的
OpenSSLなどのツールを使い、秘密鍵の生成、CSR(証明書署名要求)の作成、自己署名証明書やルートCAの作成、そしてApacheへの設定まで、一連の作業を手順混じりで分かりやすく説明します。実務で使える手順を重視します。
想定読者と前提条件
Linuxの基本操作(コマンド実行やファイル編集)ができる方を対象にします。OpenSSLがインストールされていることを前提とします。専門用語は必要最小限に留め、具体例を交えて説明します。
本書の構成
全8章で構成します。次章から順に、基礎、鍵生成、CSR、証明書作成、CA作成、Apacheへの適用、設定の編集と検証・トラブルシューティングを扱います。各章は実践できる手順を中心に記載します。
Linux環境でのSSL/TLSセキュリティの基礎
概要
Linuxで安全なネットワーク通信を実現するには、SSL/TLSが不可欠です。Webやメールなど多くのサービスがこれを使い、通信を暗号化して盗聴や改ざんを防ぎます。OpenSSLはLinuxで広く使われるツールキットです。
SSL/TLSの仕組み(やさしい説明)
- 暗号化:送受信のデータを第三者に読まれないようにします。例:テキストが鍵で変換されます。
- 認証:相手が本当にそのサーバーかを証明します。サーバーは証明書を提示します。
- 完全性:送信中にデータが改ざんされていないか確認します。
重要な要素
- 秘密鍵(Private Key):サーバーが厳重に保管するファイルです。漏れると危険です。
- 証明書(Certificate):公開情報で、公開鍵と所有者情報が含まれます。
- 認証局(CA):証明書を発行する信頼のある団体です。自己署名も可能ですが、外部から信頼されにくいです。
Linuxでの実装例(簡単)
- OpenSSLのインストール:多くのディストリでパッケージ管理で入手できます(例:apt, yum)。
- 簡単なコマンド例:openssl version(バージョン確認)、openssl genpkey -algorithm RSA -out server.key(鍵生成)。
守るべきポイント
- 秘密鍵を安全な場所に保管し、アクセス権を制限します。
- 最新のOpenSSLに更新し、強い暗号スイートを選びます。
- 証明書の有効期限と失効情報を管理します。
以上がLinux環境でSSL/TLSを扱う際の基本です。次章では秘密鍵の生成プロセスを詳しく説明します。
RSA秘密鍵の生成プロセス
概要
SSL/TLSの第一歩はRSA秘密鍵を作ることです。秘密鍵はサーバー証明書の土台であり、漏えいすると通信の安全が失われます。ここではOpenSSLを使った基本手順を示します。
秘密鍵の生成(実行例)
以下のコマンドで2048ビットの秘密鍵を生成します。
openssl genrsa -out server.key 2048
生成後はserver.keyというファイルが作成されます。別の例として、鍵にパスフレーズを付ける場合は以下を使います。
openssl genrsa -aes256 -out server.key 2048
ファイルの保護
秘密鍵は厳重に管理してください。権限を制限する例:
chmod 600 server.key
chown root:root server.key
これでrootのみが読み書きできます。パスフレーズを付けた場合は起動時に入力が必要です。
検証とバックアップ
鍵が正しく作られたか確認するには、内容を表示して構文をチェックします。
openssl rsa -in server.key -check
秘密鍵は安全な場所にバックアップし、アクセスをログ管理してください。
証明書署名要求(CSR)の作成
CSRとは何か
CSR(Certificate Signing Request)は、証明書に必要な情報(組織名、ドメイン名、所在地など)をまとめたファイルです。秘密鍵と対になり、認証局(CA)に証明書発行を依頼するときに使います。自己署名証明書を作る場合もCSRを基に処理します。
基本的な作成方法(例)
次のコマンドで、server.csrを非対話で作成できます。
openssl req -new -key server.key -out server.csr -subj "/CN=example.com/O=MyOrganization/C=JP"
-subjで指定する項目例:CN(Common Name=主にドメイン名)、O(組織名)、C(国コード)。このコマンドは対話を省き、スクリプトで使いやすいです。
作成後の確認
作成したCSRの中身は次で確認します。
openssl req -in server.csr -noout -text
ここでCNや組織名が正しいか必ず確認してください。
SAN(Subject Alternative Name)を含める方法
近年はSANに複数のホスト名を入れる必要が多いです。OpenSSLのバージョンが新しければ次のように追加できます。
openssl req -new -key server.key -out server.csr -subj "/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
古い環境では設定ファイル(extfile)を用意して -reqexts を使う方法が確実です。
注意点
CSR自体は秘密情報を含みません。秘密鍵は安全な場所に保管してください。CAに提出する前に必ず内容を確認し、ドメイン名や組織情報に誤りがないようにしてください。
自己署名証明書の生成
自己署名証明書は、認証局を使わずにサーバー自らが発行する証明書です。開発やテスト環境で手早くHTTPSを試すときに便利です。ブラウザは信頼されたCAの署名がないため警告を出しますが、暗号化やサーバー識別の確認には使えます。
手順(基本)
1. 鍵を用意します(既にあるなら省略)。例:
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
2. 自己署名証明書を作成します。2つの例:
– CSRを同時に作る方法:
openssl req -new -x509 -key server.key -out server.crt -days 365 -subj “/CN=localhost”
– 既存のCSRから署名する方法:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
ポイントと確認
– server.crtに公開鍵と識別情報が含まれます。証明書の詳細は openssl x509 -in server.crt -text -noout で確認します。
– 鍵は厳重に保管し、アクセス権を制限してください(chmod 600 server.key)。
– 複数ホスト名を使う場合はSANを設定する必要があります。簡易的にはopensslの-addextで指定できます。
自己署名は開発向けの簡便な手段です。本番環境では信頼されたCAの発行する証明書を使ってください。
ルートCA証明書の生成(オプション)
概要
本番環境では、自分で信頼の根を作るためにルートCA証明書を用意すると便利です。ルートCAは他のサーバー証明書に署名する基盤になります。通常は厳重に管理し、オフラインで保管します。
基本コマンドと意味
openSSLでの代表的なコマンド例:
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
オプションの意味:
– -x509: 自己署名証明書を作る
– -new: 新しい証明書を作る
– -nodes: 鍵をパスフレーズ無しで出力(運用上の注意点あり)
– -sha256: ハッシュにSHA-256を使う
– -days 1024: 有効期限を1024日に設定
– -out rootCA.pem: 証明書を出力
実際の手順(例)
1) 秘密鍵を作成: openssl genpkey -algorithm RSA -out rootCA.key -pkeyopt rsa_keygen_bits:4096
2) ルート証明書を作成(上のコマンド)
注意点
- ルートCAの秘密鍵は厳重に保管し、可能ならオフラインにしてください。
-nodesを使うと運用が楽ですが、鍵が盗まれるリスクが高まります。鍵にパスフレーズを付けるか、物理的な管理をおすすめします。
証明書署名の流れ(簡単)
ルートCAでサーバーのCSRに署名するときは、openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 825 -sha256のように実行します。
Apacheサーバーへの証明書設定
準備
まず証明書と秘密鍵を安全な場所に置きます。例: /etc/ssl/private/example.com.key(秘密鍵)、/etc/ssl/certs/example.com.crt(証明書)。秘密鍵はrootのみが読めるようにします。
ディレクトリ作成と権限
sudo mkdir -p /etc/ssl/private
sudo chmod 700 /etc/ssl/private
sudo mv example.com.key /etc/ssl/private/
sudo chown root:root /etc/ssl/private/example.com.key
sudo chmod 600 /etc/ssl/private/example.com.key
証明書配置
証明書ファイルは /etc/ssl/certs に置くのが一般的です。
sudo mv example.com.crt /etc/ssl/certs/
sudo chown root:root /etc/ssl/certs/example.com.crt
sudo chmod 644 /etc/ssl/certs/example.com.crt
Apacheの設定(仮想ホスト例)
confファイル(例: /etc/apache2/sites-available/example.com.conf)内で次を指定します。
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
# 中間証明書がある場合
# SSLCertificateChainFile /etc/ssl/certs/chain.crt
DocumentRoot /var/www/html
モジュール有効化と設定確認
sudo a2enmod ssl
sudo a2ensite example.com.conf
sudo apachectl configtest
再起動と動作確認
sudo systemctl restart apache2
ブラウザで https://example.com にアクセスして証明書が正しく表示されるか確認してください。
注意点
秘密鍵の権限を緩めないでください。パスフレーズ付き鍵を使う場合、Apache起動時の扱いに注意が必要です。
Apacheの設定ファイル編集
以下では、ApacheでSSL/TLSを有効にするための設定ファイル編集手順をやさしく説明します。
1) 事前準備
- 元の設定を必ずバックアップします(例: sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak)。
- 秘密鍵は権限を厳しくします(例: sudo chown root:root /path/server.key && sudo chmod 600 /path/server.key)。
2) 設定例(仮想ホスト)
以下を該当ファイル(/etc/httpd/conf.d/ssl.conf または /etc/apache2/sites-available/default-ssl.conf)に記述します。
<VirtualHost *:443>
ServerName example.com
SSLEngine on
Listen 443
SSLCertificateFile /path/server.crt
SSLCertificateKeyFile /path/server.key
SSLProtocol TLSv1.2 TLSv1.3
SSLCipherSuite HIGH:!aNULL:!MD5
# 必要に応じてHSTSを追加
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
DocumentRoot /var/www/html
</VirtualHost>
- Listen 443 はポート443で待ち受けする指定です。
- SSLCertificateFile/SSLCertificateKeyFile で証明書と秘密鍵の場所を指定します。
- SSLProtocol/SSLCipherSuite で使用するプロトコルと暗号を制限します。
3) モジュール有効化と権限
- Debian系: sudo a2enmod ssl headers && sudo a2ensite default-ssl
- RHEL系: sslモジュールは通常組み込みです。
4) 設定確認と再起動
- 設定文法チェック: sudo apachectl configtest または sudo apache2ctl configtest
- 再起動: sudo systemctl restart apache2 または sudo systemctl restart httpd
5) 動作確認
- OpenSSLで接続確認: openssl s_client -connect example.com:443 -servername example.com
- HTTPヘッダー確認: curl -I https://example.com
補足: SELinuxを有効にしている場合はコンテキストを確認してください(restorecon など)。問題が出たらログ(/var/log/apache2/error.log または /var/log/httpd/error_log)を確認してください。












