家の環境でWebサーバを作ってもhttpのまま使ってしまうんですが、これではイカンということでセキュリティの勉強も兼ねつつ自宅CAを作りたいと思います。
Let's Encryptでもいいかなと思ったのですが、家にサーバがある方が好き勝手できるので自宅CAを選択しました。
オレオレCA、証明書は昔に作ったことがあるんですが、opensslのコマンドを忘れてしまったのでまた調べなきゃと思っていたら簡単にできるパッケージを発見しました。
easy-rsaというパッケージですが、名前の通り簡単に証明書発行や管理ができるようです。
中身はopensslコマンドをいい感じに発行してくれるっぽいです。
今回は証明書が目的なのでアルゴリズム等は特にチューニング無しにします。
その前に環境のルール作り
CAサーバ作成に絡めて家のラボルールを決めます。
自宅ドメイン名
- szkmhome.lab
直IP運用でも問題ないのですが、Common name用にドメインを決めます。
ドメインを決めたからにはDNSサーバも作らないとですね。
ドメインは名前をもじりましたw
証明書期限ルール
作って終わりだと面白くないので、ある程度の期間で触るよう期限を切ります。
- 自宅CA: 10年
- サーバ証明書: 1年
では構築していきましょう。
自宅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サーバに入れてみようと思います。