自室サーバはLDAP認証を入れるまではとTLS化を後回しにしてきましたが、ようやくLDAP認証にできたので今度はシステム全体をTLS化していくことにしました。
まずは入り口のCockpitのTLS化を行いますが、もうあっちこっちでやり方が書かれているので自分用の備忘録だけ。
RootCA証明書を作る
OSはFedora42でSELinuxは有効にしています。
ドメインも持っているしLet`s Encryptを使おうか、と一瞬思いましたがインターネットにつながってないと(やらかしてよくサーバ(=ルータ)が落ちる)認証が止まるので、無しの方向で……
というわけでオレオレ認証局でやることにしました。
RootCAの秘密鍵の生成
サーバ証明書等に署名するためのオレオレRootCAの秘密鍵(rootCA.key)を作ります。
4096ビット長RSA鍵にしました。
$ openssl genrsa -out rootCA.key 4096
秘密鍵なのでしっかり管理しましょう。
RootCAの自己署名証明書の作成
PCやブラウザに登録して オレオレCAだけど信頼してやんよ ってするための証明書です。
各クライアントに入れるメンドクサさはありますが、インターネット接続ができなくても使えるのが便利です。
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt
...
入力していく(CommonName以外はあんまり重要じゃない)
証明書なのでコチラを各端末に配布します。
Server証明書を作る
サービスするサーバー側の証明書です。クライアントはこの証明書を見て信頼できると判断したらTLSセッションを開始します。
実際に信頼できるかどうかはRootCA証明書と付き合わせて判断します。
サーバー証明書の秘密鍵の生成
2048ビット長RSA鍵にしました。
$ openssl genrsa -out server.key 2048
こちらはサーバアプリケーションごとに置き場所が決まってたりするので、証明書を作った後で移動なりコピーなりします。これも秘密鍵なので漏らさないように工夫が必要なやつです。
証明書署名要求(CSR)の作成
RootCAに認証してもらうための情報ファイルを作ります。
SAN(SubjectAlternativeName)を使うと複数ドメイン、IP、ホストが設定できて便利よーとのことだったので、SAN形式を使います。
流石に0から作るのは面倒だったのでGeminiさんに作ってもらいました。
[req]
req_extensions = v3_req
prompt = no
distinguished_name = req_distinguished_name
[req_distinguished_name]
C = JP
ST = Shimane
L = Masuda
O = MyHome
CN = minipc.home
[v3_req]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = minipc.home
DNS.2 = localhost
IP.1 = fdxx:xxxx:xxxx::xxxx
先ほど作ったサーバ証明書用の秘密鍵を使ってサーバ証明書を作成します。
$ openssl req -new -key server.key -out server.csr -config san.cnf
RootCAによるサーバー証明書への署名
いくらサーバが 俺を信じろ! といったところでだれも信用してくれないので、信頼できるRootCAさんのお墨付き(署名)をもらいます。
$ openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile san.cnf -extensions v3_req
CAcreateserialオプションはrootCA.srlというシリアル番号ファイルがあればその番号を使い署名後値を1増やします。ファイルが無ければ適当なシリアル番号が振られてファイルが作成されます。
署名のシリアル番号がかぶってはイケナイのでこのファイルもrootCA.keyと一緒に管理しろとのことです。
後のオプションはわりと見たまんまですね。
Cockpitに署名を導入
デフォルトの設定では/etc/cockpit/ws-certs.d
にサーバ証明(cert,key)を置けば自動で使ってくれるらしいのでコピーするだけです。
$ cp server.crt /etc/cockpit/ws-certs.d/0-server.cert
$ cp server.key /etc/cockpit/ws-certs.d/0-server.key
オーナーがroot、パーミッションがkeyは600、certが644以下になっていることを確認しておきます。
$ ls /etc/cockpit/ws-certs.d
...
-rw-r--r--. 1 root root 1749 0-server.cert
-rw-------. 1 root root 1704 0-server.key
再起動すれば反映されます
$ systemctl restart cockpit
ブラウザの設定
ブラウザにrootCA.crtを設定してブラウザを再起動すれば鍵マークに警告がでなくなります。