開発環境で自前HTTPS(SSL)を構築: FreeBSD14 + step-certificates + step-cli
開発環境でSSL通信環境を設定したときの覚書。
Gemini 2.5 Proと対話。
環境: FreeBSD 14.3-RELEASE-p4, Smallstep CLI 0.28.7, nginx 1.28.0
mkcertがpkgになく、step-certificatesとstep-cliをインストールして設定。
1. step-cli(Smallstep CLI)とは?
Smallstep CLIはPKI(公開鍵基盤)に関する操作を提供するコマンドラインツール。
参考: GitHub - smallstep/cli: 🧰 A zero trust swiss army knife for working with X509, OAuth, JWT, OATH OTP, etc.
ローカル開発やCI/CDパイプラインでの証明書自動化まで幅広く対応している。
2016年に「開発者がインフラをコードで管理するように、証明書もAPIを通じて自動的に管理できるようにすべきだ」と考え、アメリカでSmallstep社を設立。
現在ではデファクトスタンダードの一つとしての地位を確立。
cli-ca(step-certificates)を利用すればプライベート認証局を無料で構築することが可能。
有料のSmallstep社のサービスを利用すればプライベート認証局を簡単に構築できる。
今までSSL証明書を手動で更新していたものが、簡単に自動更新できるようになった。
Let's Encryptで使われている証明書発行・更新の自動化を自前で実装できる。
2. step-certificates + step-cliをインストールして認証局サーバー起動。
step-cliだけではサーバー証明書に署名できなかったので、step-certificatesもインストールする。
pkg経由でインストール。
# pkg install step-cli step-certificates
Following are the defaults for step certificates and can be overridden by rc.conf variables::* The service is run under user step customizable by step_ca_user* The service is run inder group step customizable by step_ca_group* The base directory used for storing CA information is step_ca_stepdir (%%PREFIX%%/etc/step)* The CA informations is held under step_ca_steppath (%%PREFIX%%/etc/step/ca)* The password required for automatic startup is in step_ca_password (%%PREFIX%%/etc/step/password.txt)* By default step certificates logs to syslog with a tag of step_ca
バージョン確認。
# step version
Smallstep CLI/0.28.7 (freebsd/arm64)Release Date: 2025-10-15 06:07 UTC
STEPPATHを設定する。
# echo 'export STEPPATH=/usr/local/etc/step/ca' >> ~/.bash_profile
# source ~/.bash_profile
認証局の設定ディレクトリを作成。
# mkdir -p /usr/local/etc/step/ca
ローカルのルート認証局(CA)の初期化。
最初の認証窓口(Provisioner: プロビジョナー)とルート証明書を作る。
ProvisionerはSmallStep特有の呼び方。
# step ca init
- Standaloneを選択。
- What would you like to name your new PKI?: Smallstep Local Root CA
- What DNS names or IP addresses will clients use to reach your CA?: localhost,127.0.0.1
- What IP and port will your new CA bind to? (:443 will bind to 0.0.0.0:443): :9000
- What would you like to name the CA's first provisioner?: suganuma@hoge.jp
- Choose a password for your CA keys and first provisioner.: (Enterして表示されたパスワードを保存)
✔ Root certificate: /usr/local/etc/step/ca/certs/root_ca.crt✔ Root private key: /usr/local/etc/step/ca/secrets/root_ca_key✔ Root fingerprint: 775d45fe0a3ab18f04f2b4c745f24574e71ed37f26a5f99edf5bc7883a5b76bb✔ Intermediate certificate: /usr/local/etc/step/ca/certs/intermediate_ca.crt✔ Intermediate private key: /usr/local/etc/step/ca/secrets/intermediate_ca_key✔ Database folder: /usr/local/etc/step/ca/db✔ Default configuration: /usr/local/etc/step/ca/config/defaults.json✔ Certificate Authority configuration: /usr/local/etc/step/ca/config/ca.json
サービスの起動ファイル確認。
# less /usr/local/etc/rc.d/step_ca
CAの鍵のパスワードをファイルに書き出し。
# echo 'YOUR_CA_PASSWORD' > /usr/local/etc/step/password.txt
認証局サーバーはstepユーザーとstepグループで起動するので権限変更。
# chown -R step:step /usr/local/etc/step
# chmod 600 /usr/local/etc/step/password.txt
sysrcコマンドで起動ファイルを編集(/etc/rc.conf)
# sysrc step_ca_enable="YES"
認証局サービスの起動して確認。
# service step_ca start
# service step_ca status
待ち受け中のポート確認(9000でLISTENしているかどうか)。
# netstat -an -p tcp
このサーバーは開発環境なので、ファイヤーウォールは起動していない。
3. サーバー証明書の発行
サーバー証明書の置き場所を作成。
# mkdir -p /usr/local/etc/nginx/ssl/dev.hoge.jp
# cd /usr/local/etc/nginx/ssl/dev.hoge.jp
証明書署名要求(CSR)の作成から署名までを一括で行うコマンド。
自動でローカルの認証局サーバーへアクセスして署名する。
# step ca certificate dev.hoge.jp server.crt privkey.pem --password-file /usr/local/etc/step/password.txt
server.crtの内容を確認するコマンド。
# step certificate inspect server.crt
opensslコマンドで確認。
# openssl x509 -in server.crt -text -noout
中間証明書を設定する。
# cd /usr/local/etc/step/ca/certs/
# cat intermediate_ca.crt root_ca.crt > /usr/local/etc/nginx/ssl/dev.hoge.jp/chain.pem
サーバー証明書の有効期間が1日だけだったので、5年間に設定変更する。
参考: step ca provisioner update
認証窓口(provisioner)の確認して、有効期間のデフォルト値と最大値を設定。
(43800h = 5年間)
# step ca provisioner list
# step ca provisioner update suganuma@hoge.jp --x509-default-dur 43800h --x509-max-dur 43800h
サービス再起動。
# service step_ca restart
サーバー証明書を更新するときは下記コマンド。
# step ca renew server.crt privkey.pem
4. Nginxに設定
署名されたサーバー証明書をNginxに設定。
# cd /usr/local/etc/nginx/conf.d/
# less 34_hoge.conf
テストしてnginx再起動。
# nginx -t
# service nginx restart
WordPressならばデータベース内のURLをhttpからhttpsへ置換する。
5. ルート証明書をクライアントのブラウザにインストール
認証局サーバーのルート証明書をコピーしてWindowsへ持ってくる。
# cp /usr/local/etc/step/ca/certs/root_ca.crt /home/httpd/
# chown node:www /home/httpd/root_ca.crt
/home/httpd/はSambaで共有してから。
Windowsで証明書をインストールする手順。
- root_ca.crtをダブルクリック。
- 証明書をインストール。
- 「現在のユーザー」を選択して次へ
- 「証明書をすべて次のストアに配置する」 を選択
- 「信頼されたルート証明機関」を選択
- 完了
Chromeを再起動して確認。