Web技術 ネットワーク技術

HSTS(HTTP Strict-Transport-Security)の検証環境セットアップ

環境前提

検証環境は下記を想定します。

  • Almalinux
  • Apache2.4
  • OpenSSL

事前にやっておくこと

検証のために下記は事前に決めておいてください。

  • CAのFQDN
  • CommonName/SAN

※本記事ではCAのFQDNを [ ca.example ] 、CommonName/SANは [ example.com ] / [ www.example.com   ] としています。
※特に認証局の証明書において存在しうるFQDNを使うと、セキュリティ上リスクがありますので、適当なものにはしないようにしましょう。

証明書の関係性について

事前準備

環境にアクセスするOSのhostsファイルを書き換えておきます。
※DNSのリゾルバで検証用のレコードを書いてもかまいません。
※検証が終わったら、書き換える前の状態に戻しましょう。

手順

Almalinuxにログインをして下記のコマンドを実行します。
rootユーザで実行することを想定しています。

# Apacheをインストールします。インストールが完了した旨が表示されることを確認します。
dnf -y install httpd
# https通信をするためにmod_sslをインストールします。
dnf -y install mod_ssl
# 証明書を配置するディレクトリを用意します。
mkdir /etc/httpd/ssl
# 後述のコマンドで相対パスのほうが都合がいいので、ディレクトリを移動します。
cd /etc/httpd/ssl

# ca.keyというファイルでCAの秘密鍵を生成します。
openssl genpkey -algorithm RSA -out ca.key -aes256
# CAの自己署名証明書を生成
# ca.keyのパスフレーズが求められます。
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=JP/ST=Tokyo/L=Shibuya/O=YourCompany/OU=IT/CN=ca.example"

# サーバの秘密鍵を生成します。
openssl genpkey -algorithm RSA -out server.key -aes256
# サーバ証明書の設定ファイル(openssl.cnf)を作成してSANを追加
cat <<EOL >openssl.cnf
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_ca
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = JP
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Tokyo
localityName = Locality Name (eg, city)
localityName_default = Shibuya
organizationName = Organization Name (eg, company)
organizationName_default = YourCompany
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = IT
commonName = Common Name (eg, your name or your server's hostname)
commonName_default = example.com
[ req_ext ]
subjectAltName = @alt_names
[ v3_ca ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = example.com
DNS.2 = www.example.com
EOL
# openssl.cnfをもとに、CSRを生成します。
# server.keyのパスフレーズが求められます。
# openssl.cnfに必要な情報をすでに入力しているので、入力プロンプトはすべてエンターを押します。
openssl req -new -key server.key -out server.csr -config openssl.cnf
# サーバ証明書をCAで署名
# ca.keyのパスフレーズが求められます。
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extensions req_ext -extfile openssl.cnf
# 生成した証明書ファイルと秘密鍵ファイルをApacheの適切なディレクトリに配置します。(/etc/httpd/sslで生成した各種ファイルを配置します。)
cp server.crt /etc/pki/tls/certs/
cp server.key /etc/pki/tls/private/
cp ca.crt /etc/pki/tls/cert

# httpdのSSL設定ファイルを編集し、証明書を正しく設定します。
vi /etc/httpd/conf.d/ssl.conf
以下の設定が含まれていることを確認します。

# <VirtualHost _default_:443>の最後に、下記をディレクティブを書き込みます。
# ※末尾に書き込むと上書きされるので、手順としてこの方がわかりやすいものとして記載しています。
# ApacheのWebサーバにありがちな設定を入れるようにしています。
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ServerName www.example.com
ServerAlias example.com
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCertificateChainFile /etc/pki/tls/certs/ca.crt
<Directory /var/www/html>
AllowOverride All
</Directory>
# HSTS設定
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

# httpdのHTTP設定ファイルを編集し、リダイレクトされるようにします。
vi /etc/httpd/conf/httpd.conf

# httpdのコンフィグファイルの末尾へ下記をコピーする。
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

# テスト用のHTMLファイルを作成します。
vi /var/www/html/index.html

<html>
<p>test</p>
</html>

# httpdの起動/再起動
sudo systemctl restart httpd

# CA証明書をブラウザへインポートする
# 生成したca.crtをブラウザにインポートします。

ブラウザごとにインポート

Google Chromeの場合:
Chromeを開き、右上のメニューから「設定」を開きます。
「プライバシーとセキュリティ」セクションで「セキュリティ」をクリックします。
「証明書の管理」をクリックします。
「信頼されたルート証明機関」タブを選択し、「インポート」をクリックします。
ca.crt ファイルを選択してインポートします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です