- truststore : ssl 연결에서 서버가 제공한 인증서를 확인하는 root ca 인증서를 저장하는데 사용
- keystore : 특정 프로그램 검증을 위해 서버나 클라이언트에 제출해야 하는 개인키 or ID 이증서를 저장하는데 사용
PKCS란? 공개키 기반 구조에서 안전하게 데이터를 교환하기 위한 비공식 표준 프로토콜
PKCS12란? 바이너리 형식으로 저장되며 하나 혹은 다수의 인증서, 개인키 내용을 파일 하나에 모두 담고 있는 KeyStore 파일이며, 비밀번호로 암호화되어 있다
- 하나의 파일에 여러 암호화 관련 요소들을 합쳐서 보관하는 방식에 관한 표준이다
- root ca 파일을 가지고 trust store 생성
- tls 인증서를 가지고 pkcs12 파일 생성
- pkcs12 파일을 이용해 keystore 생성
- keystore 타입을 pkcs12 로 변경
- keystore 와 trust store를 이용하여 K8S Secret 생성
OpenSSL을 이용하여 Root 인증서, 서버 인증서, 개인키를 준비하자
keytool -importcert -alias ca-cert -file rootCA.pem -keystore keycloaks.truststore.jks
- trust store 생성하자. 암호화에 사용한 Password를 잘 기억하자
openssl pkcs12 -export -in 서버인증서 -inkey 개인키 -out keycloaks.test.net.p12
- 서버 인증서와 개인키를 이용해 pkcs12 파일을 생성하자
- Keytool은 외부에서 생성된 개인키를 Keystore에 등록하는 방법을 제공하지 않는다. 허나, JDK 6 이상부터는 서버 인증서와 개인키를 pkcs12 파일로 만들어서 Keystore에 등록할 수 있다
keytool -list -v -storetype pkcs12 -keystore keycloaks.test.net.p12
- PKCS12 파일 내부의 alias 리스트가 출력하여 keystore에 import 할 alias를 확인하자
- 해당 alias는 keystore 생성 시, import 명령어의 -alias 옵션에 지정한다
keytool -importkeystore -deststorepass '암호화에 사용한 비밀번호' -destkeypass '암호화에 사용한 비밀번호' -destkeystore keycloaks.test.jks -srckeystore keycloaks.test.net.p12 -srcstoretype PKCS12 -alias 1
- keystore를 생성하자
keytool -importkeystore -srckeystore keycloaks.keystore.jks -destkeystore keycloaks.keystore.jks -deststoretype pkcs12
- keystore 형식을 pkcs12으로 변경
- JAVA에서만 사용하면 JKS 형식으로 사용하지만, 여러 플랫폼에서 사용해야 하면, JKS를 PKCS12로 변환해야 한다
kubectl create secret generic truststore --from-file=keycloaks.truststore.jks --from-file=keycloaks.keystore.jks -n keycloak --kubeconfig /home/ec2-user/.kube/config
- 생성한 KeyStore와 Trust Store를 이용해 Secret을 생성하자
- 해당 Secret을 이용해 KeyCloak에 KeyStore와 Trust Store를 등록할 것이다
helm fetch bitnami/keycloak
tar -xvzf keycloak-16.0.2.tgz
auth:
## @param auth.adminUser Keycloak administrator user
##
adminUser: user
## @param auth.adminPassword Keycloak administrator password for the new user
##
adminPassword: user123
ingress:
enabled: true
ingressClassName: nginx
pathType: ImplementationSpecific
apiVersion: ""
hostname: keycloak.test.net
path: /
servicePort: http
annotations:
ingress.annotations.nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
labels: {}
tls: true
selfSigned: false
extraHosts: []
extraPaths: []
extraTls: []
secrets:
name: keycloak.test.net-tls
key: |
개인키 내용
certificate: |
서버키 내용
- Ingress 설정이다. Domain 주소를 설정하고, TLS 인증서를 적용하자
postgresql:
enabled: true
auth:
postgresPassword: test123
username: bn_keycloak
password: test123
database: bitnami_keycloak
existingSecret: ""
architecture: standalone
- postgresql enabled를 true로 하여 PostgreSql을 생성하도록 하자. 사용하는 차트는 Chart.yaml의 dependencies에 설정되어 있다
- Keycloak Web 사이트에 서버 인증서를 등록하는 것은 위에 Ingress 설정이다
tls:
enabled: true
autoGenerated: false
existingSecret: "생성한 Secret 이름"
usePem: false
#truststoreFilename: ""
truststoreFilename: "keycloaks.truststore.jks"
#keystoreFilename: ""
keystoreFilename: "keycloaks.keystore.jks"
keystorePassword: "암호화에 사용한 비밀번호"
truststorePassword: "암호화에 사용한 비밀번호"
passwordsSecret: ""
- 위와 같이 설정하자
helm install keycloak -n keycloak .
- Helm을 이용하여 keycloak namespace에 Keycloak을 배포하자
- Keycloak에 잘 접속된다
- Admin Console에 접속하자
- Admin Console에 잘 접속된다
- Keycloak Web 사이트에 TLS 인증서가 잘 적용되었다
잘보고갑니다