環境前提
検証環境は下記を想定します。
- 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 ファイルを選択してインポートします。