SAN付きの自己証明書作成してブラウザアクセス時の自己証明書の警告を消したい

2022.10.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。大阪オフィスの林です。

検証用にサクッと自己証明書を作成して作業する機会はそれなりに多いのですが、自己証明書であるがゆえに、その自己証明書をアタッチしたリソース(ALBなど)にアクセスすると証明書に問題があることを示す警告が表示されます。
こんな感じの警告です。
リンクをクリックすればアクセスは出来るものの、この警告を表示させたくありませんでした。
アクセス元のクライアントPCに証明書をインポートすれば警告は解消できそうなのですが、Chrome 58以降、「CN」の値を評価しなくなっているとのことだったので、コモンネームではなくSAN(Subject Alternative Name) を加えた自己証明書を発行して、Chrome経由のアクセスで、この警告が解消するか検証みたいと思います。 ※今回の検証ではアクセス先となるEC2やALBは予め作成していることとします。

やってみた

Opensslを使っていきますので、Opensslをインストールします。

[cloudshell-user@ip-10-0-141-55 ~]$ sudo yum install openssl -y

SANを加えた自己証明書を発行するために、予めSANに登録するドメインのリストをファイルに保存しておきます。(今回はmy-test-domain.localというドメインを使っていきます)

[cloudshell-user@ip-10-0-141-55 ~]$ cat san.txt 
subjectAltName = DNS:*.my-test-domain.local, DNS:my-test-domain.local

秘密鍵を作成します。

[cloudshell-user@ip-10-0-141-55 ~]$ openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
..............+++
....................................+++
e is 65537 (0x10001)
[cloudshell-user@ip-10-0-141-55 ~]$

CSRを作成します。

[cloudshell-user@ip-10-0-141-55 ~]$ openssl req -out server.csr -key server.key -new
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:jp
State or Province Name (full name) []:osaka
Locality Name (eg, city) [Default City]:osaka
Organization Name (eg, company) [Default Company Ltd]:my-company
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:my-test-domain.local
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[cloudshell-user@ip-10-0-141-55 ~]$

予め作成しておいたSANの情報(san.txt)を加え、サーバー証明書を作成します。

[cloudshell-user@ip-10-0-141-55 ~]$ openssl x509 -req -days 3650 -signkey server.key -in server.csr -out server.crt -extfile san.txt
Signature ok
subject=/C=jp/ST=osaka/L=osaka/O=my-company/CN=my-test-domain.local
Getting Private key
[cloudshell-user@ip-10-0-141-55 ~]$

上記作業を行うと、はじめに作成したsan.txtを除く3つのファイルが生成されています。

[cloudshell-user@ip-10-0-175-240 ~]$ ll
total 16
-rw-rw-r-- 1 cloudshell-user cloudshell-user   70 Oct 27 06:51 san.txt
-rw-rw-r-- 1 cloudshell-user cloudshell-user 1273 Oct 27 07:27 server.crt
-rw-rw-r-- 1 cloudshell-user cloudshell-user  997 Oct 27 07:26 server.csr
-rw-rw-r-- 1 cloudshell-user cloudshell-user 1675 Oct 27 06:56 server.key
[cloudshell-user@ip-10-0-175-240 ~]$

作成された証明書をACMにインポートしていきますので、ACMのダッシュボードから「インポート」を選択します。

生成されたserver.crtの中身をコピーします。

[cloudshell-user@ip-10-0-141-55 ~]$ cat server.crt 
-----BEGIN CERTIFICATE-----
(省略)
-----END CERTIFICATE-----
[cloudshell-user@ip-10-0-141-55 ~]$

コピーした内容を証明書本文に貼り付けます。

次に生成されたserver.keyの中身をコピーします。

[cloudshell-user@ip-10-0-141-55 ~]$ cat server.key 
-----BEGIN RSA PRIVATE KEY-----
(省略)
-----END RSA PRIVATE KEY-----
[cloudshell-user@ip-10-0-141-55 ~]$

コピーした内容を証明書のプライベートキーに貼り付け「次へ」を選択します。

必要に応じてタグを設定し「次へ」を選択します。

内容を確認し「インポート」を選択します。

証明書がインポートされ「発行済み」となりました。

ALBのリスナールールにインポートした証明書をアタッチします。

この状態でブラウザアクセスすると前述した警告が出て「保護されていない通信」となります。

クライアントPCに証明書をインポートします。生成されたファイルのserver.crtをダウンロードします。
※手元のPCがWindowsなので以降の手順はWindowsの手順となります。

ダブルクリックして「開く」を選択します。

「詳細」タブを確認し「サブジェクト代替名」に指定したドメイン名が設定されていることを確認します。

「全般」タブから「証明書のインストール」を選択します。

「現在のユーザー」を選択している状態で「次へ」を選択します。

「証明書ストア」で「信頼されたルート証明機関」を選択し「次へ」を選択します。

「完了」を選択します。

警告ダイアログが出た場合は「はい」を選択します。

「正しくインポートされました。」で「OK」を選択します。

証明書がインポートされました。

この状態でChromeでブラウザアクセスすると、警告無くアクセスできることを確認出来ました。

Edge経由でアクセスしても、警告無くアクセスできることを確認出来ました。

まとめ

自己証明書の警告エラーを回避したい方の参考になりましたら幸いです。

以上、大阪オフィスの林がお送りしました!