【Docker】出来るだけ簡単に自己証明書を作ってChromeでの検証を通す(警告ページを回避する)

2023/05/21に公開

準備

今回使うイメージ
https://github.com/paulczar/omgwtfssl

ざっくり検索した感じ「Dockerで自己証明書を作る」という目的では一番有名に見えた。

証明機関といってもサーバーを常時稼働させる必要もないので、どのマシンでも良い。
良いが、CAルート証明書が毎回変わるとめんどくさいので、1つのマシンと決めたほうが楽ではある。

手順

コマンドベースだとめんどくさいので、docker-compose.yaml と .env にまとめた。
openwrt.local(192.168.0.220) の証明書を作るという例。

▼ docker-compose.yaml

version: '3'
services:
  mkdir:
    image: alpine
    volumes:
      - ./certs:/certs
    command: sh -c "mkdir -p /certs/${ROOT_DIR}; mkdir -p /certs/${DOMAIN}"

  ca:
    image: paulczar/omgwtfssl
    container_name: ${CA_NAME}
    depends_on:
      - mkdir
    volumes:
      - ./certs:/certs
    environment:
    - CA_SUBJECT=${CA_NAME}
    - SSL_SUBJECT=${DOMAIN}
    - SSL_DNS=${ALT_DOMAINS}
    - SSL_IP=${IPS}
    - CA_KEY=${ROOT_DIR}/ca-key.pem
    - CA_CERT=${ROOT_DIR}/ca.pem
    - SSL_KEY=${DOMAIN}/key.pem
    - SSL_CERT=${DOMAIN}/cert.pem
    - SSL_CSR=${DOMAIN}/key.csr
    - CA_EXPIRE=${CA_EXPIRE}
    - SSL_EXPIRE=${SSL_EXPIRE}
    - SSL_SIZE=${SSL_SIZE}

▼ .env

CA_NAME=takashiaihara-ca
DOMAIN=openwrt.local
ALT_DOMAINS=openwrt # comma separeted
IPS=192.168.0.220 # comma separeted
ROOT_DIR=root
CA_EXPIRE=3650
SSL_EXPIRE=3650
SSL_SIZE=4096

▼ コマンド

docker compose up

実行後

ミソは、

  • alpineでディレクトリをあらかじめ作らせる。(ディレクトリが無いとエラーになる)
  • CA鍵/証明書などはROOT_DIRに入れる。
  • ドメインごとに鍵/証明書/リクエストのディレクトリを分ける。

という部分。
これによって、ルートCAの証明書などを再利用させつつ、複数ドメインの証明書を追加発行しやすくなる。

参考

paulczar/omgwtfssl って Chrome用の証明書作れるの?

現在は作れます。

まず前提情報として、Chromiumベースブラウザは SAN(Subject Alternative Name) という項目がサーバー証明書に含まれてないとERR_CERT_COMMON_NAME_INVALID という警告ページが表示されます。

https://www.ipentec.com/document/windows-chrime-error-net-err-cert-common-name-invalid-using-ssl-certificate-signed-with-local-ca

いくつかの記事や、paulczar/omgwtfssl のIssueでERR_CERT_COMMON_NAME_INVALID が出るという報告がありますが、現在は解消されています。

Discussion