背景
最近のChromeアップデートで、オレオレ証明書でクライアント認証していたサイトで "Certificate Error" "Subject Alternative Name Missing" "ERR_CERT_COMMON_NAME_INVALID"などのエラーが出るようになってしまったので、その対策です。
最近はフリーのLet's EncryptやAWSのCertificate Managerもあるのでそちらも検討しましたが、クライアント認証なのでオレオレ証明書の方がむしろセキュアだろうということで、引続きオレオレです。
ほとんどこちらから拝借したものですが、簡単に証明書など作成できるようにスクリプトになっています。
証明書作成手順
証明書や鍵の作成はサーバ上でやる必要はありません。自分はローカルマシンでやってます。
スクリプトを取得
git clone git@github.com:pikanji/ssl-client-auth.git
設定ファイル作成
必要な情報を記述した.env
ファイルを作成します。
cd ssl-client-auth
cp .env.dist .env
.env
を開いて必要な情報を記述します。
項目 | 説明 |
---|---|
DOMAIN | 対象のサーバのドメイン名です。 |
COMMON_NAME | こちらが、実際に適用されるドメイン名です。指定しなければ上記ドメイン名のワイルドカード*.$DOMAIN が使用されます。上記ドメインを使用したい場合は、同じ値を設定します。 |
NUM_OF_DAYS | 有効期限。1年なら365とか。 |
COUNTRY | 国名を2文字で。 |
STATE | 州や都道府県。 |
LOCALITY | 市区町村。 |
ORGANIZATION | 組織名。会社名など。root authorityの作成にはこちらがCOMMON_NAMEとして使用されます。 |
ORGANIZATION_UNIT | 部課名や製品名など |
認証局の証明書と鍵の作成
./create_root_cert_and_key.sh
サーバ証明書/鍵とクライアント用証明書の作成
./create_certificate_for_domain.sh
サーバへの設置
ここからはサーバ上での作業になります。
証明書と鍵を設置して、SSLを有効にする
この期に及んでApacheを前提で説明します。自分はAWSでAmazon Linuxを使用しているのでRedHat系の説明になります。
mod24_ssl
が入ってなければインストール。
下記内容で/etc/httpd/conf.d/ssl.conf
を作成。最後のLog関係の3行は何でもいいです。
LoadModule ssl_module modules/mod_ssl.so
Listen 443
<VirtualHost *:443>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
SSLCertificateFile "/etc/pki/tls/certs/server.crt"
SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
SSLCACertificateFile "/etc/pki/tls/certs/root_ca.crt"
SSLVerifyClient require
LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
ErrorLog /var/log/httpd/elasticbeanstalk-error_log
TransferLog /var/log/httpd/elasticbeanstalk-access_log
</VirtualHost>
↓ここで指定するように、上記で作成した証明書と鍵ファイルを配置します。server.crt
はスクリプトでは[ドメイン名].crt
として生成されます。
SSLCertificateFile "/etc/pki/tls/certs/server.crt"
SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
SSLCACertificateFile "/etc/pki/tls/certs/root_ca.crt"
HTTPSを強制する
ウェブサイトへのアクセスを常にHTTPSに強制するため、HTTPへのアクセスをHTTPSにリダイレクトさせます。
Webサーバのドキュメントルートの.htaccessなどに下記を記載。重要なのはRewriteCond
とRewriteRule
ですね。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</IfModule>
webサーバをリスタートします。
sudo apachectl restart
クライアント(デバイス)での設定
確認が面倒なので、自分が使っているMacの説明だけ書きますw
上記で作成された.p12
ファイルをMac上でダブルクリックしてインストールします。
Keychain Accessでインストールされた認証局の証明書を"Always Trust"に設定して完了です。
対象ウェブサイトにアクセスすると、証明書を選択するように促されるので、インストールした証明書を選択してOKします。
これでChromeのアドレスバー左側に緑の"Secure"が表示されると思います。
めでたしめでたし。