Chrome58で、HTTPSの自己証明書が NET::ERR_CERT_COMMON_NAME_INVALID になる場合の対応


Google Chrome をバージョン58 にアップデートすると、SSL自己証明書を使っているサイトが見れなくなる場合があります。

自己証明書(オレオレ証明書)を使っているサイトに HTTPS でアクセスすると、

この接続ではプライバシーが保護されません

攻撃者が、tech.torico-corp.com 上のあなたの情報(パスワード、メッセージ、クレジット カード情報など)を
不正に取得しようとしている可能性があります。 NET::ERR_CERT_COMMON_NAME_INVALID

セキュリティに関する事象についての詳細を Google に自動送信する。プライバシー ポリシー
セキュリティで保護されたページに戻る詳細情報を表示しない
このサーバーが tech.torico-corp.com であることを確認できませんでした。
このサーバーのセキュリティ証明書は [missing_subjectAltName] から発行されています。
原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。
詳細

tech.torico-corp.com にアクセスする(安全ではありません)

このような感じのエラーになります。

原因

SSL証明書のエントリをテキスト形式で見ると

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 35 (0x23)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, L=Chiyodaku, O=TORICO, OU=CA, CN=tech.torico-corp.com/...
        Validity
            Not Before: Apr 27 05:54:47 2017 GMT
            Not After : Apr 25 05:54:47 2027 GMT
        Subject: C=JP, ST=Tokyo, O=torico, CN=*.torico-corp.com ←※
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
...

このような感じになっていると思います。大抵、証明書を設置するドメインを「←※」の箇所の CN= に書きますが、Chrome 58 以降、この CN= を評価しなくなったようです。

そのため、閲覧しているドメインが CN= に一致しても、証明書が検証できないとしてエラーになります。

対策

ドメイン名は CN= では判定しなくなったため、どこで判定するかというと

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 35 (0x23)
        Signature Algorithm: sha256WithRSAEncryption
...
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
...
            X509v3 Authority Key Identifier:
...

            X509v3 Subject Alternative Name:
                DNS:torico-corp.com, DNS:*.torico-corp.com ←※

    Signature Algorithm: sha256WithRSAEncryption

この、X509v3 Subject Alternative Name: DNS: で判定します。略して SAN と言われるやつです。

DNS: という名前がめちゃくちゃわかりにくいですが、ここに CN= に書いてたドメインと同じものを記入することで Chrome58+ で認識します。

この値は Chrome58 より古いバージョンでも読めるようになっていますが、Chrome58 は CN= が読み込まれなくなったため、SANに書いてます。

SAN の DNS: は複数書けるので、手持ちのドメインをすべて列挙しておくと便利でしょう。

証明書の作り方

認証局証明書 (CA証明書)

認証局証明書 (CA の PEM から作る公開証明書) の更新は不要です。今までの証明書を使いまわせます。

CSR (認証リクエスト)

openssl req -new -newkey rsa:2048 -nodes \
    -out ${CSRファイル名}.csr \
    -keyout ${鍵ファイル名}.key \
    -sha256 \
    -config ca.conf \
    -subj "/C=JP/ST=Tokyo/L=Chiyoda/O=torico/CN=${CN}"

おそらくこのような感じのコマンドで CSR を作られていると思いますが、この -config のファイルで次のように指定します。

ca.conf

[ ca ]
default_ca = CA_default

[ CA_default ]
...
x509_extensions = usr_cert
...

[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca
req_extensions = v3_req

...

[ usr_cert ]
basicConstraints=CA:FALSE
nsComment = "OpenSSL Generated Certificate"

subjectKeyIdentifier = hash
authorityKeyIdentifier=keyid,issuer:always
subjectAltName = @alt_names

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = torico-corp.com
DNS.2 = *.torico-corp.com
DNS.3 = mangazenkan.com
DNS.4 = *.mangazenkan.com
DNS.5 = sukima.me
DNS.6 = *.sukima.me

かいつまんで書いてますが、こんな感じです。

CSRを作る際

[req] req_extensions = v3_req

[v3_req] subjectAltName = @alt_names

[alt_names] DNS.1 = サーバのドメイン名

といった流れで参照します。この設定ファイルを -config で指定して CSR を作ると、CSR に X509v3 Subject Alternative Name:エントリが入ります。

作ったCSR をテキストで確認するには

openssl req -noout -text -in ${CSRファイル名}.csr

で見れます。

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo, L=Chiyoda, O=torico, CN=*.torico-corp.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
        Attributes:
        Requested Extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:torico-corp.com, DNS:*.torico-corp.com, DNS:mangazenkan.com, DNS:*.mangazenkan.com, DNS:sukima.me, DNS:*.sukima.me

このように、複数のDNS: が出力されているはずです。

CSRをCAで認可しサーバ証明書を作る

openssl ca -batch -passin pass:${CAパスワード} -config ca.conf \
    -in ${CSRファイル名}.csr \
    -keyfile ${CA鍵ファイル}.key \
    -cert ${CA鍵証明書}.pem \
    -out ${出力するサーバ証明書}.crt -days 3650

このようなコマンドでサーバ証明書を作られると思いますが、今回も -config で先ほどと同じファイルを指定しています。

先ほどは [req] のディレクティブを読み込んで使いましたが、今回は

[ CA_default ] x509_extensions = usr_cert
             ↓
[ usr_cert ] subjectAltName = @alt_names
             ↓
[alt_names] DNS.1 = ...

とたどって alt_names ディレクティブを読み込みます。

(読む項目が違うので、CSRを作る時に使った設定ファイルと設定ファイルを別にしても良いです)

(もしかして、このCSRのCA認証だけ SANを出力するよう設定しておけば、CSR を作る際の SAN出力は不要かもしれません。未確認)

これで証明書を作ると、

Certificate Details:
        Serial Number: 35 (0x23)
        Validity
...
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = torico
            commonName                = *.torico-corp.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
...
            X509v3 Authority Key Identifier:
...

            X509v3 Subject Alternative Name:
                DNS:torico-corp.com, DNS:*.torico-corp.com, DNS:mangazenkan.com, DNS:*.mangazenkan.com, DNS:sukima.me, DNS:*.sukima.me

このように、X509v3 Subject Alternative Name:  (SAN) が出力されます。

この PEM を Nginx やら Apache やらの SSL 証明書に指定し、サーバを再起動すれば Chrome58 でも証明書のエラーが出なくなるはずです。

現在の評価: 4.0

コメント

コメントを投稿
コメントするには TORICO-ID にログインしてください。
ログイン コメント利用規約