OpenSSL を使用して OpenBSD 上でオフライン・エアギャップ型認証局 (CA) を運用するための シェルスクリプトです。失効状態は別の OpenBSD OCSP サーバーを通じて公開されます。 更新は USB ドライブを介してオフライン CA マシンと OCSP サーバーマシン間で転送されます。
🌐 Language / Sprache / Langue / Idioma / Língua / Lingua / 語言 / 언어 / भाषा / Язык / لغة / Lugha / 言語 / Lang / Wika / ʻŌlelo / Gagana / Reo / Taal / Harshe / ቋንቋ / Èdè / ভাষা / 语言 / Keel / Kieli / Språk / Мова / ภาษา / Bahasa / Wika / Bahasa / Basa / Γλώσσα / Lingua / שפה / Teanga
| 🇺🇸 English | 🇩🇪 Deutsch | 🇪🇸 Español | 🇫🇷 Français | 🇵🇹 Português |
| 🇮🇹 Italiano | 🇭🇰 繁體中文 | 🇰🇷 한국어 | 🇮🇳 हिन्दी | 🇷🇺 Русский |
| 🇸🇦 العربية | 🌍 Kiswahili | 🇯🇵 日本語 | 🇭🇹 Kreyòl ayisyen | 🌺 ʻŌlelo Hawaiʻi |
| 🌊 Gagana Sāmoa | 🌿 Te Reo Māori | 🇿🇦 Afrikaans | 🇳🇱 Nederlands | 🌍 Hausa |
| 🇪🇹 አማርኛ | 🌍 Yorùbá | 🇧🇩 বাংলা | 🇨🇳 简体中文 | 🇪🇪 Eesti |
| 🇫🇮 Suomi | 🇸🇪 Svenska | 🇳🇴 Norsk | 🇺🇦 Українська | 🇹🇭 ภาษาไทย |
| 🇮🇩 Bahasa Indonesia | 🇵🇭 Filipino | 🇲🇾 Bahasa Melayu | 🌏 Basa Jawa | 🇬🇷 Ελληνικά |
| 📜 Latina | 🇮🇱 עברית | 🇮🇪 Gaeilge |
┌─────────────────────────────┐ USB ドライブ ┌──────────────────────────┐
│ オフライン CA マシン │ ───────────────────► │ OCSP サーバーマシン │
│ (OpenBSD、エアギャップ) │ export-to-usb.sh │ (OpenBSD、ネットワーク) │
│ │ ◄─────────────────── │ │
│ /root/ca/ │ 物理的な移動 │ /etc/ocsp/ │
│ openssl.cnf │ │ index.txt │
│ certs/ca.cert.pem │ │ *.crl.pem │
│ intermediate-*/ │ │ *-responder.crt │
│ index.txt │ │ OcspServer (ASP.NET) │
│ crl/ │ │ rcctl enable ocspserver │
│ certs/ │ │ │
│ ocsp/ │ │ │
└─────────────────────────────┘ └──────────────────────────┘
両方のマシンで OpenBSD が動作している必要があります。OpenSSL がまだインストールされていない 場合はインストールしてください:
pkg_add opensslOCSP サーバーマシンには、ocspserver という名前の rc.d サービスとしてインストール・登録された
OpenBSDOCSPServer も必要です。
すべてのスクリプトは #!/bin/sh(OpenBSD の ksh ベースの /bin/sh)、標準 OpenBSD
ユーティリティ(mount_msdos、sha256、rcctl、doas)、および openssl(1) を使用します。
すべてのスクリプトを doas 経由で root として実行してください。
scripts/
setup-ca.sh ルート CA ディレクトリを初期化してルートキー/証明書を生成する
create-intermediate-ca.sh ルート CA によって署名された中間 CA を作成する
create-server-cert.sh TLS サーバー証明書を発行する (mTLS)
create-client-cert.sh クライアント証明書を発行する (mTLS)
revoke-cert.sh 証明書を失効させ CRL を再生成する
export-to-usb.sh エアギャップ転送のために CA データを USB にパッケージする (CA 側)
import-from-usb.sh USB から OCSP サーバーにインポートする (OCSP サーバー側)
config/
openssl-root.cnf.template ルート CA OpenSSL 設定テンプレート
openssl-intermediate.cnf.template 中間 CA OpenSSL 設定テンプレート
以下の手順を実行する前に、デプロイ値を準備してください。
-
CA はどこに配置しますか?
default:/root/ca
実際: -
組織名と所在地はどこですか?
default:My Organization
実際: -
プロジェクト名は何ですか?
default:MY PROJECT
実際: -
プロジェクトのバージョン日付はいつですか?
default:01012027
実際: -
TLD は何ですか?
default:example.com
実際: -
サブドメインは何ですか?
default:app.
実際: -
クライアントユーザーのメールアドレスは何ですか?
default:user@example.com
実際: -
転送用 USB メモリはどこにありますか?
default:/dev/sd1i
実際:
doas sh scripts/setup-ca.sh /root/ca \
"/C=US/ST=MyState/L=MyCity/O=My Organization/CN=My Organization Root CA"/root/ca/ を作成し、AES-256 暗号化された 4096 ビットのルートキー、有効期限 20 年の
自己署名証明書、およびルート CA 用の OCSP 署名証明書を生成します。
doas sh scripts/create-intermediate-ca.sh MY-PROJECT 01012027 /root/ca \
"/C=US/ST=MyState/L=MyCity/O=My Organization/CN=My Organization Intermediate CA MY-PROJECT 01012027"ファイルは /root/ca/intermediate-MY-PROJECT-01012027/ 以下に作成されます。
doas sh scripts/create-server-cert.sh MY-PROJECT 01012027 \
app.example.com \
"DNS:app.example.com,DNS:www.example.com" \
/root/ca中間 CA ディレクトリへの出力:
private/app.example.com.01012027.key.pem— 暗号化された秘密鍵certs/app.example.com.01012027.cert.pem— 署名済み証明書certs/app.example.com.01012027.server.full.pfx— PKCS#12 バンドル
doas sh scripts/create-client-cert.sh MY-PROJECT 01012027 \
user@example.com /root/ca各ユーザーに対して繰り返します。各 .full.pfx バンドルを安全なチャンネルで
該当ユーザーに転送してください。
doas sh scripts/revoke-cert.sh MY-PROJECT 01012027 \
certs/client-user@example.com.01012027.cert.pem \
keyCompromise /root/ca何も失効させずに CRL を更新する(例:定期的に):
doas sh scripts/revoke-cert.sh MY-PROJECT 01012027 --crl-only /root/caFAT32 フォーマットの USB ドライブを挿入し、デバイスを確認します:
dmesg | tail -20 # "sd1 at ..." 行を探す
disklabel sd1 # FAT32 パーティションを特定する(通常は 'i')次にエクスポートします:
doas sh scripts/export-to-usb.sh MY-PROJECT 01012027 /root/ca /dev/sd1iスクリプトは SHA256 チェックサムマニフェストを書き込み、ドライブを安全に
アンマウントします。USB ドライブを物理的に OCSP サーバーマシンに持ち運びます。
dmesg | tail -20 # USB デバイス名を確認する
disklabel sd1
doas sh scripts/import-from-usb.sh /dev/sd1i /etc/ocsp ocspserverスクリプトはチェックサムを検証し、更新されたファイルを /etc/ocsp/ にコピーし、
rcctl 経由で ocspserver デーモンをリロードします。appsettings.json で
EnableIndexTxtWatch が true の場合、OCSP サーバーはリロードなしに index.txt
の変更も自動的に検出します。
openssl ocsp \
-issuer /etc/ocsp/intermediate-MY-PROJECT-01012027/ca-chain.cert.pem \
-cert /path/to/cert.pem \
-url http://localhost:2560 \
-resp_text| ファイル | パターン |
|---|---|
| 中間 CA キー | intermediate-PROJECT-DATE.key.pem |
| 中間 CA 証明書 | intermediate-PROJECT-DATE.cert.pem |
| 証明書チェーン | ca-chain-PROJECT-DATE.cert.pem |
| サーバー証明書 | SERVER_DOMAIN.DATE.cert.pem |
| サーバー PKCS#12 | SERVER_DOMAIN.DATE.server.full.pfx |
| クライアント証明書 | client-USER_EMAIL.DATE.cert.pem |
| クライアント PKCS#12 | client-USER_EMAIL.DATE.full.pfx |
| CRL | intermediate.crl.pem / intermediate.crl.der |
| OCSP 署名証明書 | INTER_NAME-ocsp.cert.pem |
- オフライン CA マシンは決してネットワークに接続してはいけません。
- ルートおよび中間の秘密鍵は AES-256 で暗号化されています。パスフレーズはハードウェア トークンまたは物理的な金庫に、鍵とは別に保管してください。
- インポート前に必ず USB ドライブのチェックサムを確認してください —
import-from-usb.shは OpenBSD のsha256 -Cを使用して自動的にこれを行います。 - CRL はデフォルトで 30 日後に期限切れになります。定期的な CRL 更新をスケジュールしてください:
doas sh scripts/revoke-cert.sh MY-PROJECT DATE --crl-only # 次に export-to-usb + import-from-usb - OCSP 署名証明書は 375 日後に期限切れになります。同じ引数で
create-intermediate-ca.shを再実行して更新してください;すでに完了したステップはスキップされ、必要な場合にのみ 新しい OCSP 証明書が生成されます。