ADCSをルート認証局とする認証局をstep-caで建てる

背景

会社で社内認証局を建てよう!という話が出て、step-ca 使ったらうまく出来そうだなと思いましたが、肝心のADサーバーは情報システム課管理で構築までの試行錯誤が難航しそうであったため勉強がてら家でADCSを建ててその下にstep-caを構築してみました。

方針

  1. ルート認証局としてADCSというWindowsサーバーで構築できる認証局を利用する
  2. 中間認証局として step-ca という oss の認証局ソフトウェアを利用する
  3. step-ca は podman で建てる

ルート認証局にADCSを使っておけば一番厄介なルート証明書の配布が少なくともWindowsに対しては自動化できます。さらに、中間認証局として step-ca を利用することで ACME が使えるので証明書の取得と更新がこれまた自動化できます。step-ca 自体は podman のイメージを利用することで構築時間を短縮でき、認証局を移設したいようなことがあった場合も対応しやすいだろうと思っています。

構築

✅ ADCSの構築は難しくないので省略します。
✅ selinux を無効化した環境で podman を使っているのでバインドマウントの挙動が違うかもしれません。

証明書置き場の確保

適当なマシンを用意してディレクトリを掘ります。
ルートユーザーとして下記を実行します。

cd /opt
mkdir step-ca
cd step-ca
mkdir step
chown 1000:1000 step

step-ca の構築

コマンドを入力する前に自分の環境に合わせてパラメータは書き換えます。

各種パラメータ

  • DOCKER_STEPCA_INIT_NAME
    認証局の名前らしいので何でもいい気がします
  • DOCKER_STEPCA_INIT_DNS_NAMES
    認証局のホスト名を設定します(重要)
  • DOCKER_STEPCA_INIT_ACME 空でなければ有効になるらしい???しらんけど
  • DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT あんまりよくわかってないけど true がおすすめらしい
podman run -it -v ./step:/home/step \
    -p 9000:9000 \
    -e "DOCKER_STEPCA_INIT_NAME=Smallstep" \
    -e "DOCKER_STEPCA_INIT_DNS_NAMES=ca.example.com" \
    -e "DOCKER_STEPCA_INIT_ACME=true" \
    -e "DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT=true" \
    smallstep/step-ca

実行すると以下のようになります。(イメージ)

Generating root certificate... done!
Generating intermediate certificate... done!

? Root certificate: /home/step/certs/root_ca.crt
? Root private key: /home/step/secrets/root_ca_key
? Root fingerprint: 0775da290116e80b8d1d4f975489e527c7ffa3661e00a911c577524c9528c285
? Intermediate certificate: /home/step/certs/intermediate_ca.crt
? Intermediate private key: /home/step/secrets/intermediate_ca_key
badger 2025/05/20 13:44:24 INFO: All 0 tables opened in 0s
badger 2025/05/20 13:44:24 INFO: Storing value log head: {Fid:0 Len:30 Offset:3306}
badger 2025/05/20 13:44:24 INFO: [Compactor: 173] Running compaction: {level:0 score:1.73 dropPrefixes:[]} for level: 0
badger 2025/05/20 13:44:24 INFO: LOG Compact 0->1, del 1 tables, add 1 tables, took 4.528827ms
badger 2025/05/20 13:44:24 INFO: [Compactor: 173] Compaction for level: 0 DONE
badger 2025/05/20 13:44:24 INFO: Force compaction on level 0 done
? Database folder: /home/step/db
? Default configuration: /home/step/config/defaults.json
? Certificate Authority configuration: /home/step/config/ca.json
? Admin provisioner: admin (JWK)
? Super admin subject: step

Your PKI is ready to go. To generate certificates for individual services see 'step help ca'.

FEEDBACK ? ?
  The step utility is not instrumented for usage statistics. It does not phone
  home. But your feedback is extremely valuable. Any information you can provide
  regarding how you’re using `step` helps. Please send us a sentence or two,
  good or bad at feedback@smallstep.com or join GitHub Discussions
  https://github.com/smallstep/certificates/discussions and our Discord
  https://u.step.sm/discord.

? Your CA administrative username is: step
? Your CA administrative password is: t8MnYqBolbhoqRTtkXxiE9a5KHV6euQqvH3sNLJW
? This will only be displayed once.
badger 2025/05/20 13:44:24 INFO: All 1 tables opened in 0s
badger 2025/05/20 13:44:24 INFO: Replaying file id: 0 at offset: 3336
badger 2025/05/20 13:44:24 INFO: Replay took: 3.96μs
2025/05/20 13:44:24 Building new tls configuration using step-ca x509 Signer Interface
2025/05/20 13:44:24 Starting Smallstep CA/0.28.3 (linux/amd64)
2025/05/20 13:44:24 Documentation: https://u.step.sm/docs/ca
2025/05/20 13:44:24 Community Discord: https://u.step.sm/discord
2025/05/20 13:44:24 Config file: /home/step/config/ca.json
2025/05/20 13:44:24 The primary server URL is https://ca.example.com:9000
2025/05/20 13:44:24 Root certificates are available at https://ca.example.com:9000/roots.pem
2025/05/20 13:44:24 X.509 Root Fingerprint: 0775da290116e80b8d1d4f975489e527c7ffa3661e00a911c577524c9528c285
2025/05/20 13:44:24 Serving HTTPS on :9000 ...

