LoginSignup
2
6

More than 5 years have passed since last update.

Chrome/Safariでもエラーにならないオレオレ証明書でTSL/SSLクライアント認証をする

Last updated at Posted at 2017-06-04

背景

最近の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などに下記を記載。重要なのはRewriteCondRewriteRuleですね。

<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"が表示されると思います。

めでたしめでたし。

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6