Skip to content

Osamix2000/mkdevcert

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

自己証明書作成スクリプト

開発環境向けの自己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も利用可能

前提

以下のコマンドが必要です。

openssl
bash
grep
sed
awk

Ubuntu/Debian系でCAをインストールする場合は、以下も必要です。

update-ca-certificates

Red 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.conf

CN=*.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

nginx設定例

ssl_certificate /root/.ssl/example.com/example.crt;
ssl_certificate_key /root/.ssl/example.com/example.key;

設定反映前に確認します。

nginx -t
systemctl reload nginx

Windows側へCAをインストールする

Windowsでは、以下のCA単体証明書を「信頼されたルート証明機関」にインストールしてください。

example-ca.crt

nginx用のfullchainである example.crt ではなく、CA単体の example-ca.crt を入れてください。

Linux側へCAをインストールする

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を単体で使う場合

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-run

install-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-key

nginxの ssl_certificate_key のパスが同じであれば、nginx設定自体はそのままで構いません。ただし、証明書と秘密鍵の中身が変わる為、nginxのreloadは必要です。

CAも作り直す

./mkdevcert.sh --rebuild example.conf --rotate-ca

CAを作り直した場合、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 auto

CentOS7等も含めて幅広く使う場合は、デフォルトのRSAを推奨します。

確認コマンド

fullchain内の証明書数を確認します。

grep -c 'BEGIN CERTIFICATE' ./.ssl/example.com/example.crt

CA証明書が 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 md5
openssl x509 -in ./.ssl/example.com/example.crt -pubkey -noout | openssl md5

MD5値が一致すれば対応しています。

注意点

  • このスクリプトは開発環境向けです。
  • 公開サービスや本番環境では、原則としてLet's Encrypt等の公的に信頼された証明書を利用してください。
  • *-ca.key はCA秘密鍵です。漏洩するとそのCAで任意の証明書を発行できる為、厳重に管理してください。
  • クライアント側へインストールするのはfullchainではなく、CA単体の <NAME>-ca.crt です。
  • --rotate-ca を使った場合は、クライアント側のCA入れ直しが必要です。

About

Development self-signed CA and fullchain certificate generator for Linux.

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages