Chrome拡張機能を配布する方法(セルフホスト配布)で、拡張機能を配布するサーバはSSL対応している必要があると記載しました。外部に公開しているサーバであれば、DDNSでドメインを取得し、Let’s Encrypt などを利用して証明書を発行していもらうことも可能です。
しかし、私のように家のローカルネットワークでのみ配布サーバを展開していて、外部へは公開していない場合はLet’s Encryptで証明書を発行してもらうことが簡単には出来ないかと思います。
※Let’s Encrypt は、基本的に外部からアクセスできるWebサーバに対して発行するため。
と言うわけで、ローカルネットワークにあるWebサーバに自己署名証明書(オレオレ証明書)を作成して適用することが必要になります。
ここで重要なのが、本来Let’s Encrypt等の証明書発行機関に発行してもらう証明書は、認証局によってその証明書が認証されています。認証と言うのは、第三者機関から証明書お墨付きを得ていて安全が保障されている状態です。
しかし、自己署名証明書は、自分で勝手に発行した証明書なので、誰からも認証を得ていません。
このため、自己署名証明書を適用しただけのWebサーバへ対して、いくらSSL(https)アクセスしても次のような画面が表示されてしまいます。
この状態では、httpsでアクセスしているものの、証明書は有効になっておらず、通信の暗号化もされていない状態になっているハズですので、役に立ちません。
誰も認証してくれないのであれば、自分で認証する必要があります。
自己署名証明書を作成し、自分で認証する
ローカルエリア用のドメイン名を決める
ローカルエリア専用で使うドメインとしては、.local 等が良く使われてきたようですが、どうやら問題があるらしく、家庭での利用であれば .home の利用が推奨されるようです。
※企業のローカル用だと .corp .mail とかもあるみたい
ですので、なんちゃらかんちゃら.home などとしようと思います。
とりあえず、ここでは hogehoge.home で、作成する方法を例としていきます。
openssl コマンドで証明書を作成する
※前提としてopensslが利用できる必要があります。
私の場合はUbuntu環境にて実行しています。
1.秘密鍵を作成
1 |
openssl genrsa 2048 > www.hogehoge.home_private.key |
“www.hogehoge.home_private.key” ファイルが作成されます。
2.署名要求書(CSR:Certificate Signing Request)作成
先ほど作成した秘密鍵を使って作成します
1 |
openssl req -new -key www.hogehoge.home_private.key -subj "/C=JP/ST=Tokyo/L=Chiyodaku/O=hogehoge System/OU=IT dept./CN=www.hogehoge.home" > www.hogehoge.home.csr |
※O:組織名、OU:組織単位名(部署?)、CN:FQDN or YOUR name
“www.hogehoge.home.csr” ファイルが作成されます。
3.サーバ証明書(CRT)作成
Webサーバへ配置する証明書を作成します。※CSRを秘密鍵で暗号化して署名する
(1)subjectAltName を定義したファイルを作成
※GoogleChromeブラウザでサーバへアクセスするときに必要でした。
1 |
echo "subjectAltName = DNS:www.hogwhogw.home" > san.txt |
(2)署名
CSR を 秘密鍵 で 暗号化して署名、この時、先ほど作成した san.txt を適用
1 |
openssl x509 -days 3650 -req -signkey www.hogehoge.home_private.key < www.hogehoge.home.csr > www.hogehoge.home_server.crt -extfile san.txt |
“www.hogehoge.home_server.crt” ファイルが作成されます。
作成したサーバ証明書(CRT)をWebサーバへ配置する。
※配置方法に関しては、IIS、Apache、nginx で様々なので割愛
4.ルート証明書(CRT)を作成
ルート証明書は、サーバへアクセスするクライアント側へ導入します。
※サーバ側で hogehoge.home の証明書を提示してくるが、クライアント側は 知らない認証局の署名のため、安全で無いと判断する。安全な認証局だと信頼してもらうために導入。
(1)不足情報を定義するファイルを作成
※これが無いと、ChromeBookでインポート時に「認証局ではありません」と拒否される
ext.txt として下記内容で作成(CA:TRUE ってのが重要っぽい)
1 2 3 4 5 6 7 |
authorityKeyIdentifier = critical, keyid, issuer basicConstraints = critical, CA:TRUE keyUsage = critical, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = *.hogehoge.home |
(2)署名
CSR を 秘密鍵 で 暗号化して署名、この時、今度は先ほど作成した ext.txt を適用
1 |
openssl x509 -days 3650 -req -signkey www.hogehoge.home_private.key < www.hogehoge.home.csr > www.hogehoge.home_root.crt -extfile ext.txt |
“www.hogehoge.home_root.crt” ファイルが作成されます。
※実は、こちらのCRTでもサーバ側で利用できました。。。問題あるのかも?
作成したルート証明書(CRT)を各クライアント端末側へインポートしてあげる。
最後に
私の環境では、この方法で証明書を作成することで、問題なくSSL(https)でWebサーバと通信できるようになりました。
WebサーバがSSL(https)でアクセスできるようになったことで、Chrome拡張機能を自前のWebサーバから配布する要件も満たせたことになり、無事拡張機能のバージョンアップ等も行えています。
※実際には、Webサーバに対してのアクセスは、IPアドレスを指定するのではなく、今回証明書を作成したようにドメイン名でのアクセスになるため、別途ドメイン名で名前解決(hotsに記載する等)できるようにする必要があります。
コメント