맞습니다! 사내 사설 CA(PKI)나 Cert-Manager가 구축되어 있지 않다면, openssl 명령어로 자체 서명(Self-Signed) 인증서와 키를 직접 생성해서 시크릿으로 등록해야 합니다.
MinKMS(또는 KES)는 TLS 인증서의 SAN(Subject Alternative Name)에 K8s 내부 서비스 도메인 주소가 정확히 포함되어 있어야 MinIO가 접속할 때 TLS 핸드셰이크 오류(certificate valid for ..., not ...)를 내지 않습니다.
아래 절차대로 실행하시면 필요한 인증서와 키가 생성되고 Secret 등록까지 한 번에 완료됩니다.
cat <<EOF > minkms-san.cnf
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[dn]
CN = minkms.minkms.svc.cluster.local
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = minkms
DNS.2 = minkms.minkms
DNS.3 = minkms.minkms.svc
DNS.4 = minkms.minkms.svc.cluster.local
IP.1 = 127.0.0.1
EOF
(※ 네임스페이스가 minkms가 아니라면 네임스페이스에 맞게 도메인을 수정하세요.)
# 1. 개인키 생성 (minkms-server.key)
openssl genrsa -out minkms-server.key 2048
# 2. 자체 서명 인증서 생성 (minkms-server.crt)
openssl req -new -x509 \
-key minkms-server.key \
-out minkms-server.crt \
-days 3650 \
-config minkms-san.cnf \
-extensions req_ext
검증: openssl x509 -in minkms-server.crt -text -noout | grep -A 5 "Subject Alternative Name"을 실행해 위 DNS 목록들이 잘 들어갔는지 확인합니다.
kubectl create secret tls minkms-tls \
--cert=minkms-server.crt \
--key=minkms-server.key \
-n minkms
검증: kubectl get secret minkms-tls -n minkms로 생성을 확인합니다.
자체 서명 인증서이므로 MinIO 테넌트가 MinKMS에 연결할 때 certificate signed by unknown authority 에러가 발생하지 않도록, 방금 만든 minkms-server.crt를 MinIO 테넌트의 신뢰할 수 있는 CA 인증서(Secret) 목록에도 함께 등록해 주어야 합니다.
# MinIO 테넌트가 위치한 네임스페이스에 CA Secret으로 등록 (예: minio 네임스페이스)
kubectl create secret generic minkms-ca-cert \
--from-file=minkms-ca.crt=minkms-server.crt \
-n <MINIO_NAMESPACE>
==
MinIO 테넌트가 MinKMS(KES)와 통신할 때 신원을 증명하는 클라이언트 인증서(mTLS Client Certificate) 생성 및 MinKMS 정책(policy)에 등록할 Identity Hash 추출 방법입니다.
# 1. 클라이언트 개인키 생성
openssl genrsa -out minio-client.key 2048
# 2. 클라이언트 자체 서명 인증서 생성 (10년 유효기간)
openssl req -new -x509 \
-key minio-client.key \
-out minio-client.crt \
-days 3650 \
-subj "/CN=minio-aistor-tenant"
identity로 사용합니다. openssl 명령어로 이를 추출합니다.openssl x509 -in minio-client.crt -pubkey -noout \
| openssl pkey -pubin -outform DER \
| openssl dgst -sha256 \
| awk '{print $NF}'
출력 예시:
7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d
이 64자리 16진수 문자열이 바로 MinKMS config.yaml의 identities 항목에 들어갈 값입니다.
policy.<정책명>.identities 목록에 추가합니다.# minkms-config.yaml 예시 발췌
policy:
minio:
paths:
- /v1/key/create/*
- /v1/key/generate/*
- /v1/key/decrypt/*
- /v1/key/bulk/decrypt/*
identities:
- 7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d # 위에서 추출한 해시값
# MinIO 테넌트 네임스페이스(예: minio)에 Secret 생성
kubectl create secret generic minio-kes-client-cert \
--from-file=client.crt=minio-client.crt \
--from-file=client.key=minio-client.key \
-n <MINIO_TENANT_NAMESPACE>
생성한 Secret을 MinIO 테넌트 정의에 지정하면 mTLS 연동 준비가 완료됩니다.
spec:
features:
enableKMS: true
kms:
endpoint: "https://minkms.minkms.svc.cluster.local:7373"
defaultKey: "my-minio-key"
certificate:
secretName: minio-kes-client-cert # 위 Step 4에서 생성한 Secret
==
MinIO 테넌트가 MinKMS(KES)와 통신할 때 신원을 증명하는 클라이언트 인증서(mTLS Client Certificate) 생성 및 MinKMS 정책(policy)에 등록할 Identity Hash 추출 방법입니다.
# 1. 클라이언트 개인키 생성
openssl genrsa -out minio-client.key 2048
# 2. 클라이언트 자체 서명 인증서 생성 (10년 유효기간)
openssl req -new -x509 \
-key minio-client.key \
-out minio-client.crt \
-days 3650 \
-subj "/CN=minio-aistor-tenant"
identity로 사용합니다. openssl 명령어로 이를 추출합니다.openssl x509 -in minio-client.crt -pubkey -noout \
| openssl pkey -pubin -outform DER \
| openssl dgst -sha256 \
| awk '{print $NF}'
출력 예시:
7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d
이 64자리 16진수 문자열이 바로 MinKMS config.yaml의 identities 항목에 들어갈 값입니다.
policy.<정책명>.identities 목록에 추가합니다.# minkms-config.yaml 예시 발췌
policy:
minio:
paths:
- /v1/key/create/*
- /v1/key/generate/*
- /v1/key/decrypt/*
- /v1/key/bulk/decrypt/*
identities:
- 7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d # 위에서 추출한 해시값
# MinIO 테넌트 네임스페이스(예: minio)에 Secret 생성
kubectl create secret generic minio-kes-client-cert \
--from-file=client.crt=minio-client.crt \
--from-file=client.key=minio-client.key \
-n <MINIO_TENANT_NAMESPACE>
생성한 Secret을 MinIO 테넌트 정의에 지정하면 mTLS 연동 준비가 완료됩니다.
spec:
features:
enableKMS: true
kms:
endpoint: "https://minkms.minkms.svc.cluster.local:7373"
defaultKey: "my-minio-key"
certificate:
secretName: minio-kes-client-cert # 위 Step 4에서 생성한 Secret
==
MinIO 테넌트가 MinKMS(KES)와 통신할 때 신원을 증명하는 클라이언트 인증서(mTLS Client Certificate) 생성 및 MinKMS 정책(policy)에 등록할 Identity Hash 추출 방법입니다.
# 1. 클라이언트 개인키 생성
openssl genrsa -out minio-client.key 2048
# 2. 클라이언트 자체 서명 인증서 생성 (10년 유효기간)
openssl req -new -x509 \
-key minio-client.key \
-out minio-client.crt \
-days 3650 \
-subj "/CN=minio-aistor-tenant"
identity로 사용합니다. openssl 명령어로 이를 추출합니다.openssl x509 -in minio-client.crt -pubkey -noout \
| openssl pkey -pubin -outform DER \
| openssl dgst -sha256 \
| awk '{print $NF}'
출력 예시:
7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d
이 64자리 16진수 문자열이 바로 MinKMS config.yaml의 identities 항목에 들어갈 값입니다.
policy.<정책명>.identities 목록에 추가합니다.# minkms-config.yaml 예시 발췌
policy:
minio:
paths:
- /v1/key/create/*
- /v1/key/generate/*
- /v1/key/decrypt/*
- /v1/key/bulk/decrypt/*
identities:
- 7b8d4e9f3a1c2b5d6e8f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d # 위에서 추출한 해시값
# MinIO 테넌트 네임스페이스(예: minio)에 Secret 생성
kubectl create secret generic minio-kes-client-cert \
--from-file=client.crt=minio-client.crt \
--from-file=client.key=minio-client.key \
-n <MINIO_TENANT_NAMESPACE>
생성한 Secret을 MinIO 테넌트 정의에 지정하면 mTLS 연동 준비가 완료됩니다.
spec:
features:
enableKMS: true
kms:
endpoint: "https://minkms.minkms.svc.cluster.local:7373"
defaultKey: "my-minio-key"
certificate:
secretName: minio-kes-client-cert # 위 Step 4에서 생성한 Secret