03-05 ApacheバーチャルホストのSSL設定

動画講座 Webサイトの常時SSL化

443番ポートの開放

Webの暗号化通信(https)に使われるポート番号は、標準で443番ポートが使われます。

サーバーの初期状態は443番ポートが開放されていないので、管理者権限で通信できるように設定します。

firewall-cmd –add-service=https –permanent

firewalldをリロード

設定を反映するためにfirewalldをリロード。

firewall-cmd –reload

バーチャルホストの設定ファイルを編集

前回の講座で編集したバーチャルドメイン設定ファイルを編集します。

vi /etc/httpd/conf/vhosts/su-campXXX.superusers.jp.conf

Web暗号化通信(SSL/TLS)の設定サンプル

暗号化通信の設定サンプルをコピーして、ファイルの末尾に貼り付けします。

<VirtualHost *:443>
    DocumentRoot "/home/__USER_NAME__/httpd/html"
    ServerName su-campXXX.__DOMAIN_NAME__:443
    ServerAdmin webmaster@superusers.jp
    ErrorLog "/var/log/httpd/su-campXXX.__DOMAIN_NAME__/error.log"

    <IfModule mod_setenvif.c>
	SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(swf)|(css)|(js)|(ico)$" uniq-log
	CustomLog /var/log/httpd/su-campXXX.__DOMAIN_NAME__/access.log combined env=!uniq-log
    </IfModule>

    <Directory /home/__USER_NAME__/httpd/html>
	Options ExecCGI Includes FollowSymLinks
	AllowOverride all
	Require all granted
	DirectoryIndex index.html index.php
    </Directory>

    # SSL Engine Switch:
    # Enable/Disable SSL for this virtual host.
    SSLEngine on

    # SSLCertificate
    SSLCertificateFile		/etc/httpd/conf/SSL/su-campXXX.__DOMAIN_NAME__/server.crt
    SSLCertificateKeyFile	/etc/httpd/conf/SSL/su-campXXX.__DOMAIN_NAME__/server.key
    #SSLCACertificateFile	/etc/httpd/conf/SSL/su-campXXX.__DOMAIN_NAME__/ca.crt

    # enable HTTP/2, if available
    #Protocols h2 http/1.1

    # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
    Header always set Strict-Transport-Security "max-age=63072000"

    BrowserMatch "MSIE [2-5]" \
	nokeepalive ssl-unclean-shutdown \
	downgrade-1.0 force-response-1.0

    #   Per-Server Logging:
    #   The home of a custom SSL log file. Use this when you want a
    #   compact non-error SSL logfile on a virtual host basis.
    CustomLog "/var/log/httpd/su-campXXX.__DOMAIN_NAME__/ssl_request_log" \
	"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

su-campXXXをホスト名に書き換え

su-campXXX をあなたのサーバーのホスト名に書き換えます。

__USER_NAME__の置換

前回と同様に、__USER_NAME__は、あなたの名字(ローマ字)に置換。

:%s/__USER_NAME__/your_lastname/g

returnキーで一括変換。

__DOMAIN_NAME__の置換

同じく、__DOMAIN_NAME__も一括変換をしてください。

:%s/__DOMAIN_NAME__/superusers.jp/g

随分と雑な説明になっていますが、ついて来れていますよね?

秘密鍵と証明書の生成

Web暗号化通信(SSL/TLS)の設定サンプルに、秘密鍵(SSLCertificateKeyFile)と証明書(SSLCertificateFile)を設置するパスの記述があると思います。

SSLCertificateFile/etc/httpd/conf/SSL/su-campXXX.__DOMAIN_NAME__/server.crt
SSLCertificateKeyFile/etc/httpd/conf/SSL/su-campXXX.__DOMAIN_NAME__/server.key

このディレクトリは存在していないので格納ディレクトリを予め作っておきます。

mkdir -p /etc/httpd/conf/SSL/su-campXXX.__DOMAIN_NAME__

「 su-campXXX 」にはあなたのホスト名、「__DOMAIN_NAME__」にはsuperusers.jpを入力してディレクトリを作成してください。

秘密鍵の生成

証明書を格納するディレクトリに移動。

cd /etc/httpd/conf/SSL/su-campXXX.__DOMAIN_NAME__

