... 自己署名証明書を使うほうが最早難しい時代だよねメモその1。
EDIT: secretに秘密鍵と公開鍵を同じファイルで入れても動くけど、同じファイルなのは微妙に紛らわしいので注記。
証明書の作成
適当にPowerShellを開いて、 New-SelfSignedCertificate
コマンドで作る。
New-SelfSignedCertificate -DnsName "flow.local" -NotAfter (Get-Date).AddYears(50) `
-CertStoreLocation "cert:\CurrentUser\My" -KeyLength 4096 -Type SSLServerAuthentication `
-TextExtension @("2.5.29.19 = {critical} {text}ca=1&pathlength=0") `
-KeyUsage CertSign,KeyEncipherment,DigitalSignature
KeyLength
みたいなパラメタはお好みで良いけど、難しいのは TextExtension
と KeyUsage
パラメタで、それぞれ:
-
TextExtension
: このパラメタでは作成する証明書を CAの証明書 に見せている。普通自己署名証明書はCAの証明書である必要は無いが、 何故かOpenSSLはKeyUsageにCertSignが入っている場合CA証明書じゃないと証明書をRejectしてしまう ようなので含めている。2.5.29.19
が basicConstraints の意味で、pathlength=0
はこの証明書がさらに下位のCAを持つことが無いということを示す。 -
KeyUsage
: デフォルトではKeyEncipherment,DigitalSignature
となるが、CertSign
を加えている
これで作成した証明書は、ファイル名を指定して実行 → certmgr.msc
で見つけられる。
管理ツール上の証明書は特に用途が無いので、インストールが終わったら消してしまって良い。
秘密鍵のインストール
管理ツールでの証明書を右クリックしてエクスポート...から秘密鍵をエクスポート、エクスポートされた .pfx
ファイルに openssl
コマンドを掛けて鍵データを .pem
形式で取り出す:
openssl pkcs12 -in flowlocal.pfx -nodes -out key.pem
(Windowsでは秘密鍵のエクスポート時にパスワードが必須になっている)
取り出した .pem
を kubectl
で secret としてインストールする:
kubectl create secret tls flowlocal-tls --cert=key.pem --key=key.pem
cert
と key
は同じファイルでOK(1つのファイルに両方を入れておける)。ここでは flowlocal-tls
という名前で作成している。 EDIT: この方法でTLS鍵として機能するが、公開鍵ファイルの中に秘密鍵も一緒に入ることになって微妙に気味が悪いので注意 。 気になるなら openssl
コマンドに -nocerts
とか -nokeys
を与えて別々のファイルにする。
秘密鍵のIngressでの使用
これ以降は普通のTLS鍵と違うところはない。単に TLS のsecretとして指定すれば、Ingressのトラフィックは自動的にその鍵で暗号化される:
tls:
- hosts:
- flow.local
secretName: flowlocal-tls
ただし、ここの hosts
と New-SelfSignedCertificate
に与えた DnsName
は一致している必要がある。