@kyanny's blog

My thoughts, my life. Views/opinions are my own.

SSL/TLS: 自己署名証明書(self-signed certificate)の作り方

再利用と変更のしやすさのため、スクリプトにまとめた。

github.com

Vagrant と Docker での実行方法も記載してある。


ブログ記事や StackOverflow の投稿をたくさん読んだが、中でもこの二つが特に役に立った。


学び・ハマったところ

  • subjectAltName(SAN)を指定する場合は -extfile オプションを使う
  • -extfile オプションを指定する場合は証明書要求(.csr)を作る手順をスキップできない
  • -subj/ で始まる必要がある(空文字列は NG)。-subj "/" でも可。
  • SAN を指定すると CommonName(CN)は無視される
  • だからといって -subj "/" と CN 未指定で作った証明書を nginx にサーバ証明書としてインストールすると HTTPS リクエスト受信時に以下のようなエラーが発生する
    • curl: (60) Issuer certificate is invalid.
    • curl: (60) SSL certificate problem: self signed certificate
curl -v --cacert sample.crt https://example.local/
*   Trying 127.0.0.1:443...
* TCP_NODELAY set
* Connected to example.local (127.0.0.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: sample.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: self signed certificate
* Closing connection 0
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.