やりたいこと
- 自宅用WEBサービスをアクセス制限(クライアント証明書による認証)したい。
- 今更ですが・・・
やりたいこと(詳細)
- オレオレ認証局から、WEBサーバ証明書/クライアント証明書を発行します。
- 証明書の発行は、Ansibleを使用します(コマンドを叩きたくない)
制限事項
- apacheの設定は当記事対象外とします。
- 失効処理とCRL発行処理は手動(easy-rsaコマンド)とします。
環境/ツール
- CentOS8環境(yumコマンド使ってます)
- OPENVPN関連のツールのひとつである、easy-rsaを使用します。
- 選定の理由は、CAキーペア生成が簡単にできるため。
- https://github.com/OpenVPN/easy-rsa/blob/master/README.md
手順
手順1.easy-rsaのインストール
- EPELにeasy-rsaがあるので、YUMインストール
# yum install epel-release
# yum install easy-rsa
- 認証局用専用ユーザの作成(certadmin)
# useradd certadmin
- easy-rsa用フォルダの作成、必要ファイルのリンク作成
# su - certadmin
$ mkdir easy-rsa
$ chmod 700 easy-rsa
$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
手順2.easy-rsaでオレオレ認証局構築
- 認証局の初期化(情報を格納するdirectory(pki/)を作成(初期化)します。
$ cd easy-rsa
$ ./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/certadmin/easy-rsa/pki
- 認証局のを作成(パスワードなし、CN=MyHomeCA)します。
$ ./easyrsa build-ca nopass
Using SSL: openssl OpenSSL 1.1.1c FIPS 28 May 2019
Generating RSA private key, 2048 bit long modulus (2 primes)
....................+++++
.................+++++
e is 65537 (0x010001)
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]:MyHomeCA
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/certadmin/easy-rsa/pki/ca.crt
$
- 空のCRLのファイルを生成(Apacheでクライアント認証時、CRL証明書情報が必要であるため作成)
$ ./easyrsa gen-crl
Using SSL: openssl OpenSSL 1.1.1c FIPS 28 May 2019
Using configuration from /home/certadmin/easy-rsa/pki/easy-rsa-27657.yrhss7/tmp.dB4v6v
An updated CRL has been created.
CRL file: /home/certadmin/easy-rsa/pki/crl.pem
$
手順3.認証局の証明書内容確認
$ ls -l pki/ca.crt ....CA公開鍵
-rw------- 1 certadmin certadmin 1192 5月 21 17:43 pki/ca.crt
$ ls -l pki/private/ca.key ....CA秘密鍵
-rw------- 1 certadmin certadmin 1679 5月 21 17:43 pki/private/ca.key
$ ls -l pki/crl.pem ....CRL情報
-rw------- 1 certadmin certadmin 642 5月 21 17:47 pki/crl.pem
$ openssl x509 -in pki/ca.crt -noout -subject -issuer -dates
subject=CN = MyHomeCA ....CA公開鍵の情報確認(CNと期間は10年間で生成されていることを確認)
issuer=CN = MyHomeCA
notBefore=May 21 08:43:42 2020 GMT
notAfter=May 19 08:43:42 2030 GMT
[certadmin@myhome easy-rsa]$
手順4.githubからAnsible-playbook取得
git clone https://github.com/mishikawan/generatecert-ansible.git
手順4-1.サーバ証明書の発行内容を変更
- 発行したいサーバ証明書情報を記載
- 以下のようなサーバ証明書を作成したい場合は、server-certs.csvに以下を記述します
- CSVの一行目はカラム情報のため変更はしないでください。
name | country | state | locality | organization | organizational_unit |
---|---|---|---|---|---|
myhome.local | JP | Osaka | Osaka | MyHome | MyHome |
server-certs.csv
name,country,state,locality,organization,organizational_unit
myhome.local,JP,Osaka,Osaka,MyHome,MyHome
手順4-2.クライアント証明書の発行内容を変更
- 発行したいクライアント証明書情報を記載
- 以下のようなクライアント証明書を作成したい場合は、client-certs.csvに以下を記述します
- CSVの一行目はカラム情報のため変更はしないでください。
name | メール | パスワード | organizational_unit |
---|---|---|---|
user001 | user001@myhome.local | pass001 | Development |
user002 | user002@myhome.local | pass002 | Production |
user003 | user003@myhome.local | pass003 | Sales |
client-certs.csv
name,mailaddr,pass,organizational_unit
user001,user001@myhome.local,pass001,Development
user002,user002@myhome.local,pass002,Production
user003,user003@myhome.local,pass003,Sales
手順5.証明書の発行(ansible)の実行
ansible-playbook generate_certs.yml
手順6.証明書発効の確認
- ansible(generate_certs.yml)のvarsに従いファイルが作成されます。
generate_certs.yml
vars:
ca_private: "~/easy-rsa/pki/private/ca.key"
ca_public: "~/easy-rsa/pki/ca.crt"
publicdir: "~/easy-rsa/pki/issued"
csrdir: "~/easy-rsa/pki/reqs"
privatedir: "~/easy-rsa/pki/private"
pkcs12dir: "~/easy-rsa/pki/private"
server_csv: "server-certs.csv"
client_csv: "client-certs.csv"
- CSRファイル
$ ls -l ~/easy-rsa/pki/reqs/
-rw-rw-r-- 1 certadmin certadmin 1119 6月 26 22:31 myhome.local.csr
-rw-rw-r-- 1 certadmin certadmin 1013 6月 26 22:32 user001.csr
-rw-rw-r-- 1 certadmin certadmin 1013 6月 26 22:32 user002.csr
-rw-rw-r-- 1 certadmin certadmin 1005 6月 26 22:32 user003.csr
- 秘密鍵とPKCS12ファイル
$ ls -l ~/easy-rsa/pki/private/
-rw------- 1 certadmin certadmin 1675 5月 21 09:52 ca.key
-rw------- 1 certadmin certadmin 1679 6月 26 22:31 myhome.local.key
-rw------- 1 certadmin certadmin 1679 6月 26 22:32 user001.key
-r-------- 1 certadmin certadmin 3376 6月 26 22:32 user001.p12
-rw------- 1 certadmin certadmin 1675 6月 26 22:32 user002.key
-r-------- 1 certadmin certadmin 3376 6月 26 22:32 user002.p12
-rw------- 1 certadmin certadmin 1675 6月 26 22:32 user003.key
-r-------- 1 certadmin certadmin 3376 6月 26 22:35 user003.p12
- 公開鍵ファイル
$ ls -l ~/easy-rsa/pki/issued/
-rw-rw-r-- 1 certadmin certadmin 1298 6月 26 22:31 myhome.local.crt
-rw-rw-r-- 1 certadmin certadmin 1188 6月 26 22:32 user001.crt
-rw-rw-r-- 1 certadmin certadmin 1188 6月 26 22:32 user002.crt
-rw-rw-r-- 1 certadmin certadmin 1180 6月 26 22:35 user003.crt