본문 바로가기
Spring

Mysql - Spring으로 SSL 연결하는 방법(K8S 환경, Mac OS 기준)

by 오늘부터개발시작 2023. 6. 19.

간혹 Mysql에 접근하기 위해서 SSL이 강제되는 경우가 있다. 이 경우 스프링에서 주어진 .crt 파일, .key파일 혹은 .pem 파일을 사용해서 접근을 해야한다. 이 문제를 어떻게 해결할 수 있는지 간단하게 정리해보겠다. (K8S를 사용하고 있다고 가정)

 

 

1. 클라이언트 인증서 확인

접근하려는 Mysql 서버에서 주어진 .crt, .key, .pem 같은 파일이 있어야 한다. Java Spring에서는 .p12 확장자를 표준으로 사용하고 있어서, .crt나 .key 확장자 키를 Workbench나 Datagrip 같은 프로그램처럼 사용할 수 없기 때문에 변환을 해줘야한다. 

 

2. ca.p12 인증서 생성

2-1. keytool을 이용한 keystore 생성

 
keytool -importcert -file ca-cert.pem  -keystore truststore.jks -storepass {password}


2-2. keytool을 이용한 .p12 포맷으로 변경 

keytool -importkeystore -srckeystore truststore.jks -destkeystore ca.p12 -srcstoretype jks -deststoretype pkcs12
 

 

3. tls.p12 인증서 생성

openssl pkcs12 -export -in server-cert.pem -inkey server-key.pem -out tls.p12

 

4. K8S Secret 생성

kubectl create secret generic mysql-secret --from-file=tls.p12 --from-file=ca.p12

 

5. K8S Secret 볼륨 마운트

containers:
  - volumeMounts:
      - mountPath: /mysql-secret
        name: mysql-secret
        readOnly: true
  ...
...
volumes:
  - name: mysql-secret
    secret:
      defaultMode: 420
      secretName: mysql-secret
...

 

6. Spring yaml 설정

datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: >
        jdbc:mysql://{domain}:{port}
        ?useUnicode=true
        &characterEncoding=utf8
        &useLegacyDatetimeCode=false
        &serverTimezone=Asia/Seoul
        &createDatabaseIfNotExist=true
        &sslMode=VERIFY_CA
        &trustCertificateKeyStoreUrl=file:/mysql-secret/ca.p12
        &trustCertificateKeyStoreType=PKCS12
        &trustCertificateKeyStorePassword=[password]
        &clientCertificateKeyStoreUrl=file:/mysql-secret/tls.p12
        &clientCertificateKeyStoreType=PKCS12
        &clientCertificateKeyStorePassword=[password]