? がでていますが、TeraTerm使ってSSHしているので文字化けしているだけです…

以下2行はメモっておきましょう。(私はすぐに潰すので password を見せています)

Your CA administrative username is: step
Your CA administrative password is: t8MnYqBolbhoqRTtkXxiE9a5KHV6euQqvH3sNLJW

ここまで出来たら一旦 Ctrl+C でコンテナを止めます。

次に ADCS のルート証明書を持ってきて配置します。
Windowsサーバー or Windowsクライアントからエクスポートできると思います。しらんけど。 (形式は Base 64 encoded X.509 (.CER) を選びました)

cp root_ca.cer ./step/certs/root_ca.csr
chown 1000:1000 ./step/certs/root_ca.csr

Windows からエクスポートしたときは cer 形式でしたが、上書きしたいのでコピー先の拡張子は .csr になっていることに注意です。

旧ルート証明書の鍵はもういらないので消します。しらんけど。

rm -f ./step/secrets/root_ca_key

ADCSをルート認証局とした中間認証局として step-ca を動かすには CSR(Certificate Signing Request) を発行して、ADCSに中間証明書を発行してもらう必要があります。CSRの発行は次の手順で行います。

podman run -it -v ./step:/home/step \
    -p 9000:9000 \
    -e "DOCKER_STEPCA_INIT_NAME=Smallstep" \
    -e "DOCKER_STEPCA_INIT_DNS_NAMES=ca.example.com" \
    -e "DOCKER_STEPCA_INIT_ACME=true" \
    -e "DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT=true" \
    smallstep/step-ca step certificate create "Your CA Name" intermediate.csr secrets/intermediate_ca_key --csr

以下のようにパスワード何にするか聞いてくるので openssl コマンドとかで適当に生成した文字列を貼っておけばいいと思われる。しらんけど

Please enter the password to encrypt the private key: ?
? Would you like to overwrite secrets/intermediate_ca_key [y/n]: y
Your certificate signing request has been saved in intermediate.csr.
Your private key has been saved in secrets/intermediate_ca_key.

秘密鍵は上書きしていいので y を入力して Enter で次へ進む。

参考用

openssl rand -hex 32
98b4732bc8254d8b760510f29982beb411a0827364a5caff8c24d07004242cc0

intermediate_ca_key を上書きしたので、鍵のパスワードファイルも中身を更新する。

vim ./step/secrets/password
chown 1000:1000 ./step/secrets/password

いよいよ ADCS で中間証明書を発行したいので CSR をどうにかして取り出す。
中身をコピーして Windows のメモ帳で貼り付けとかもOK。

cat ./step/intermediate.csr

Windows Server のどこかに intermediate.csr を配置する。
配置したらコマンドプロンプトで配置した場所まで移動して以下を実行する。(管理者として実行しないとダメかも?)

certreq -submit -attrib "CertificateTemplate:SubCA" intermediate.csr intermediate.crt

生成された intermediate.crt をどうにかして Linux マシンへ持っていく。
持ってきたら上書きする。

cp intermediate.crt ./step/certs/intermediate_ca.crt
chown 1000:1000 ./step/certs/intermediate_ca.crt

満を持して下記コマンドを実行する。

podman run -it -v ./step:/home/step \
    -p 9000:9000 \
    -e "DOCKER_STEPCA_INIT_NAME=Smallstep" \
    -e "DOCKER_STEPCA_INIT_DNS_NAMES=ca.example.com" \
    -e "DOCKER_STEPCA_INIT_ACME=true" \
    -e "DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT=true" \
    smallstep/step-ca

以下のようになったら、ルート証明書がインストールされているマシンでブラウザを開くか curl を叩く。 (https://ca.example.com:9000 を自分の環境に置き換える)

badger 2025/05/20 14:36:48 INFO: All 1 tables opened in 0s
badger 2025/05/20 14:36:48 INFO: Replaying file id: 0 at offset: 5113
badger 2025/05/20 14:36:48 INFO: Replay took: 32.98μs
2025/05/20 14:36:48 Building new tls configuration using step-ca x509 Signer Interface
2025/05/20 14:36:48 Starting Smallstep CA/0.28.3 (linux/amd64)
2025/05/20 14:36:48 Documentation: https://u.step.sm/docs/ca
2025/05/20 14:36:48 Community Discord: https://u.step.sm/discord
2025/05/20 14:36:48 Config file: /home/step/config/ca.json
2025/05/20 14:36:48 The primary server URL is https://ca.example.com:9000
2025/05/20 14:36:48 Root certificates are available at https://ca.example.com:9000/roots.pem
2025/05/20 14:36:48 X.509 Root Fingerprint: 8f119483fc5b5c09fef7bb88397bfa49c4dce471be8d2af223b7c9a172dc51a7
2025/05/20 14:36:48 Serving HTTPS on :9000 ...

404 Not Found が表示されたら成功。証明書エラーが出た場合はどこかで失敗しています。

とりあえず、検証はここまでとしました。

ACME もやりたいですが、睡眠時間がなくなりそうなのでまたの機会に… podman の quadlet による systemd 管理とかもやってないな…




Archives

2025 (1)
2022 (6)
2021 (3)
2020 (4)

Writer

筆者のイメージ画像
kusshie

情報系学部に所属していた社会人4年生です。大学ではネットワークを学んでいましたが何もわかりません。 一応 doornoc という団体でAS運用に参画しています。しらんけど (AS63791)。