Private CAは検証にも便利
検証でよく使うのでPrivate認証局を作っておくと
何かと便利
手動でも作れるけど検証用ならeasy-rsaで十分
https://github.com/OpenVPN/easy-rsa
- 積み残し
- SAN(Subject Alternative Name)
- ワイルドカード証明書
- build時のCA局証明書の期限を指定するファイルとパラメータ
- 登録済みのサーバの削除やリクエスト内容の修正方法
- gen-reqでのドメイン名の補完
- gen-req時のquietモード
easy-rsa3のインストール
- OS
- Ubuntu 20.04
aptでも入れられるけど、設定とか微妙に違ってたりするのでgitからcloneする
手順のほうが汎用性が高い。ちなみに検証用前提なので、インストールディレクトリー
は自分のhome配下にuser permissionで構築する手順。
opensslは必須なので入れておく
sudo apt -y install openssl
cd ~
git clone https://github.com/OpenVPN/easy-rsa.git
cd easy-rsa/easyrsa3
./easyrsa init-pki
KNOWN_ISSUESの確認
Majorは問題などをちゃんと書いておいてくれるし、ISSUEの参照先も
書いてある。うれしすぎ。
某セキュリティーベンターF**tinetとは意識が違いすぎる。
cat ../KNOWN_ISSUES
環境変数の設定(./pki/varsファイル)
easy_rsa3はデフォルトのDNモードがcn_onlyになってるのでCNしか設定できない。
これはこれでかなり不便というか検証では使いづらいので、DNモードをorgにしておく
暗号アルゴリズムはECDSAにしておく。古い環境などRSA必要なら適宜修正。
cat <<'EOF'>> ./pki/vars
## MyEnv
set_var EASYRSA_DN "org"
set_var EASYRSA_REQ_COUNTRY "JP"
set_var EASYRSA_REQ_PROVINCE "Tokyo"
set_var EASYRSA_REQ_CITY "Asakusa"
set_var EASYRSA_REQ_ORG "AsakusaLab"
set_var EASYRSA_REQ_EMAIL "lab@example.net"
set_var EASYRSA_REQ_OU "Lab"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
set_var EASYRSA_CA_EXPIRE 36525
set_var EASYRSA_CERT_EXPIRE 825
暗号アルゴリズムをRSAにする場合
set_var EASYRSA_ALGO "rsa"
set_var EASYRSA_KEY_SIZE 4096
PrivateCAのビルド
PrivateCAをビルドすれば、サーバ証明書やクライアント証明書を発行できるようになる
コマンドの最後にnopass
をつけておけばパスワードなしで証明書が作成される。
PrivateCAのビルド
./easyrsa build-ca nopass
CA証明書の確認
openssl x509 -text -noout -in pki/ca.crt
サーバ証明書発行
./easyrsa --subject-alt-name="DNS:privateca-cert.asakusa.beer" build-server-full privateca-cert.asakusa.beer nopass
バッチの場合は--batch
オプションが使える
./easyrsa --batch --subject-alt-name="DNS:privateca-cert.asakusa.beer" build-server-full privateca-cert.asakusa.beer nopass
SNI使う場合は--subject-alt-name
オプションを利用すればOk、複数の場合は,
カンマ区切り。
オプション例
--subject-alt-name="DNS:'*'.example.net,DNS:secure.example.net,IP:192.0.2.1"
確認
openssl x509 -text -noout -in pki/issued/privateca.crt
クライアント証明書発行
サーバ証明書とほぼ同じ
./easyrsa build-client-full user1 nopass
証明書期限更新
再発行すればOK
./easyrsa sign-req server privateca-cert.asakusa.beer
証明書失効
revokeでサーバ名指定すれば失効する。
./easyrsa revoke privateca-cert.asakusa.beer
失効リスト配布設定
CRLやOCSPが必要な場合は、CA証明書に含ませるかサーバ証明書にそれぞれ書き込むかになる。
設定箇所が違うので環境に合わせて設定すればよい。
CA証明書への登録
openssl-easyrsa.cnfの[ easyrsa_ca ]セクションに以下を追記
ちなみにeasyrsa使ってない場合は[ v3_ca ]
authorityInfoAccess = caIssuers;URI:http://ca.asakusa.beer/ca.crt,OCSP;URI:http://ocsp.asakusa.beer
crlDistributionPoints = URI:http://ca.asakusa.beer/crl.pem
サーバ証明書への登録
サーバ証明書に登録する場合はx509-types/COMMONに追記する。
cat <<'EOF'>> x509-types/COMMON
authorityInfoAccess = caIssuers;URI:http://ca.asakusa.beer/ca.crt,OCSP;URI:http://ocsp.asakusa.beer
crlDistributionPoints = URI:http://ca.asakusa.beer/crl.pem
EOF
CRLファイル作成
CRLファイルpki/crl.pem
が作成される。
./easyrsa gen-crl
CRLリスト配布
nginxでいいと思う
sudo apt install -y nginx
sudo mkdir -p /var/www/ca
sudo ln -s $PWD/easy-rsa/easyrsa3/pki/crl.pem /var/www/ca/.
sudo chown -R www-data. /var/www/ca
sudo rm /etc/nginx/sites-enabled/default
cat <<'EOF' | sudo tee /etc/nginx/sites-available/crl
server {
listen 80 default;
server_name _;
disable_symlinks off;
root /var/www/ca;
}
EOF
sudo ln -s /etc/nginx/sites-available/crl/etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
OCSPレスポンダ
検証であれば簡易的にopensslのocsp responderが使える。
cat <<'EOF'> ocspresponder.sh
#!/usr/bin/bash
openssl ocsp -ignore_err -index pki/index.txt -CA pki/ca.crt \
-rsigner pki/issued/ocsp.crt -rkey pki/private/ocsp.key -port 8888
EOF
chmod 755 ocspresponder.sh
起動
nohup ocspresponder.sh &
これをngnixでリバプロ
cat <<'EOF' | sudo tee -a /etc/nginx/sites-available/crl
## OCSP Server
server {
listen 80;
server_name ocsp.asakusa.beer;
location / {
proxy_pass http://127.0.0.1:8888;
}
}
EOF
sudo systemctl restart nginx
CSR作成
build-fullでの一括作成じゃなくて、リクエスト作っておいて後から証明書発行というパターンも可能
それぞれ以下に作成される。
* 鍵(key): pki/private
* 証明書要求(csr): pki/reqs/
./easyrsa --subject-alt-name="DNS:privateca.asakusa.beer" gen-req privateca nopass
確認
openssl req -text -noout -in pki/reqs/privateca.req
openssl ec -text -noout -in pki/private/privateca.key
記事がありません
-
Paloalto CLI