開発環境向けの自己CA、サーバー証明書、nginx等で使うfullchain証明書を作成するBashスクリプトです。
mkdevcert.sh で証明書一式を作成し、必要に応じて install-dev-ca.sh でLinux側の信頼ストアへCA証明書をインストールできます。
- 開発環境向けの自己CAを作成
- 自己CAでサーバー証明書を発行
- nginx等で使いやすいfullchain形式のCRTを作成
- クライアントへ配布するCA単体CRTを作成
--rebuildで既存CAと既存サーバー秘密鍵を再利用して証明書だけ再発行--rotate-keyでサーバー秘密鍵を作り直し可能--rotate-caでCAを作り直し可能--with-server-crt指定時のみサーバー証明書単体を出力--build/--rebuild時にLinux向けCAインストール/削除スクリプトを自動生成install-dev-ca.sh単体でもCA証明書をインストール/削除可能- Ubuntu/Debian系、Red Hat系のCAストア更新に対応
- デフォルトはCentOS7等の互換性を考慮して
RSA 4096bit + SHA-256 --algo ed25519または--algo autoでEd25519も利用可能
以下のコマンドが必要です。
opensslbashgrepsedawkUbuntu/Debian系でCAをインストールする場合は、以下も必要です。
update-ca-certificatesRed Hat系でCAをインストールする場合は、以下も必要です。
update-ca-trustリポジトリでは、以下の名前で配置する想定です。
mkdevcert.sh
install-dev-ca.sh
README.md
.gitignore
mkdevcert.sh は証明書作成用です。
install-dev-ca.sh はCA証明書をLinuxの信頼ストアへインストール/削除する単体スクリプトです。
デフォルトでは、以下のように .ssl/<ドメイン>/ 配下へ生成します。
./.ssl/example.com/example.crt
./.ssl/example.com/example.key
./.ssl/example.com/example-ca.crt
./.ssl/example.com/example-ca.key
./.ssl/example.com/example.cnf
./.ssl/example.com/example.csr
./.ssl/example.com/install-example-ca.sh
| ファイル | 用途 |
|---|---|
<NAME>.crt |
nginx等に指定するfullchain証明書 |
<NAME>.key |
nginx等に指定するサーバー秘密鍵 |
<NAME>-ca.crt |
Windows / Linux等のクライアントへ信頼させるCA証明書 |
<NAME>-ca.key |
サーバー証明書へ署名する為のCA秘密鍵 |
<NAME>.cnf |
OpenSSL用サーバー証明書設定 |
<NAME>.csr |
CSR |
install-<NAME>-ca.sh |
作成したCA証明書専用のLinux向けインストール/削除スクリプト |
<NAME>-server.crt |
--with-server-crt 指定時のみ出力されるサーバー証明書単体 |
./mkdevcert.sh --init example拡張子無しで指定した場合は、自動で .conf が付与されます。
example.conf
--init のみでファイル名を指定しなかった場合はエラーになります。
# 開発用自己CA証明書作成用 設定ファイル
# 空行と # から始まる行は無視されます
NAME=example
OUT_DIR=./.ssl
# DOMAIN_DIR=example.com
DAYS=1000000
CA_DAYS=1000000
KEY_ALGO=rsa
C=JP
ST=Example
L=Example
O=Example
CN=*.example.com
CA_CN=Example Local Root CA
DNS=example.com
DNS=*.example.com
DNS=localhost
IP=127.0.0.1
# IP=192.168.0.10
./mkdevcert.sh --build example.confCN=*.example.com の場合、以下のように出力されます。
./.ssl/example.com/example.crt
./.ssl/example.com/example.key
./.ssl/example.com/example-ca.crt
./.ssl/example.com/example-ca.key
./.ssl/example.com/example.cnf
./.ssl/example.com/example.csr
./.ssl/example.com/install-example-ca.sh
ssl_certificate /root/.ssl/example.com/example.crt;
ssl_certificate_key /root/.ssl/example.com/example.key;設定反映前に確認します。
nginx -tsystemctl reload nginxWindowsでは、以下のCA単体証明書を「信頼されたルート証明機関」にインストールしてください。
example-ca.crt
nginx用のfullchainである example.crt ではなく、CA単体の example-ca.crt を入れてください。
mkdevcert.sh --build または mkdevcert.sh --rebuild を実行すると、対象CA専用のインストール/削除スクリプトが生成されます。
./.ssl/example.com/install-example-ca.sh
インストールです。
./.ssl/example.com/install-example-ca.sh削除です。
./.ssl/example.com/install-example-ca.sh --uninstall確認だけ行う場合です。
./.ssl/example.com/install-example-ca.sh --dry-runこの生成スクリプトは、同じディレクトリ内の example-ca.crt を自動で対象にします。
install-dev-ca.sh は配布向けの単体スクリプトです。
デフォルトの証明書参照はありません。必ず --cert でCA証明書ファイルを指定してください。
相対パス指定です。
./install-dev-ca.sh --cert ./.ssl/example.com/example-ca.crt絶対パス指定です。
./install-dev-ca.sh --cert /path/to/example-ca.crt削除です。
./install-dev-ca.sh --cert ./.ssl/example.com/example-ca.crt --uninstall確認だけ行う場合です。
./install-dev-ca.sh --cert ./.ssl/example.com/example-ca.crt --dry-runinstall-dev-ca.sh は、CA単体証明書のみを受け付けます。fullchainやサーバー証明書を指定した場合はエラーになります。
SANや期限等を変更したい場合は、設定ファイルを編集してから --rebuild を実行します。
vim example.conf./mkdevcert.sh --rebuild example.conf通常の --rebuild では、以下を再利用します。
<NAME>-ca.crt
<NAME>-ca.key
<NAME>.key
そして、主に以下を作り直します。
<NAME>.csr
<NAME>.crt
install-<NAME>-ca.sh
CAが同じであれば、Windows / Linux側のCA入れ直しは不要です。
./mkdevcert.sh --rebuild example.conf --rotate-keynginxの ssl_certificate_key のパスが同じであれば、nginx設定自体はそのままで構いません。ただし、証明書と秘密鍵の中身が変わる為、nginxのreloadは必要です。
./mkdevcert.sh --rebuild example.conf --rotate-caCAを作り直した場合、Windows / Ubuntu / Debian / CentOS / RHEL / AlmaLinux / Rocky Linux等のクライアント側でCAの入れ直しが必要です。
./mkdevcert.sh --rebuild example.conf --with-server-crt以下が追加で出力されます。
<NAME>-server.crt
通常のnginx運用ではfullchainである <NAME>.crt と <NAME>.key があれば足ります。
デフォルトでは、以下の形式で出力されます。
./.ssl/<CNから推定したドメイン>/
例です。
| CN | 出力先 |
|---|---|
*.example.com |
./.ssl/example.com/ |
develop.example.com |
./.ssl/example.com/ |
*.example.co.jp |
./.ssl/example.co.jp/ |
localhost |
./.ssl/localhost/ |
自動推定を使いたくない場合は、設定ファイルに DOMAIN_DIR を指定してください。
DOMAIN_DIR=example.com
デフォルトは互換性重視でRSAです。
KEY_ALGO=rsa
Ed25519を使いたい場合です。
./mkdevcert.sh --build example.conf --algo ed25519利用可能ならEd25519、不可ならRSAにしたい場合です。
./mkdevcert.sh --build example.conf --algo autoCentOS7等も含めて幅広く使う場合は、デフォルトのRSAを推奨します。
fullchain内の証明書数を確認します。
grep -c 'BEGIN CERTIFICATE' ./.ssl/example.com/example.crtCA証明書が CA:TRUE か確認します。
openssl x509 -in ./.ssl/example.com/example-ca.crt -noout -text | grep -A2 'Basic Constraints'サーバー証明書のSANを確認します。
openssl x509 -in ./.ssl/example.com/example.crt -noout -text | grep -A3 'Subject Alternative Name'証明書と秘密鍵の対応を確認します。
openssl pkey -in ./.ssl/example.com/example.key -pubout | openssl md5openssl x509 -in ./.ssl/example.com/example.crt -pubkey -noout | openssl md5MD5値が一致すれば対応しています。
- このスクリプトは開発環境向けです。
- 公開サービスや本番環境では、原則としてLet's Encrypt等の公的に信頼された証明書を利用してください。
*-ca.keyはCA秘密鍵です。漏洩するとそのCAで任意の証明書を発行できる為、厳重に管理してください。- クライアント側へインストールするのはfullchainではなく、CA単体の
<NAME>-ca.crtです。 --rotate-caを使った場合は、クライアント側のCA入れ直しが必要です。