🙌

自己署名証明書を作成してサーバーにHTTPS通信を設定する手順

2024/08/01に公開

はじめに

今回、自己署名証明書を作成し、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