Post

[Linux] ๐Ÿ” OpenSSL๋กœ PFX ์ธ์ฆ์„œ ๋ณ€ํ™˜ ํ›„ Kubernetes TLS Secret ๋งŒ๋“ค๊ธฐ

Windows์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ PFX(PKCS#12) ์ธ์ฆ์„œ๋ฅผ OpenSSL๋กœ PEM ํ˜•์‹์˜ ํ‚คยท์ธ์ฆ์„œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , kubectl๋กœ Kubernetes TLS Secret์„ ์ƒ์„ฑํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

[Linux] ๐Ÿ” OpenSSL๋กœ PFX ์ธ์ฆ์„œ ๋ณ€ํ™˜ ํ›„ Kubernetes TLS Secret ๋งŒ๋“ค๊ธฐ

์ด ๊ธ€์—์„œ๋Š” Windows IIS๋‚˜ CA์—์„œ ๋ฐœ๊ธ‰ํ•œ PFX(PKCS#12) ์ธ์ฆ์„œ ํŒŒ์ผ์„ OpenSSL ๋ช…๋ น์œผ๋กœ ๊ฐœ์ธํ‚ค(.key)์™€ ์ธ์ฆ์„œ ์ฒด์ธ(.crt) PEM ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด๋ฅผ kubectl create secret tls๋กœ Kubernetes TLS Secret ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค. IngressยทArgo CD ๋“ฑ์—์„œ ์‚ฌ์šฉํ•  TLS Secret์„ ๋งŒ๋“ค ๋•Œ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ฆ PFX(PKCS#12) ํŒŒ์ผ์ด๋ž€?

PFX๋Š” PKCS#12 ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์˜ ์ธ์ฆ์„œ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํŒŒ์ผ ์•ˆ์— ๊ฐœ์ธํ‚ค + ์ธ์ฆ์„œ + ์ค‘๊ฐ„ CA ์ฒด์ธ์ด ๋ชจ๋‘ ํŒจ์Šค์›Œ๋“œ๋กœ ์•”ํ˜ธํ™”๋˜์–ด ๋“ค์–ด ์žˆ์–ด, Windows ํ™˜๊ฒฝ์—์„œ ์ธ์ฆ์„œ๋ฅผ ๋ฐฑ์—…ํ•˜๊ฑฐ๋‚˜ ์ด๊ด€ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Linux ์ง„์˜(Nginx, HAProxy, Kubernetes Ingress ๋“ฑ)์€ ์ผ๋ฐ˜์ ์œผ๋กœ PEM ํ˜•์‹์˜ ๋ณ„๋„ ํŒŒ์ผ(.key, .crt)์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ PFX๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  OpenSSL๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉPFX (PKCS#12)PEM
ํ˜•์‹๋ฐ”์ด๋„ˆ๋ฆฌBase64 ํ…์ŠคํŠธ
ํ™•์žฅ์ž.pfx, .p12.key, .crt, .pem
๊ตฌ์„ฑํ‚ค + ์ธ์ฆ์„œ + ์ฒด์ธ ํ†ตํ•ฉํŒŒ์ผ๋ณ„ ๋ถ„๋ฆฌ
์•”ํ˜ธํ™”ํ•ญ์ƒ ํŒจ์Šค์›Œ๋“œ ๋ณดํ˜ธ์„ ํƒ์  (ํ‚ค๋งŒ ์•”ํ˜ธํ™” ๊ฐ€๋Šฅ)
์ฃผ ์‚ฌ์šฉ์ฒ˜Windows, IISLinux, Nginx, Kubernetes

๐Ÿ› ๏ธ ์‚ฌ์ „ ์ค€๋น„

OpenSSL๊ณผ kubectl์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
openssl version
# OpenSSL 3.0.x ์ด์ƒ ๊ถŒ์žฅ

kubectl version --client

์ž‘์—…ํ•  PFX ํŒŒ์ผ๊ณผ ๊ทธ ํŒŒ์ผ์˜ ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด ๋‘ก๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€์ˆ˜๋กœ ์ง„ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
PFX_FILE="example.com.pfx"
PFX_PASS="ChangeMeStrongPass"   # PFX ์›๋ณธ ํŒจ์Šค์›Œ๋“œ
TMP_PASS="ChangeMeTempPass"     # ์ค‘๊ฐ„ ์ž‘์—…์šฉ ์ž„์‹œ ํŒจ์Šค์›Œ๋“œ
KEY_OUT="tls.key"
CRT_OUT="fullchain.crt"
NAMESPACE="argocd"
SECRET_NAME="tls-example-com"

โš ๏ธ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํŒจ์Šค์›Œ๋“œ๋ฅผ ์…ธ ํžˆ์Šคํ† ๋ฆฌ์— ๋‚จ๊ธฐ์ง€ ์•Š๋„๋ก -passin file:... ๋˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜(-passin env:VAR)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.


1๏ธโƒฃ PFX์—์„œ ๊ฐœ์ธํ‚ค ์ถ”์ถœํ•˜๊ธฐ

๋จผ์ € PFX์—์„œ ๊ฐœ์ธํ‚ค๋งŒ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ๋Š” ํ‚ค๊ฐ€ ์—ฌ์ „ํžˆ ์ž„์‹œ ํŒจ์Šค์›Œ๋“œ(TMP_PASS)๋กœ ์•”ํ˜ธํ™”๋œ PEM ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
openssl pkcs12 \
  -passin pass:${PFX_PASS} \
  -passout pass:${TMP_PASS} \
  -in ${PFX_FILE} \
  -nocerts \
  -out tmp.key
์˜ต์…˜์„ค๋ช…
pkcs12PKCS#12 ํ˜•์‹ ์ฒ˜๋ฆฌ ์„œ๋ธŒ์ปค๋งจ๋“œ
-passin pass:...์ž…๋ ฅ PFX ํŒŒ์ผ์˜ ํŒจ์Šค์›Œ๋“œ
-passout pass:...์ถœ๋ ฅ PEM ํ‚ค์— ์ ์šฉํ•  ํŒจ์Šค์›Œ๋“œ
-in์ž…๋ ฅ PFX ํŒŒ์ผ ๊ฒฝ๋กœ
-nocerts์ธ์ฆ์„œ๋Š” ์ œ์™ธํ•˜๊ณ  ํ‚ค๋งŒ ์ถ”์ถœ
-out์ถœ๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ

Tip: -passout์„ ๋นผ๋ฉด OpenSSL์ด ๋Œ€ํ™”ํ˜•์œผ๋กœ ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ฌผ์–ด๋ด…๋‹ˆ๋‹ค. ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ํŽธ์ด ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.


2๏ธโƒฃ ๊ฐœ์ธํ‚ค ํŒจ์Šค์›Œ๋“œ ์ œ๊ฑฐ (๋ณตํ˜ธํ™”)

Kubernetes TLS Secret๊ณผ ๋Œ€๋ถ€๋ถ„์˜ Ingress ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์—†๋Š” PEM ํ‚ค๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž„์‹œ ํŒจ์Šค์›Œ๋“œ๋กœ ์•”ํ˜ธํ™”๋œ ํ‚ค๋ฅผ ํ‰๋ฌธ RSA ํ‚ค๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
openssl rsa \
  -passin pass:${TMP_PASS} \
  -in tmp.key \
  -out ${KEY_OUT}

๋ช…๋ น์ด ์„ฑ๊ณตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

1
writing RSA key

์ƒ์„ฑ๋œ ${KEY_OUT} ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
-----BEGIN RSA PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQ...
-----END RSA PRIVATE KEY-----

โš ๏ธ ํ‰๋ฌธ ๊ฐœ์ธํ‚ค๋Š” ๋…ธ์ถœ ์‹œ ์ฆ‰์‹œ ์ธ์ฆ์„œ ํ๊ธฐ ์‚ฌ์œ ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ž„์‹œ ํŒŒ์ผ(tmp.key)์€ ๋ฐ˜๋“œ์‹œ ์‚ญ์ œํ•˜์„ธ์š”.


3๏ธโƒฃ ์ธ์ฆ์„œ ์ฒด์ธ ์ถ”์ถœํ•˜๊ธฐ

์ด๋ฒˆ์—๋Š” ํ‚ค๋ฅผ ์ œ์™ธํ•œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ์™€ ์ค‘๊ฐ„ CA ์ธ์ฆ์„œ๋ฅผ ํ•œ ํŒŒ์ผ๋กœ ๋ฌถ์–ด ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
openssl pkcs12 \
  -passin pass:${PFX_PASS} \
  -in ${PFX_FILE} \
  -clcerts \
  -nokeys \
  -out ${CRT_OUT}
์˜ต์…˜์„ค๋ช…
-clcertsํด๋ผ์ด์–ธํŠธ(์„œ๋ฒ„) ์ธ์ฆ์„œ๋งŒ ์ถœ๋ ฅ
-nokeys๊ฐœ์ธํ‚ค๋Š” ์ œ์™ธ

์ฒด์ธ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ํ’€์ฒด์ธ(fullchain)์œผ๋กœ ๋ฌถ๊ณ  ์‹ถ๋‹ค๋ฉด -clcerts ์˜ต์…˜์„ ๋นผ๊ณ , ์ถœ๋ ฅ๋œ ์ธ์ฆ์„œ ๋ธ”๋ก ์ค‘ ํ•„์š”ํ•œ ๊ฒƒ์„ ํ™•์ธํ•ด ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
openssl pkcs12 \
  -passin pass:${PFX_PASS} \
  -in ${PFX_FILE} \
  -nokeys \
  -out fullchain.crt

Tip: Ingress์—์„œ SSL Labs A+ ๋“ฑ๊ธ‰์„ ๋ฐ›์œผ๋ ค๋ฉด ์„œ๋ฒ„ ์ธ์ฆ์„œ + ์ค‘๊ฐ„ CA ์ˆœ์„œ๋กœ ์ •๋ ฌ๋œ ํ’€์ฒด์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


4๏ธโƒฃ ์ถ”์ถœ ๊ฒฐ๊ณผ ๊ฒ€์ฆํ•˜๊ธฐ

๋ณ€ํ™˜์ด ์ •์ƒ์ ์œผ๋กœ ๋๋‚ฌ๋Š”์ง€ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ์ •๋ณด ํ™•์ธ

1
openssl x509 -in ${CRT_OUT} -noout -subject -issuer -dates
1
2
3
4
subject=CN=example.com
issuer=CN=Internal Issuing CA
notBefore=Jan  1 00:00:00 2026 GMT
notAfter=Dec 31 23:59:59 2026 GMT

๊ฐœ์ธํ‚ค์™€ ์ธ์ฆ์„œ๊ฐ€ ํ•œ ์Œ์ธ์ง€ ํ™•์ธ (๋ชจ๋“ˆ๋Ÿฌ์Šค ๋น„๊ต)

1
2
3
diff \
  <(openssl rsa -in ${KEY_OUT} -modulus -noout) \
  <(openssl x509 -in ${CRT_OUT} -modulus -noout)

์ถœ๋ ฅ์ด ์—†์œผ๋ฉด ๊ฐ™์€ ์Œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅด๋ฉด ์ž˜๋ชป๋œ ํ‚ค/์ธ์ฆ์„œ ์กฐํ•ฉ์ด๋ฏ€๋กœ Secret์„ ๋งŒ๋“ค์–ด๋„ TLS ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.


5๏ธโƒฃ Kubernetes TLS Secret YAML ๋งŒ๋“ค๊ธฐ

kubectl create secret tls์— --dry-run=client -o yaml์„ ๋ถ™์ด๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ  ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
kubectl create secret tls ${SECRET_NAME} \
  -n ${NAMESPACE} \
  --key ${KEY_OUT} \
  --cert ${CRT_OUT} \
  --dry-run=client -o yaml > tls-example-com.yaml

์ƒ์„ฑ๋œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Secret
metadata:
  name: tls-example-com
  namespace: argocd
type: kubernetes.io/tls
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ...
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpN...

Tip: Git์— ์ปค๋ฐ‹ํ•œ๋‹ค๋ฉด ํ‰๋ฌธ Secret ๋Œ€์‹  Sealed Secrets๋‚˜ External Secrets Operator๋กœ ์•”ํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


6๏ธโƒฃ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉ ๋ฐ Ingress ์—ฐ๊ฒฐ

์ƒ์„ฑํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
kubectl apply -f tls-example-com.yaml

kubectl get secret ${SECRET_NAME} -n ${NAMESPACE}
# NAME              TYPE                DATA   AGE
# tls-example-com   kubernetes.io/tls   2      5s

์ดํ›„ Ingress ๋ฆฌ์†Œ์Šค์—์„œ tls.secretName์œผ๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - example.com
      secretName: tls-example-com
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: argocd-server
                port:
                  number: 443

๐Ÿงน ๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

์ž‘์—…์ด ๋๋‚˜๋ฉด ๋ฏผ๊ฐ ํŒŒ์ผ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1
shred -u tmp.key ${KEY_OUT} 2>/dev/null || rm -f tmp.key ${KEY_OUT}

โš ๏ธ shred๋Š” ext4 ๋“ฑ ์ผ๋ถ€ ํŒŒ์ผ์‹œ์Šคํ…œ์—์„œ๋งŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. SSDยท๋ณต์‚ฌ๋ณธ ์บ์‹œยทtmpfs์—์„œ๋Š” ์™„์ „ ์‚ญ์ œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ์ž์ฒด๋ฅผ ์•ˆ์ „ํ•œ ์œ„์น˜(์˜ˆ: tmpfs ๋งˆ์šดํŠธ)๋กœ ์žก๋Š” ํŽธ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๐Ÿš€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ

์œ„ ๋‹จ๊ณ„๋ฅผ ์ž๋™ํ™”ํ•œ ์˜ˆ์‹œ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env bash
set -euo pipefail

PFX_FILE="${1:?usage: $0 <pfx> <pfx-pass> <namespace> <secret-name>}"
PFX_PASS="${2}"
NAMESPACE="${3}"
SECRET_NAME="${4}"
TMP_PASS="$(openssl rand -hex 8)"

WORKDIR="$(mktemp -d)"
trap 'rm -rf "${WORKDIR}"' EXIT

openssl pkcs12 -passin "pass:${PFX_PASS}" -passout "pass:${TMP_PASS}" \
  -in "${PFX_FILE}" -nocerts -out "${WORKDIR}/tmp.key"

openssl rsa -passin "pass:${TMP_PASS}" \
  -in "${WORKDIR}/tmp.key" -out "${WORKDIR}/tls.key"

openssl pkcs12 -passin "pass:${PFX_PASS}" \
  -in "${PFX_FILE}" -nokeys -out "${WORKDIR}/tls.crt"

kubectl create secret tls "${SECRET_NAME}" \
  -n "${NAMESPACE}" \
  --key "${WORKDIR}/tls.key" \
  --cert "${WORKDIR}/tls.crt" \
  --dry-run=client -o yaml

โ“ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

Q. -nodes ์˜ต์…˜์„ ํ•œ ๋ฒˆ์— ์“ฐ๋ฉด ๋˜์ง€ ์•Š๋‚˜์š”?

๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. openssl pkcs12 -in file.pfx -nodes -out all.pem ํ•œ ์ค„๋กœ ํ‚ค์™€ ์ธ์ฆ์„œ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ํ•จ๊ป˜ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ํ‚ค/์ธ์ฆ์„œ๋ฅผ ํ•œ ํŒŒ์ผ์— ์„ž์œผ๋ฉด kubectl create secret tls์ฒ˜๋Ÿผ ๋‘ ํŒŒ์ผ์„ ์š”๊ตฌํ•˜๋Š” ๋„๊ตฌ์—์„œ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋‹จ๊ณ„๋ณ„๋กœ ์ถ”์ถœํ•˜๋Š” ํŽธ์ด ์ž๋™ํ™”์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Q. โ€œMac verify error: invalid passwordโ€ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

PFX ํŒŒ์ผ์˜ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ํ‹€๋ฆฐ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋Š” OpenSSL 3.x์—์„œ ๊ตฌ๋ฒ„์ „ PFX์˜ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ -legacy ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด ๋ณด์„ธ์š”.

1
openssl pkcs12 -legacy -passin pass:... -in file.pfx -out out.pem

Q. ํ‰๋ฌธ RSA ํ‚ค์™€ PKCS#8 ํ‚ค ์ค‘ ์–ด๋А ์ชฝ์„ ์จ์•ผ ํ•˜๋‚˜์š”?

๋Œ€๋ถ€๋ถ„์˜ Kubernetes Ingress ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‘ ํ˜•์‹์„ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ผ๋ถ€ ์‹ ๊ทœ ๋„๊ตฌ(์˜ˆ: Envoy ์ผ๋ถ€ ๋นŒ๋“œ)๋Š” PKCS#8์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค.

1
openssl pkcs8 -topk8 -nocrypt -in tls.key -out tls.pkcs8.key

Q. --dry-run=client์™€ --dry-run=server์˜ ์ฐจ์ด๋Š”?

client๋Š” ํด๋ผ์ด์–ธํŠธ(kubectl) ์ธก์—์„œ๋งŒ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  API ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. server๋Š” API ์„œ๋ฒ„๊นŒ์ง€ ๊ฐ€์„œ ์–ด๋“œ๋ฏธ์…˜ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Secret YAML์„ ๋งŒ๋“ค ๋•Œ๋Š” client๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

Q. Secret์„ ๋งŒ๋“  ๋’ค ์ธ์ฆ์„œ๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ kubectl create secret tls ... --dry-run=client -o yaml | kubectl apply -f -๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Ingress ์ปจํŠธ๋กค๋Ÿฌ๋Š” Secret ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ด ์ž๋™์œผ๋กœ ์ƒˆ ์ธ์ฆ์„œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“š ์ฐธ๊ณ 

This post is licensed under CC BY 4.0 by the author.