Ubuntu 18.04のApache用に自己署名SSL証明書を作成する方法
Ubuntu 18.04を使用していませんか?別のバージョンやディストリビューションを選択してください。
紹介
TLS(トランスポート層セキュリティ)およびその前のバージョンであるSSL(セキュアソケット層)は、通常のトラフィックを保護された暗号化されたラッパーで包むために使用されるウェブプロトコルです。
この技術を使用することで、サーバーは外部のパーティによってメッセージが傍受されることなく、サーバーとクライアント間で安全にトラフィックを送信できます。証明書システムは、ユーザーが接続しているサイトの身元を確認するのにも役立ちます。
このガイドでは、Ubuntu 18.04上のApacheウェブサーバーで使用するための自己署名SSL証明書を設定する方法を学びます。
注: 自己署名証明書は、サーバーとすべてのクライアント間の通信を暗号化します。しかし、これはウェブブラウザに含まれる信頼された証明書機関(CA)によって署名されていないため、ユーザーは証明書を使用してサーバーのアイデンティティを自動的に検証することはできません。
自己署名証明書は、サーバーに関連付けられたドメイン名がない場合や、暗号化されたWebインターフェースがユーザーに対して表示されない場合に適していることがあります。ドメイン名を持っている場合は、多くのケースでCA署名証明書を使用する方が良いです。Ubuntu 18.04でのLet’s Encryptを使用したApacheのセキュリティ設定に関するガイドで、無料の信頼できる証明書の設定方法について詳しく読むことができます。
前提条件
このチュートリアルを完了するためには、次のものが必要です:
- 非rootユーザーが設定され、
sudo権限があり、ファイアウォールが有効になっているUbuntu 18.04サーバーが1台必要です。このようなユーザーアカウントは、Ubuntu 18.04の初期サーバーセットアップに従って設定できます。 - Apacheウェブサーバーがインストールされています。サーバーに完全なLAMP(Linux、Apache、MySQL、PHP)スタックをインストールしたい場合は、Ubuntu 18.04でのLAMPの設定に関するガイドに従ってください。Apacheウェブサーバーのみを必要とする場合は、PHPとMySQLに関連する手順をスキップしてください。
前提条件を完了したら、次のステップに進んでください。
ステップ1 — SSL証明書の作成
TLS/SSLは、公開証明書と秘密鍵の組み合わせを使用して動作します。SSL鍵はサーバー上で秘密に保たれます。これは、クライアントに送信されるコンテンツを暗号化するために使用されます。SSL証明書は、コンテンツを要求する誰にでも公開されます。それは、関連するSSL鍵によって署名されたコンテンツを復号するために使用できます。
単一のOpenSSLコマンドで自己署名のキーと証明書のペアを作成できます:
- sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
これにより、一連の質問が促されます。それらについて議論する前に、あなたが発行しているコマンドで何が起こっているのかをおさらいしましょう:
openssl: これはOpenSSL証明書、鍵、およびその他のファイルを作成および管理するための基本的なコマンドラインツールです。req: このサブコマンドは、X.509 証明書署名要求 (CSR) の管理を使用することを指定します。「X.509」は、SSL および TLS がその鍵と証明書の管理に従う公開鍵基盤の標準です。新しい X.509 証明書を作成するには、このサブコマンドを使用してください。-x509: これは、通常は証明書署名要求を生成するところを、自己署名証明書を作成するようにユーティリティに指示することによって、前のサブコマンドをさらに修正します。- -nodes: これは、OpenSSLに証明書をパスフレーズで保護するオプションをスキップするように指示します。Apacheは、サーバーが起動するときに、ユーザーの介入なしにファイルを読み取る必要があります。パスフレーズがあると、ユーザーは毎回の再起動後にそれを入力しなければならないため、これを防ぐことになります。
- このオプションは、証明書が有効と見なされる期間を設定します。この場合、1年に設定されています。
-newkey rsa:2048:これは、新しい証明書と新しいキーを同時に生成したいことを指定します。証明書に署名するために必要なキーは以前のステップで作成されていないため、証明書と一緒に作成する必要があります。rsa:2048の部分は、2048ビットの長さのRSAキーを作成することを示します。-keyout: この行は、OpenSSLに生成された秘密鍵ファイルを配置する場所を指示します。- 出力先: これはOpenSSLに作成される証明書の配置場所を指示します。
前述のように、これらのオプションはキー ファイルと証明書の両方を作成します。証明書に情報を正しく埋め込むために、サーバーについていくつかの質問が求められます。
プロンプトに適切に記入してください。最も重要な行は、Common Name(例:サーバーのFQDNまたはあなたの名前)を要求するものです。あなたは、サーバーに関連付けられたドメイン名または、おそらく、サーバーの公開IPアドレスを入力する必要があります。
プロンプトの全リストは次のように出力されます:
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com
あなたが作成した2つのファイルは、/etc/sslの適切なサブディレクトリに配置されます。
ステップ2 — SSLを使用するためのApacheの設定
あなたは、/etc/ssl ディレクトリの下にキーと証明書ファイルを正常に作成しました。次に、これらを利用するために Apache 設定を変更する必要があります。
これを構成を少し調整することで行います:
- 強力なデフォルトSSL設定を指定するための設定スニペットを作成してください。
- 生成されたSSL証明書を指すように、含まれているSSL Apacheバーチャルホストファイルを変更してください。
- (推奨) 暗号化されていないバーチャルホストファイルを修正して、リクエストを自動的に暗号化されたバーチャルホストにリダイレクトする。
完了すると、安全なSSL構成が得られます。
強力な暗号化設定を持つApache構成スニペットの作成
まず、SSL設定を定義するためにApacheの設定スニペットを作成します。これにより、Apacheに強力なSSL暗号スイートが設定され、サーバーを安全に保つための高度な機能がいくつか有効になります。設定するパラメータは、SSLを有効にする任意のバーチャルホストで使用できます。
/etc/apache2/conf-available ディレクトリに新しいスニペットを作成します。この例では、nano を使用してファイルを作成し、その目的を明確にするためにファイル名を ssl-params.conf にします。お好みのテキストエディタを使用してください:
- sudo nano /etc/apache2/conf-available/ssl-params.conf
Apache SSLを安全に設定するために、Cipherlist.euの推奨事項を参考にします。Cipherlist.euは、一般的なソフトウェアで使用される暗号化設定を理解するための便利でわかりやすいリソースです。
注意: Cipherlist.euからのこれらの推奨設定は強力なセキュリティを提供します。時には、クライアントの互換性が低下することがあります。古いクライアントをサポートする必要がある場合は、ページ上にある「はい、レガシー/古いソフトウェアと動作する暗号スイートを教えてください。」とラベル付けされたリンクをクリックすることでアクセスできる代替リストがあります。必要に応じて、そのリストを次の例のコードブロックの内容に置き換えることができます。
どの構成を使用するかの選択は、主に何をサポートする必要があるかによって大きく変わります。どちらも素晴らしいセキュリティを提供します。
あなたの目的のために、提供された設定をそのままコピーしてください。ただし、Strict-Transport-Securityヘッダー(HSTS)を無効にするという小さな変更を行います。
HSTSの事前ロードは、セキュリティを強化しますが、誤って有効にしたり、不適切に有効にした場合、広範囲にわたる影響を及ぼす可能性があります。このガイドでは設定を有効にしませんが、影響を理解している自信があるなら、変更することができます。
決定する前に、一瞬立ち止まってHTTP厳格トランスポートセキュリティ(HSTS)について、特に「プレロード」機能について調べてください。
今すぐその設定をssl-params.confファイルに貼り付けてください:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
Older versions
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
Disable preloading HSTS for now. You can use the commented out header line that includes
the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
Requires Apache >= 2.4.11
SSLSessionTickets Off
作業が終わったらファイルを保存して閉じてください。nanoを使っている場合は、CTRL + Xを押し、次にYとENTERを押すことでこれを行えます。
デフォルトのApache SSL仮想ホストファイルの変更
次に、デフォルトのApache SSL仮想ホストファイルである/etc/apache2/sites-available/default-ssl.confを修正します。別のサーバーブロックファイルを使用している場合は、以下のコマンドでその名前を置き換えてください。
始める前に、元のSSLバーチャルホストファイルをバックアップしてください:
- sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
さて、調整を行うためにSSLバーチャルホストファイルを開きましょう:
- sudo nano /etc/apache2/sites-available/default-ssl.conf
内部では、コメントがほとんど削除された状態で、バーチャルホストファイルはデフォルトで以下の内容を含みます:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
ファイルにいくつかの小さな調整を行います。まず、仮想ホストファイルで調整したい通常の設定(ServerAdminのメールアドレス、ServerNameなど)を設定し、SSLのディレクティブを自分の証明書とキーのファイルを指すように調整してください。
これらの変更を行った後、サーバーブロックは次のようになります:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin your_email@example.com
ServerName server_domain_or_IP
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
作業が完了したら、ファイルを保存して閉じてください。
(推奨) HTTPホストファイルを変更してHTTPSにリダイレクトする
現状では、サーバーは暗号化されていないHTTPトラフィックと暗号化されたHTTPSトラフィックの両方を提供します。セキュリティを向上させるためには、ほとんどの場合、HTTPをHTTPSに自動的にリダイレクトすることをお勧めします。この機能が必要ない、または望まない場合は、このセクションを安全にスキップできます。
SSL暗号化されたトラフィックにリダイレクトするために、暗号化されていない仮想ホストファイルを調整するには、/etc/apache2/sites-available/000-default.confファイルを開いてください:
- sudo nano /etc/apache2/sites-available/000-default.conf
VirtualHost 設定ブロック内に Redirect ディレクティブを追加し、すべてのトラフィックをサイトの SSL バージョンに向けます:
<VirtualHost *:80>
. . .
Redirect "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>
作業が完了したら、ファイルを保存して閉じてください。
ステップ3 — ファイアウォールの調整
もし、前提条件ガイドで推奨されているように、ufwファイアウォールが有効になっている場合、SSLトラフィックを許可するために設定を調整する必要があるかもしれません。幸いなことに、Apacheはインストール時にufwにいくつかのプロファイルを登録します。
次のコマンドを実行して、利用可能なプロファイルの一覧を表示します:
- sudo ufw app list
出力は次のようにするべきです:
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
現在の設定は、ステータスを確認することで確認できます:
- sudo ufw status
もし以前に通常のHTTPトラフィックのみを許可していた場合、出力結果は次のようになります:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
追加のHTTPSトラフィックを許可するには、「Apache Full」プロファイルを許可し、その後冗長な「Apache」プロファイルの許可を削除してください。
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
変更を確認するためにステータスをチェックしてください:
- sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
あなたは今、Apacheトラフィックをファイアウォールに許可することに成功しました。
ステップ4 — Apacheでの変更を有効にする
変更を加え、ファイアウォールを調整したので、ApacheでSSLとヘッダーのモジュールを有効にし、SSL対応のバーチャルホストを有効にし、Apacheを再起動できます。
mod_ssl(ApacheのSSLモジュール)と、SSLスニペットのいくつかの設定に必要なmod_headersをa2enmodコマンドで有効にします:
- sudo a2enmod ssl
- sudo a2enmod headers
次に、a2ensiteコマンドを使ってSSL仮想ホストを有効にします:
- sudo a2ensite default-ssl
設定した値を読み込むために、ssl-params.confファイルを有効にする必要があります:
- sudo a2enconf ssl-params
この時点で、あなたのサイトと必要なモジュールが有効になっています。テストを実施して、ファイルに構文エラーがないことを確認してください:
- sudo apache2ctl configtest
すべてが成功すれば、次の結果が得られます:
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
最初の行は、ServerNameディレクティブがグローバルに設定されていないことを示すメッセージです。このメッセージを消したい場合は、/etc/apache2/apache2.confでServerNameをサーバーのドメイン名またはIPアドレスに設定できます。これはオプションであり、メッセージ自体が害を及ぼすことはありません。
出力にSyntax OKが含まれている場合、設定ファイルに構文エラーはありません。変更を適用するために、Apacheを安全に再起動することができます:
- sudo systemctl restart apache2
変更を加えたので、次にSSLサーバーをテストします。
ステップ5 — 暗号化のテスト
さて、あなたのSSLサーバーをテストする時間です。まず、ウェブブラウザを開いて、アドレスバーにhttps://の後にサーバーのドメイン名またはIPを入力します:
https://server_domain_or_IP
あなたが作成した証明書は、ブラウザの信頼された証明書発行機関の1つによって署名されていないため、次のような警告が表示される可能性があります:
これは期待されることであり、正常です。私たちは証明書の暗号化の側面のみを関心を持っており、ホストの信頼性の第三者による検証には興味がありません。詳細設定をクリックし、その後、提供されたリンクをクリックしてホストに進んでください:
あなたは自分のサイトに連れて行かれるべきです。ブラウザのアドレスバーには、上に「x」のあるロックが表示されます。これは、証明書が検証できないことを意味しています。それでも、接続は暗号化されています。
ApacheをHTTPSにリダイレクトするように設定した場合、リダイレクトが正しく機能しているかどうかも確認できます。
http://server_domain_or_IP
これが同じアイコンになる場合、これはリダイレクトが正しく機能したことを意味します。
ステップ6 — 永続的なリダイレクトへの変更
リダイレクトが正しく機能し、暗号化されたトラフィックのみを許可したいと確信している場合は、再度暗号化されていないApacheのバーチャルホストを修正して、リダイレクトを永続的にする必要があります。
サーバーブロックの設定ファイルを再度開いてください:
- sudo nano /etc/apache2/sites-available/000-default.conf
以前に追加したRedirect行を見つけてください。その行にpermanentを追加してください。これにより、リダイレクトが302の一時リダイレクトから301の永久リダイレクトに変更されます。
<VirtualHost *:80>
. . .
Redirect permanent "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>
ファイルを保存して閉じてください。
構成に文法エラーがないか確認してください:
- sudo apache2ctl configtest
準備ができたら、リダイレクトを永続的にするためにApacheを再起動してください:
- sudo systemctl restart apache2
暗号化されたトラフィックのみを許可するために、リダイレクトを永久に成功裏に設定しました。
結論
あなたはApacheサーバーを設定して、クライアント接続のために強力な暗号化を使用するようにしました。これにより、安全にリクエストを処理でき、外部の者があなたのトラフィックを読み取ることを防ぐことができます。

