Private認証局 (easy-rsa利用) - ぶやかー

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

この記事を書いた人 Wrote this article

kmatsunuma

TOP