paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

easy-rsaで簡単に自宅CA構築+自己証明書発行

家の環境でWebサーバを作ってもhttpのまま使ってしまうんですが、これではイカンということでセキュリティの勉強も兼ねつつ自宅CAを作りたいと思います。

Let's Encryptでもいいかなと思ったのですが、家にサーバがある方が好き勝手できるので自宅CAを選択しました。

オレオレCA、証明書は昔に作ったことがあるんですが、opensslのコマンドを忘れてしまったのでまた調べなきゃと思っていたら簡単にできるパッケージを発見しました。

www.digitalocean.com

easy-rsaというパッケージですが、名前の通り簡単に証明書発行や管理ができるようです。
中身はopensslコマンドをいい感じに発行してくれるっぽいです。

今回は証明書が目的なのでアルゴリズム等は特にチューニング無しにします。

その前に環境のルール作り

CAサーバ作成に絡めて家のラボルールを決めます。

自宅ドメイン
  • szkmhome.lab

直IP運用でも問題ないのですが、Common name用にドメインを決めます。
ドメインを決めたからにはDNSサーバも作らないとですね。
ドメインは名前をもじりましたw

証明書期限ルール

作って終わりだと面白くないので、ある程度の期間で触るよう期限を切ります。

では構築していきましょう。


自宅CAサーバ作成

サーバ作っていきます。

インスタンス作成

家ではLXD環境を運用しているのでここにインスタンス作ります。

masashi@PC-ubuntu:~$ lxc version && lxc launch ubuntu: HomeCA
Client version: 4.15
Server version: 4.15
Creating HomeCA
Starting HomeCA
masashi@PC-ubuntu:~$ lxc exec HomeCA -- /bin/bash
root@HomeCA:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:    20.04
Codename:   focal
パッケージインストール

aptで入れるだけ。
チュートリアルでは一般ユーザですが、コンテナなのでrootのまま進めます。

root@HomeCA:~# apt update
root@HomeCA:~# apt install easy-rsa

簡単です。

初期設定

チュートリアルに沿ってセッティングします。

コマンド類のシンボックリンク。

root@HomeCA:~# ln -s /usr/share/easy-rsa/* easy-rsa/ 
root@HomeCA:~# ls -l easy-rsa/
total 2
lrwxrwxrwx 1 root root 27 Jun 26 08:12 easyrsa -> /usr/share/easy-rsa/easyrsa
lrwxrwxrwx 1 root root 39 Jun 26 08:12 openssl-easyrsa.cnf -> /usr/share/easy-rsa/openssl-easyrsa.cnf
lrwxrwxrwx 1 root root 32 Jun 26 08:12 vars.example -> /usr/share/easy-rsa/vars.example
lrwxrwxrwx 1 root root 30 Jun 26 08:12 x509-types -> /usr/share/easy-rsa/x509-types

varsファイルを少しいじります。
コマンド用の変数ファイルっぽいですね。
個人的な部分はマスクしてます。

root@HomeCA:~/easy-rsa# cat vars
set_var EASYRSA_REQ_COUNTRY "JP"
set_var EASYRSA_REQ_PROVINCE    "XXXXX"
set_var EASYRSA_REQ_CITY    "XXXXX"
set_var EASYRSA_REQ_ORG     "Home labo CA"
set_var EASYRSA_REQ_EMAIL   "XXXXX"
set_var EASYRSA_REQ_OU      "Home labo"
set_var EASYRSA_CA_EXPIRE   3650
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_DIGEST      "sha512"

CA証明書作成

ここからはeasyrsaコマンドベースです。

初期化。

root@HomeCA:~/easy-rsa# ./easyrsa init-pki

Note: using Easy-RSA configuration from: ./vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /root/easy-rsa/pki

CA作成。

root@HomeCA:~/easy-rsa# ./easyrsa build-ca nopass

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1f  31 Mar 2020
Generating RSA private key, 2048 bit long modulus (2 primes)
.............................................................+++++
.........................................................................................................................................................+++++
e is 65537 (0x010001)
Can't load /root/easy-rsa/pki/.rnd into RNG
139813523703104:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/root/easy-rsa/pki/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:HomeCA.szkmhome.lab

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/root/easy-rsa/pki/ca.crt

これでCA証明書が作成されました。

CSR作成

CSRは証明書の申請者が作りますが、今回は同じコンテナ内で作ってしまいます。
ちなみに今回作成するのは同じくLXDで運用中のFirefly III用です。

秘密鍵
root@HomeCA:~/easy-rsa/csr# openssl genrsa -out server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
.....................................+++++
...+++++
e is 65537 (0x010001)
CSR作成

subjectも一気に入れちゃいます。

root@HomeCA:~/easy-rsa/csr# openssl req -new -key server.key -out server.req -subj \
> /C=JP/ST=XXXXX/L=XXXXX/O=Home\ labo/CN=firefly.szkmhome.lab

root@HomeCA:~/easy-rsa/csr# ls
server.key  server.req

OK!

CAの署名

easy-rsaではCSRを一度専用ディレクトリに格納してから署名という流れのようです。

CSRインポート

CSRをインポートします。
最後のfireflyはたぶん次のコマンド用のCSRエイリアスですね。
これが無いとエラーになります。

root@HomeCA:~/easy-rsa# ./easyrsa import-req csr/server.req firefly

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1f  31 Mar 2020

The request has been successfully imported with a short name of: firefly
You may now use this name to perform signing operations on this request.
署名

インポートしたCSRを署名します。

証明書タイプをserverにします。
ここを変更すればclient証明書とかも作れるみたいです。

root@HomeCA:~/easy-rsa# ./easyrsa sign-req server firefly

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1f  31 Mar 2020


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 365 days:

subject=
    countryName               = JP
    stateOrProvinceName       = XXXXX
    localityName              = XXXXX
    organizationName          = Home labo
    commonName                = firefly.szkmhome.lab


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /root/easy-rsa/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :ASN.1 12:'XXXXX'
localityName          :ASN.1 12:'XXXXX'
organizationName      :ASN.1 12:'Home labo'
commonName            :ASN.1 12:'firefly.szkmhome.lab'
Certificate is to be certified until Jun 26 08:28:08 2022 GMT (365 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /root/easy-rsa/pki/issued/firefly.crt

完成!

中身を見てみましょう。

root@HomeCA:~/easy-rsa# openssl x509 -in pki/issued/firefly.crt -text | head -15
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            9f:e6:f3:e8:43:72:f4:92:a2:99:ec:90:a4:c1:14:eb
        Signature Algorithm: sha512WithRSAEncryption
        Issuer: CN = HomeCA.szkmhome.lab
        Validity
            Not Before: Jun 26 08:28:08 2021 GMT
            Not After : Jun 26 08:28:08 2022 GMT
        Subject: C = JP, ST = XXXXX, L = XXXXX, O = Home labo, CN = firefly.szkmhome.lab
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:

OKですね。
お手軽に証明書が作成できました!

まとめ

opensslはオプションが豊富にあって最初は非常にとっつきづらかったのですが、オレオレ証明書周りに必要なコマンドはなんとか触って覚えました。

しかし今回のeasy-rsaはコマンドがシンプルに整理されていてすぐに覚えることができました。
セキュリティのチューニングをするにはこのパッケージもopensslも、もっと勉強しないといけませんが、とりあえずお手軽にオレオレ証明書を作成することができました。

次回Webサーバに入れてみようと思います。