前回無事に(?)tls1.3フローの確認が終わったところで環境構築を振り返ります。
環境
今回はコンテナ(LXD)で2サーバ立てるつもりだったのでvagrantでubuntuをインストール。
LXDといえばcanonicalなのでトラブルが少ない様ubuntuにしてます。
Dockerにしなかったのは証明書を作る用事もあったので、コンテナ中でいろいろ弄れるように避けました。
また、Dockerのデータ永続化の概念がどうもしっくりこず今だに苦手です。
というかLXDはRHEL系でも使えるんですかね?
今はDockerの方が多いか。
コンテナは一応業務で使うことの多いRHELということでCentOSにしました。
構成は前回も載せましたが下記です。
tls1.2サーバに認証局も持たせませす。
Centos7コンテナ作成
特に変わったことはせずlxdはinit済みです。
まずはtls1.2用のコンテナを立てます。
vagrant@ubuntu-bionic:~$ sudo lxc launch images:centos/7/amd64 tls1-2
vagrant@ubuntu-bionic:~$ sudo lxc exec tls1-2 -- /bin/bash [root@tls1-2 ~]#
証明書作成
まずは証明書を作ってしまいます。
opensslインストール
yum install openssl
バージョン
OpenSSL 1.0.2k-fips 26 Jan 2017
証明書作成の難しさ
まだLinux触りたての頃の話ですが、検証等で自己証明書を作るのが難しくて進捗がよくありませんでした。
なぜ難しいか
オプションが豊富!
コマンドだけでやろうとすると引数がめちゃめちゃ多くて有効期限の指定、鍵作成、証明書作成…など
ググっても理解できないことがたくさんありました。
でも数はこなしてみるもんで、基本はopenssl.cnfに書いとけばよかったんですね。
署名書発行のフローも実はシンプルで
- 自己CAの作成
- 自己証明書要求、秘密鍵作成
- CAの署名
これだけ。
しかもopensslにはスクリプトも用意されていたんですね。
今までせっせとコマンド打ってたよ。
/etc/pki/tls/misc/CA というスクリプトをたたけば楽ちんです。
CAスクリプトで証明書作成
Containerなので壊れたら作り直せばいいやで直のディレクトリで作業しちゃいます。
/etc/pki/tlsディレクトリで作業してます。
CA作成
[root@tls1-2 misc]# ./CA -newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 2048 bit RSA private key ....................+++ .......................+++ writing new private key to '/etc/pki/CA/private/./cakey.pem'
この後CA局のSubjectを記入して完了。
詳細は隠します。
Subject: countryName = JP stateOrProvinceName = XXXX organizationName = XXXX organizationalUnitName = labo commonName = masashi.lab
openssl.cnfのDAYSのところいじって期限は3年弱ですね。
Certificate is to be certified until Feb 22 09:36:32 2023 GMT (1095 days)
CSR作成
続いてCSRを作ります。
[root@tls1-2 tls]# misc/CA -newreq Generating a 2048 bit RSA private key .........................+++ .....................+++ writing new private key to 'newkey.pem'
鍵のパスフレーズの後、証明書用のSubjectを打ち込みます。(詳細は署名のとこで)
署名
署名して完了です。
[root@tls1-2 tls]# misc/CA -sign Using configuration from /etc/pki/tls/openssl.cnf Enter pass phrase for /etc/pki/CA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 96:14:48:f6:c7:d3:48:c7 …
サーバ証明書のSubjectはこんな感じ。
Subject: countryName = JP stateOrProvinceName = XXXX localityName = XXXX organizationName = XXXX organizationalUnitName = labo commonName = tls1-2.vagrant.lab
サーバ証明書の項目はいじくらなかったので期限が1年になってしまいました。
まあ検証用だしいいか。
あとは署名の確認をして完了です。
Certificate is to be certified until Feb 22 09:49:06 2021 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
これだけ。
今回は検証用なのでsubject以外は全てデフォルト値です。
(CA証明書の期限は変えましたが)
signまで完了するとnewcert.pemとnewkey.pemが作成されるのでリネームします。
期限含め引数で指定できそうだけど今回はメインの目的ではないのでやってません。
[root@tls1-2 tls]# mv newcert.pem tls12.cert [root@tls1-2 tls]# mv newkey.pem tls12.key
これを/rootに移動してnginxに読ませます。
本当はもう少し適切なディレクトリに置きたいところです。
あとはサーバに読ませるときにパスワード聞かれないように抜いておきます。
この手間がありますが、コマンドをセコセコ調べずに発行できるので簡単ですね。
[root@tls1-2 ~]# openssl rsa -in tls12.key -out tls12.key Enter pass phrase for tls12.key: writing RSA key
というわけでopensslで自己認証局と証明書の発行ができました。
デフォルトの状態の各アルゴリズムにも触れたいところですが今回はここまでにします。