すなばいじり

はてなブログを使って、トンピーを揃えるまで止めないブログ。ふっくらかわいい。

Windows環境で 雑にワイルドカード自己証明書を作りたい

開発環境で雑に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

# Country Name
C="JP"

# State or Province Name
ST="Tokyo"

# Locality Name
L="Chiyoda"

# Organization Name
O="*Example.com"

# Organizational Unit Name
OU="Example"

# Common Name
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

# move output files to final filenames
mv tmp.csr $1.csr
cp tmp.crt $1.crt

# remove temp file
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つ生成すれば良いのですから。

 

Firefoxでは、どこで登録すれば?

オプションの中に証明書マネージャーへアクセスするボタンがあります。
エディションによってタブや配置が変わるので、頑張って探してみてください。
また、Windowsの証明書管理領域や、他のエディションとは独立しています。

Firefox 証明書マネージャー

 

 

 

くまやつ。

リズムだいすき こぐまのトンピー ぬいぐるみ

リズムだいすき こぐまのトンピー ぬいぐるみ