最初にopensslコマンドを使って秘密鍵を生成します。

openssl genrsa -out server.key 2048

証明書署名要求(CSR:Certificate Signing Request)

認証機関にサーバー証明書を申請する際に必ず必要となるのがCSR(Certificate Signing Request)と呼ばれる証明書署名要求。

CSRを作成するためには以下の情報が必要です。

  • 県庁所在地
  • 市町村
  • 組織名
  • ホスト名

生成したCSRを認証機関に提出すると認証機関が署名をして、サーバー証明書が発行されます。

申請するサーバー証明書によっては、団体(会社)・組織の実在性まで審査されるので、組織名をWhoisの情報に合わせる必要があります。

whoisコマンドでドメインを確認

例えばANAのドメイン(ana.co.jp)をwhoisでチェックすると、

whois ana.co.jp

Organizationに「All Nippon Airways Co., Ltd.」と表記されます。

ANAのWebサイトを開き、鍵の内容を表示させると組織にwhoisで表記されていたものと同じ内容であることが確認できます。

CSRを生成する際はドメインの組織名を確認し一致させるようにします。

CSRの生成

秘密鍵をベースにしてserver.csrという名のCSRファイルを生成します。

openssl req -sha256 -new -key server.key -out server.csr

対話形式で各項目を入力していきます。

Country Name (2 letter code) [XX]:
State or Province Name (full name) []:都道府県
Locality Name (eg, city) [Default City]:市町村
Organization Name (eg, company) [Default Company Ltd]:組織名
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:ホスト名
Email Address []:
A challenge password []:
An optional company name []:

国、都道府県、市町村、組織名、ホスト名以外は、入力する必要はありません。

CSRの内容確認

先にも書いたように、証明機関は提出したCSRを基に証明書を発行します。

CSRの内容を確認するコマンドは以下の通りです。

openssl req -in server.csr -text | grep “Subject:”

Subjectの内容に誤りが無いことを確認し、認証機関に証明書の発行を依頼します。

主な認証機関

証明書の発行 – 自己認証

通常は第三者の認証機関に証明書を発行してもらうのですが、暗号化通信の工程を学ぶというのが趣旨なので、今回は自己で認証した証明書を作ります。

openssl x509 -sha256 -in server.csr -out server.crt -req -signkey server.key -days 365

現在のディレクトリ内には、以下のファイルが存在していると思います。

server.crt証明書
server.csr証明書署名要求
server.key秘密鍵

server.keyは特に重要なファイルです。

この秘密鍵が無くなれば暗号化したデータの復号(元のデータに復元すること)ができなくなります。

逆に、この秘密鍵があれば暗号化データを複合化できてしまうので流出してしまうと大変。

パーミッションを600に変更しましょう。

chmod 600 server.*

Apacheの再起動

秘密鍵と証明書の準備ができたらApacheの構文チェックをして、Syntax OKと表示されたらApacheを再起動します。

service httpd restart

再起動後、Apacheが起動されているかチェック。

ブラウザで確認

Apacheの起動が確認できたらブラウザを使ってあなたのホスト名を表示させてください。

https://su-campXXX.superusers.jp/

うまくアクセスできたら鍵の内容を表示させて、あなたが作ったCSRの内容と同じものか確認してみてください。

Let’s Encryptで証明書を取得

証明書を取得するためには、信頼された認証機関にCSRを提出して証明書を発行してもらう必要があると説明しました。

証明書にはホスト名や組織名などの情報が含まれており、一般的にそれらの情報の完全性をどこまで保証してもらうのかによって費用も変わってきます。

しかし最近では、名前解決のできるホスト名であれば無料で証明書を発行してくれる認証機関(Let’s Encrypt)もあります。

あなたのホスト名が名前解決できるかどうか確認してください。

dig su-campXXX.superusers.jp

名前解決ができていれば、ANSWER SECTION にIPアドレスが表示されます。

ifconfig | grep IPアドレス

ANSWER SECTION に表示されたIPアドレスとサーバーのIPアドレスが一致していればLet’s Encryptで証明書を取得しましょう。

Certbotをインストール

/usr/local/bin に以下のコマンドでcertbot-autoをダウンロードします。

cd /usr/local/bin

