Active Directory 証明書サービスで発行した証明書が Chrome だけエラーになる

こんにちは、じんないです。

HTTP 通信を暗号化するために、Active Directory 証明書サービスでサーバー証明書を発行し、Web サーバーに割り当てたのですが Google Chrome でアクセスしたときだけ証明書エラーとなりました。

Internet Explorer や Edge で接続したときはまったく問題ありませんでした。

環境

  • Active Directory 証明書サービス: Windows Server 2012 R2
    • エンタープライズ CA
    • ルート CA
  • Web サーバー: Windows Server 2019 (IIS 10)
  • クライアント: Windows 10 (1809)
    • Chrome: 80.0.3987.163

クライアントにはルート CA の証明書を、Web サーバーにはルート CA が発行した証明書をそれぞれインポートしています。

エラー内容

目的の URL にアクセスすると、この接続ではプライバシーが保護されません と表示され証明書エラーになります。

そして、エラーメッセージには NET::ERR_CERT_COMMON_NAME_INVALID と表示されています。

下記のサイトによると Chrome では SAN (Subject Alternative Name) 属性の値とアクセス先のドメインを検証し、一致していない場合はエラーとなるようです。

実際に証明書を確認すると SAN 属性はありませんでした。

Google Chrome で自組織のCAで署名したSSL証明書のサイトにアクセスすると NET::ERR_CERT_COMMON_NAME_INVALID エラーメッセージが表示される

SAN 属性を持った証明書の発行手順

証明書要求から SAN 属性を受け付けるようにする

デフォルトの設定では SAN 属性が付与されないので、CA の設定を変更します。仮に証明書要求に SAN 属性が含まれていても、除外されるようです。

コマンドプロンプトで以下のコマンドを実行します。

certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2

net stop certsvc

net start certsvc

証明書を要求する

Active Directory 証明書サービスにアクセスし、[証明書を要求する] をクリックします。

※ CSR の作成は済んでいるものとして割愛します。

[証明書の要求の詳細設定] をクリックします。

下側の長い名前の方をクリックします。

作成した CSR の内容を張り付けて、追加属性のところに san:dns=<web サーバーの FQDN> を指定します。

複数の DNS 名やエイリアスがある場合は & でつなげて指定します。
san:dns=<web サーバーの FQDN>&dns=<web サーバーの FQDN>

あとは発行された証明書を Web サーバーにインポートし、バインドすれば OK です。

これで Chrome に怒られなくなりました。

証明書のプロパティを見てみると サブジェクト属性 という項目があり DNS Name がはまっていることが確認できます。

Active Directory 証明書サービスを使って証明書を発行する際は気を付けないといけませんね。

ではまた。

参考

セキュリティで保護された LDAP 証明書にサブジェクトの別名を追加する方法

Google Chrome で自組織のCAで署名したSSL証明書のサイトにアクセスすると NET::ERR_CERT_COMMON_NAME_INVALID エラーメッセージが表示される

Windows Serverの認証局でSAN属性を持たせたマルチドメイン証明書を認証する

SNSでもご購読できます。