NET::ERR_CERT_COMMON_NAME_INVALID なんだこれ?

備忘録。あしらからず。

WSLのおかげでもうほとんどLinuxな仮想マシンは要らなくなったのでホントにラクチン。まぁ、業務上必要なのでまだまだ HyperVにはお世話にならんといけませんが・・・。

で、WSL-UbuntuにSSL通信(HTTPS)させようと、ひさしぶりにopensslコマンドとか使う。なにげにopensslは万能コマンドすね。乱数からダイジェストから暗号化まで全部できちゃう!(^^; で、まぁ、お約束どおりCA.pl -newcaとかで認証局を作って、認証局の証明書をWindowsの証明書マネージャで「信頼されたルート証明機関」にインポート後、openssl.cnfいじって、あとはお決まりのCSR作って、さっき作った認証局で署名して、そのサーバー証明書(CN=localhost)をapache2に食わせて、https://localhost/ にアクセスしたんすよ。

結果、撃沈。昔はこれでいけたんです! IE11だと問題ないし。

最新のChrome/FireFox/Edge ぜんぶダメ。chromeだとNET::ERR_CERT_COMMON_NAME_INVALIDとかいう謎のエラーが出る。。。いやいや、証明書のプロパティを見るとちゃんと CN=localhostってなってるし・・・。

で、このエラーをそのままググると、最近のブラウザはCNは無視するみたいで・・・って、よくわからんが、最近は、CNの一致ではなく、SANを見てるんだとか・・・。理屈はともかく、理由が分かればあとは証明書の作り方を変えればオケ。

とりあえず、CSR(署名要求)まではお約束通り。
※openssl.cnfの設定はググればよろし。ただ、CA向け用とサーバー向け用とファイルを分けて使い分けるのが間違いがなくてよろしかと。
デフォルトのopenssl.cnfをCA用として修正し、サーバー証明書作成時に使う設定は openssl-server.cnfと別ファイルにして使ってます。

#1.認証局作成
$ cd /usr/lib/ssl/misc
$ ./CA.pl -newca

# Windowsの証明書マネージャで「信頼されたルート証明機関」にインポートとするため der に変換。
# でも cacert.pem を直接インポートしたら普通にできたので、↓要らないかも。
$ cd demoCA
$ openssl x509 -in cacert.pem -inform pem -out cacert.der -outform der

#2.サーバーキー作成
$ cd /etc/ssl
$ mkdir server; cd server
$ openssl genrsa -out localhost.pem -aes256 2048
$ openssl rsa -in localhost.pem -out localhost.key

#3.署名要求作成
$ openssl req -new -config ../openssl-server.cnf -key localhost.pem -out localhost.csr

そして・・・CSR(署名要求)を認証局に署名してもらうときに、下記の内容のテキストファイルを用意して、-extfile オプションをつけて食わせるといいようです。理屈はどうでもいい。まずは手順さえ覚えて、あとから調べればいいんです。逃げ。

subjectAltName=DNS:localhost

複数の場合はカンマで区切れば行けそう?

subjectAltName=DNS:localhost,IP:127.0.0.1

このファイルを署名するときに食わせる。

$ echo "subjectAltName=DNS:localhost" > localhost.san
$ openssl ca  -config ../openssl-server.cnf -in localhost.csr -out localhost.crt -extfile localhost.san

そして、できた localhost.keyとlocalhost.crt の二つを /etc/apache2/sites-available/default-ssl.conf の SSLCertificateFile とSSLCertificateKeyFile に記述。そして起動する。

$ a2enmod ssl
$ a2ensite default-ssl
$ service apache2 start

そして、1.で作ったcacert.der をデスクトップにコピーして 右クリック⇒証明書のインストールで「信頼されたルート証明機関」へストア。

ってなわけで?めでたく、最新のブラウザでも https://localhost/ で緑色の鍵マーク付きで表示された。

フリーのSSL証明書をお試し中

追記 2017/3/11
最新のChromeおよびFirefoxでは、現在 startssl の無料版のSSLサーバー証明書は拒否されます。将来のバージョンでは復活する可能性もなくはないと思いますが、現在のところ、無料で発行してくれるSSL証明書は let’s encrypt のみとなっているみたい。

このサイトも、startsslのものを使っていましたが、lets encrypt に変更しました。
OSのバージョンが理由で、公式ツールは使えませんでしたが、dehydratedというシェルスクリプトで運用することにしました。


ずっとこのドメインは オレオレ認証でSSL通信してたわけですが、なんか世の中的にはSSL(HTTPS)がデフォルトに、という方向を向いてるようなので、とりあえず、無料のSSL証明書をググってみたら、非商用個人向けに限ると「StartSSL」というのが主流だそうです。というか、無料だとこれしかないみたいです(^^;;;
詳しいことはよく分かりませんが、 非商用個人だと 有効期限1年のClass1のServer証明書(DV)を5ドメインまで発行してくれるみたい。

あと、つい最近正式にサービスが開始された、Let’s Encrypt というのがあって、Let’s Encrypt 総合ポータルによると・・・

無料で利用できる自動化されていてオープンな認証局(CA)です。公共の利益を図る目的で Internet Security Research Group (ISRG) が運営しています。

だそうです。特筆すべきは、商用利用も可能だということ。まぁ、でも、あくまでDV(Domain Validation)だけですので商用利用・・・っていうのはどうなんでしょうかねぇ???という感じです。ただ、有効期限が3ヶ月なので、SSL証明書の更新を自動化して運用するのが前提のサービスですね。


startssl  lets_encrypt

最初、Let’s Ecrypt を使ってみよう・・・と思ったんですが・・・僕が利用しているVPSのOSがCentOS5のままなので、yumでインストールできるソフトが古すぎて、Let’s Encryptで使用するCertbot クライアントを導入できませんでした(笑) OSのバージョンアップとかメンドクサイので諦め。

ってことで、StartSSL で SSL証明書を発行してもらってApacheに設定して、オレオレ認証局から卒業です(^^)