/usr/loca/binにcdしてwgetコマンドでcertbot-autoをダウンロード。

wget https://dl.eff.org/certbot-auto

ダウンロードしたcertbot-autoの権限を管理者のみ実行できるようにパーミッションを700に変更。

chmod 700 certbot-auto

Let’s Encryptで証明書を取得

あなたのホスト名を指定して、以下のコマンドで証明書を取得します。

/usr/local/bin/certbot-auto certonly \
-w /home/satohama/httpd/html \
-d su-campXXX.superusers.jp \
–webroot \
–email webmaster@superusers.jp

上記コマンドの赤字部分は、あなたの環境に合わせた内容に変更してください。

returnキーを押すと契約の内容に同意するよう求められるので、Agree(同意)のaをタイプ。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- (A)gree/(C)ancel: a

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- (Y)es/(N)o: n
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for su-camp031.superusers.jp
Using the webroot path /home/satohama/httpd/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
Congratulations! Your certificate and chain have been saved at:
- /etc/letsencrypt/live/su-camp031.superusers.jp/fullchain.pem
Your key file has been saved at:
- /etc/letsencrypt/live/su-camp031.superusers.jp/privkey.pem
Your cert will expire on 2020-01-05. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
- "certbot-auto renew"
Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Let’s Encrypt プロジェクトからのメールは受け取らないので、No(不要)のnをタイプ。

通常暗号化通信に使われる証明書は秘密鍵を作った後にCSRを作って、証明書発行の要求をしていましたが、Let’s Encryptでは自動で秘密鍵と証明書が生成されダウンロードされます。

証明書の有効期間が90日間、証明範囲がドメインのみという2点を除けば、無料の証明書であっても暗号化の強度は有料の証明書と同じです。

証明書と秘密鍵は以下のディレクトリにダウンロードされます。

証明書

/etc/letsencrypt/live/su-campXXX.superusers.jp/fullchain.pem

秘密鍵

/etc/letsencrypt/live/su-campXXX.superusers.jp/privkey.pem

証明書の差替え

自己認証で生成したファイルをダウンロードしたLet’s Encryptのものと差し替えます。

まずは証明書の保存ディレクトリにcd。

cd /etc/httpd/conf/SSL/su-campXXX.superusers.jp/

作業日(YYMMDD)を名前にしたディレクトリ名を作成して既存ファイルを移動。

mkdir 20190101

移動するファイルは、server.keyとserver.csrとserver.crt。

mv server.* 20190101

次に、Let’s Encryptから取得した秘密鍵と証明書のシンボリックリンクをこのディレクトリに作ります。

ln -s /etc/letsencrypt/live/su-campXXX.superusers.jp/privkey.pem server.key
ln -s /etc/letsencrypt/live/su-campXXX.superusers.jp/cert.pem server.crt

Apacheの再起動

Syntaxチェックを行いApacheを再起動すると証明書がLet’s Encryptのものとなります。

プラチナメンバー昇格課題 Webの常時SSL化

バーチャルドメインの設定ファイルに以下の2行を見つけることができるはずです。

# RewriteEngine On
# RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

行頭に#が入っているのでApacheの機能に影響を与えない記述になっているので、2行とも#を削除させてApacheを再起動させてください。

この2行が有効になるとhttpからhttpsにリダイレクトされるようになります。

設定が終わった人

設定が終わった人は、塾長に連絡をください。

プラチナメンバー昇格課題 Webの常時SSL化

ここまでの講座と課題をクリアした人は、ApacheでWebサーバーを構築できるようになったということでsu塾プラチナメンバーにランクアップします。

プラチナメンバー用のコンテンツをご覧いただけるようになります。

これまで事細かく操作手順を説明するといった内容の講座でしたが、プラチナになったメンバーの方にはオーダー形式の講座となります。

今まで蓄積してきた知識と経験があれば、難なくこなせる内容です。

関連記事

コメント

この記事へのコメントはありません。

おすすめ記事

  1. 【多段SSH】公開鍵認証で中継サーバー経由のログインが簡単!

  2. インターネットに繋いだサーバーで最初にやらなければならない設定

  3. Swapアウトしているプロセスを特定する方法

  4. Linuxを極めるならコマンドよりも〇〇が先だ!!

  5. お名前ドットコムのDNS設定方法