sslとlinuxで理解する安全な導入の基礎知識と設定方法

目次

はじめに

背景

本ドキュメントは、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)を確認してください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次