開発環境で自前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で証明書をインストールする手順。

  1. root_ca.crtをダブルクリック。
  2. 証明書をインストール。
  3. 「現在のユーザー」を選択して次へ
  4. 「証明書をすべて次のストアに配置する」 を選択
  5. 「信頼されたルート証明機関」を選択
  6. 完了

Chromeを再起動して確認。



▼ 関連記事