自己署名証明書を作成してサーバーにHTTPS通信を設定する手順
はじめに
今回、自己署名証明書を作成し、ApacheウェブサーバーでHTTPS通信を設定する手順を書きました。
注意
自己署名証明書は信頼されていないため、本番環境での使用は推奨されません。本番環境では認証局(CA)から発行された証明書を使用してください。
前提知識
HTTPS通信
HTTPS(HyperText Transfer Protocol Secure)は、インターネット上で安全にデータをやり取りするためのプロトコルです。HTTPSはHTTPにSSL/TLSを組み合わせたもので、データの暗号化とサーバー認証を提供します。
SSL(Secure Sockets Layer)とTLS(Transport Layer Security)
SSLとTLSは、インターネット上で安全にデータをやり取りするためのプロトコルです。SSLはTLSの前身であり、現在はTLSが標準となっています。これらのプロトコルは、データの暗号化、データの完全性、サーバー認証を提供します。
CSR(Certificate Signing Request)
CSRは、SSL/TLS証明書を発行するためのリクエストです。CSRには、公開鍵とその所有者に関する情報(組織名、ドメイン名、所在地など)が含まれており、認証局(CA)に送信されます。自己署名証明書の場合は、CSRを作成せずに証明書を生成します。
自己署名証明書作成・設定
前提条件
-
Linuxサーバーがあり、Apacheがインストールされていること。
- インストール確認コマンド:
httpd -v
- インストール確認コマンド:
-
OpenSSLがインストールされていること。
- インストール確認コマンド:
openssl version
- インストール確認コマンド:
-
mod_ssl モジュールがロードされていること
- インストール確認コマンド:
yum list installed | grep mod_ssl
- インストール確認コマンド:
ステップ1: 秘密鍵の生成
まず、秘密鍵を生成します。これにより、暗号化通信を行うための基本的な鍵ペアが作成されます。秘密鍵はサーバー上で厳重に保管します。
sudo mkdir -p /etc/ssl/private
sudo chmod 700 /etc/ssl/private
openssl genpkey -algorithm RSA -out /etc/ssl/private/server.key
- openssl: OpenSSLツールを呼び出します。OpenSSLは、SSL/TLSプロトコルを実装するためのオープンソースライブラリです。
- genpkey: 秘密鍵を生成するためのコマンドです。
- -algorithm RSA: 鍵のアルゴリズムとしてRSAを指定します。RSAは広く使用されている公開鍵暗号方式です。
- -out /etc/ssl/private/server.key: 生成された秘密鍵を/etc/ssl/private/server.keyというファイルに保存します。
ステップ2: 自己署名証明書の生成
次に、生成した秘密鍵を使用して自己署名証明書を作成します。自己署名証明書は、開発環境やテスト環境で使用されることが多いです。
openssl req -new -x509 -key /etc/ssl/private/server.key -out /etc/ssl/certs/server.crt -days 365
- openssl: OpenSSLツールを呼び出します。
- req: 証明書署名リクエスト(CSR)を生成するためのコマンドです。ただし、ここでは自己署名証明書の生成にも使用されます。
- -new: 新しいCSRまたは証明書を生成することを指定します。
- -x509: X.509形式の証明書を生成するオプションです。このオプションを指定すると、CSRではなく自己署名証明書が生成されます。
- -key /etc/ssl/private/server.key: 署名に使用する秘密鍵ファイルを指定します。
- -out /etc/ssl/certs/server.crt: 生成された自己署名証明書を/etc/ssl/certs/server.crtというファイルに保存します。
- -days 365: 証明書の有効期限を365日に設定します。
このコマンドでは、証明書の有効期限を365日(1年)としています。以下のプロンプトが表示されますので、適宜情報を入力します。
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Minato-ku
Organization Name (eg, company) [Default Company Ltd]:Example Inc.
Organizational Unit Name (eg, section) []:IT Department
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:admin@example.com
ステップ5: SSL設定ファイルの編集
まず、/etc/httpd/conf.d/ssl.confファイルが存在するかを確認します。
ls /etc/httpd/conf.d/ssl.conf
存在する場合は、以下の内容を追加または修正します。存在しない場合は、新しく作成します。
sudo vi /etc/httpd/conf.d/ssl.conf
以下の内容を追加します。
Listen 443 https
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot "/var/www/html"
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
<Directory "/var/www/html">
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
</VirtualHost>
-
Listen 443 https: ApacheがHTTPSプロトコルで通信を受け付けるポート番号(443番)を指定します。
-
<VirtualHost *:443>: ポート443で受信するすべてのIPアドレスに対して、この仮想ホストの設定を適用します。
-
ServerName www.example.com:この仮想ホストが対応するサーバーの名前(ドメイン名)を指定します。
-
DocumentRoot "/var/www/html": ウェブコンテンツのルートディレクトリを指定します。このディレクトリ内のファイルがウェブサーバーによって提供されます。
-
SSLEngine on: SSLを有効にします。これにより、この仮想ホストでのHTTPS通信が可能になります。
-
SSLCertificateFile /etc/ssl/certs/server.crt: サーバー証明書のファイルパスを指定します。ここでは、先ほど生成した自己署名証明書を使用します。
-
SSLCertificateKeyFile /etc/ssl/private/server.key: サーバーの秘密鍵のファイルパスを指定します。ここでは、先ほど生成した秘密鍵を使用します。
-
<Directory "/var/www/html">: DocumentRootディレクトリ内の設定を定義します。このディレクティブ内に記述される設定は、指定されたディレクトリに対して適用されます。
-
Options -Indexes +FollowSymLinks: ディレクトリのインデックスリスト表示を無効にし、シンボリックリンクをたどることを許可します。
-
-Indexes: インデックスリストの表示を無効にします。
-
+FollowSymLinks: シンボリックリンクをたどることを許可します。
-
AllowOverride All: .htaccessファイル内でのすべての設定の上書きを許可します。
-
Require all granted: すべてのアクセスを許可します。
-
ErrorLog logs/ssl_error_log: SSLエラーのログファイルの場所を指定します。
-
TransferLog logs/ssl_access_log: SSLアクセスログのファイルの場所を指定します。
-
LogLevel warn: ログの出力レベルをwarn(警告)に設定します。この設定により、警告以上のレベルのメッセージがログに記録されます。
この設定は、ApacheでHTTPS通信を有効にするためのものです。自己署名証明書と秘密鍵を使用して、サーバーがSSL/TLSプロトコルを介して安全に通信できるようにします。また、ディレクトリの設定を通じて、ウェブコンテンツの提供方法を制御します。
ステップ6: ファイアウォールの設定
HTTPSトラフィックを許可するために、セキュリティグループの設定を更新します。EC2インスタンスのセキュリティグループでポート443を許可します。
ステップ7: Apacheの再起動
設定を反映させるためにApacheを再起動します。
sudo systemctl restart httpd
ステップ8: HTTPS通信の確認
ブラウザを開き、https://www.example.comにアクセスします。自己署名証明書を使用しているため、ブラウザが警告を表示することがありますが、警告を無視してサイトに進むことで、HTTPS通信が確立されていることを確認できます。
Discussion