開発環境で雑にTLS接続時の「この接続ではプライバシーが保護されません」を消したい。
開発環境の為に雑に作って設定しておいたワイルドカードな自己証明書が Google Chrome でプライバシーエラーを表示するようになったので、もっと雑に作れるようにならないですか?と調べた記録です。
※本番環境(自分のコンピューター以外)では使えません。念のため。
TL;DR
subjectAltName 辺りを設定したものを作る

※画像はイメージ
目的の環境
- Windows10でやりたい。(x64)
- Apacheが動いているやつ。(2.4系)
- Source Tree を入れた時にいい感じに入った MINGW64 を雑に使う
※Bash on (以下略) でやりたい方でも恐らく動くと思いますよ。でも雑にエクスプローラーでファイル弄りたいのですよ。
解決方法
エラーで検索しましょう。という基本通りに検索すると、スタック・オーバーフローが出てきます。
stackoverflow.com
なるほど、応答ファイルを作成して、それを読ませれば良いのですか。
こちらも確認すると良い(意訳)。というリンクを見ると、他の環境で作成する方法が用意されています。
stackoverflow.com
有り難し。ということで、雑に作れるように書き換えます。
まずは、程よい期間のルート(自己)証明書を作成するためのやつを用意します。
create_root_cert_and_key.sh
openssl genrsa -out example.com.rootCA.key 2048
openssl req -x509 -new -nodes -key example.com.rootCA.key -sha256 -days 65535 -out example.com.rootCA.pem
cp example.com.rootCA.pem example.com.rootCA.crt
openssl x509 -text -in example.com.rootCA.pem -noout
3行目以降のコマンドは、Windows環境で証明書のインストールをサッとできるようにするためのリネーム(コピー)と作成した証明書を確認の為に表示するやつです。
ファイル名をいじる為の苦労は惜しまない。という方は無くても良いです。
次に、任意のサブドメインを使えるようにする追加ファイルを用意します。
v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
DNS.2 = %%COMMON_NAME%%
DNS.3 = *.cdn.local.example.com
こちらは大分オリジナルのものと変わっています。
DNS.1 は ワイルドカードにしないドメイン名(例 local.example.com )
DNS.2 は ワイルドカードのドメイン名(例 *.local.example.com )
に置き換えられます。以下、DNS.3など番号とドメイン(FQDN)を増やして適宜追加するやつです。
最後に、サーバーに設定する証明書を生成するためのやつです。
create_certificate_for_domain.sh
if [ -z "$1" ]
then
echo "Please supply a subdomain to create a certificate for";
echo "e.g. example.com"
exit;
fi
DOMAIN=$1
C="JP"
ST="Tokyo"
L="Chiyoda"
O="*Example.com"
OU="Example"
COMMON_NAME=${2:-*.$1}
NUM_OF_DAYS=65536
SUBJECT="/C=$C/ST=$ST/L=$L/O=$O/CN=$COMMON_NAME"
openssl req -new -sha256 -nodes -key example.com.rootCA.key -subj "$SUBJECT" -out tmp.csr
cat v3.ext | sed s/%%DOMAIN%%/$DOMAIN/g > ./tmp__v3.ext
cat tmp__v3.ext | sed s/%%COMMON_NAME%%/$COMMON_NAME/g > ./tmp__v3.ext
openssl x509 -req -in tmp.csr -CA example.com.rootCA.pem -CAkey example.com.rootCA.key -CAcreateserial -out tmp.crt -days $NUM_OF_DAYS -sha256 -extfile ./tmp__v3.ext
mv tmp.csr $1.csr
cp tmp.crt $1.crt
rm -f tmp.crt;
rm -f tmp__v3.ext;
こちらも雑にサッと作れるよう、書き換えてあります。
これら3つのファイルを同じディレクトリに置いて、対象のディレクトリからMINGW64を立ち上げます。
ワンポイント
よく忘れる鍵の強度のトレンドはGoogleのドキュメントに従う事にします。(2048bitはもう良いでしょう。と思いながらうっかり4096bitにしてしまう)
サーバーでの HTTPS の有効化 | Web | Google Developers
自己証明書を作成する
ルート(自己)証明書をサッと作りましょう。
vm@DESKTOP MINGW64 /d/dev/git/example-test (master)
$ ./create_root_cert_and_key.sh
キー生成の後に、幾つかのよくある質問を入力すると、完成します。
一例として、以下のような出力となります。
Generating RSA private key, 2048 bit long modulus
...............+++
.......................................+++
e is 65537 (0x10001)
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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Chiyoda
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Pocket Systems
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*Pocket Systems
Email Address []:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
b0:60:60:79:4e:d2:62:9e
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Tokyo, L=Chiyoda, O=Pocket Systems, CN=*Pocket Systems
Validity
Not Before: Jun 2 03:12:59 2017 GMT
Not After : Nov 5 03:12:59 2196 GMT
Subject: C=JP, ST=Tokyo, L=Chiyoda, O=Pocket Systems, CN=*Pocket Systems
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:b0:22:96:91:55:d2:62:1f:10:1c:f0:88:6f:ca:
34:97:00:65:e1:3f…
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
55:0C:EB:CC:54:FE:DF:C7:39:03:09:FD:F2:C2:F2:57:63:0F:F5:62
X509v3 Authority Key Identifier:
keyid:55:0C:EB:CC:54:FE:DF:C7:39:03:09:FD:F2:C2:F2:57:63:0F:F5:62
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
87:83:b5:17:e4:7c:e6:5e:d5:e8:70:7d:59:bf:10:51:9b:d6:
88:8c:5a:1c…
この例では、以下の4ファイルが生成されます。
Windows環境では、ここで example.com.rootCA.crt を右クリックすると証明書のインストールが利用できます。

証明書のインポート ウィザードを起動して、保存場所とストアの配置先を指定します。
簡単に削除できるよう、現在のユーザーのみ参照できるようにして、信頼されたルート証明機関として配置します。

「完了」ボタンを押すと、登録されます。
それでは次に、サーバー用の証明書を作りましょう。
vm@DESKTOP MINGW64 /d/dev/git/example-test (master)
$ ./create_certificate_for_domain.sh local.example.com
利用するドメイン名(FQDN)を含めます。
一例として、以下のような出力となります。
Signature ok
subject=/C=JP/ST=Tokyo/L=Chiyoda/O=*Example.com/CN=*.local.example.com
Getting CA Private Key
この例では、以下の2ファイルが生成されます。
最後に、サーバー側に生成された証明書と鍵を適切に設置、指定をするとアクセスできるようになります。

良かったですね。
Q:ところで、何故サーバー用に使う鍵をルート(自己)証明書と同じものを使っているのですか?
A:雑に作りたかったから。
そもそも、ローカル環境のみで扱うために用意されたものですので、雑です。
秘密鍵くらいは考えて保管しましょう?という方は、少し改良すると良いと思いますよ。鍵を2つ生成すれば良いのですから。
オプションの中に証明書マネージャーへアクセスするボタンがあります。
エディションによってタブや配置が変わるので、頑張って探してみてください。
また、Windowsの証明書管理領域や、他のエディションとは独立しています。

くまやつ。