paloma blog

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

Containerでtls webサーバを作る 自己認証局編

前回無事に(?)tls1.3フローの確認が終わったところで環境構築を振り返ります。

環境

今回はコンテナ(LXD)で2サーバ立てるつもりだったのでvagrantubuntuをインストール。
LXDといえばcanonicalなのでトラブルが少ない様ubuntuにしてます。
Dockerにしなかったのは証明書を作る用事もあったので、コンテナ中でいろいろ弄れるように避けました。
また、Dockerのデータ永続化の概念がどうもしっくりこず今だに苦手です。

というかLXDはRHEL系でも使えるんですかね?
今はDockerの方が多いか。

コンテナは一応業務で使うことの多いRHELということでCentOSにしました。

構成は前回も載せましたが下記です。 f:id:paloma69:20200227233607p:plain

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に書いとけばよかったんですね。

署名書発行のフローも実はシンプルで

  1. 自己CAの作成
  2. 自己証明書要求、秘密鍵作成
  3. 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で自己認証局と証明書の発行ができました。
デフォルトの状態の各アルゴリズムにも触れたいところですが今回はここまでにします。