dev.local というドメインで作る場合

SAN値の設定ファイル作成(san.txt)

1
2
$ cat san.txt
subjectAltName = DNS:*.dev.local, DNS:dev.local

生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ openssl ecparam -name secp384r1 -genkey -out server.key

$ openssl req -new -sha256 -key server.key -out server.csr
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]:osaka
Locality Name (eg, city) []:osaka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:my-company
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:dev.local
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

$ openssl x509 -req -days 36500 -signkey server.key -in server.csr -out server.crt -extfile san.txt
Certificate request self-signature ok
subject=C = jp, ST = osaka, L = osaka, O = my-company, CN = dev.local
1
2
$ ls
server.crt server.csr server.key san.txt

nginx.conf設定例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
client_max_body_size 100M;

listen 443 ssl;
server_name xxx.dev.local;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_ecdh_curve secp384r1;

ssl_prefer_server_ciphers on;

location / {
root /usr/share/nginx/html;
break;
}
}

docker-compose.yml設定例

1
2
3
4
5
6
7
8
reverse-proxy:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./volumes/nginx/etc/nginx/conf.d:/etc/nginx/conf.d # nginx.conf
- ./volumes/nginx/etc/nginx/certs:/etc/nginx/certs # server.{crt|csr|key}

クライアント側でインポート(Windowsの例)

  1. 対象ドメインにブラウザでアクセス(xxx.dev.local)
  2. アドレスバーの警告マークをクリック
  3. 「証明書が無効です」をクリック
  4. 「詳細」→「エクスポート」
  5. 証明書の種類はデフォルトのままで、証明書(crt)をダウンロード
  6. 開いているブラウザをすべて閉じる
  7. 「スタート」メニュー → 検索バーに「ユーザー証明書の管理」と入力して実行
  8. 「certmgr」というのが起動したら、「信頼されたルート証明機関」を右クリック
  9. 「すべてのタスク」→「インポート」
  10. 「参照」で、5でダウンロードした証明書(crt)を指定してインポート
  11. 対象ドメインにブラウザで再度アクセスし、警告が消えているか確認する