MSA 구축 (7) - Config 서버와 클라이언트에서 공개키와 개인키를 활용한 암호화/복호화 설정

오형상·2024년 11월 24일
0

Ficket

목록 보기
7/27
post-thumbnail

문제 발생

Spring Cloud Config 서버에서 암호화된 데이터를 복호화하려는 과정에서 아래와 같은 오류가 발생했습니다:

java.lang.IllegalStateException: Cannot decrypt: key=jwt.secret
...
Caused by: java.lang.UnsupportedOperationException: No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly?

원인

Config 서버 설정에서 복호화 기능이 비활성화된 상태(spring.cloud.config.server.encrypt.enabled=false)였기 때문에, 클라이언트가 복호화를 시도할 때 키를 찾을 수 없었습니다.


해결 방안

Config 서버에 공개키만 두고 암호화만 수행하며, 클라이언트에서 개인키를 사용해 복호화하도록 변경했습니다. 아래는 구현 과정입니다.

1. 인증서 및 키 생성

1.1 인증서 생성

Config 서버에서 사용할 인증서를 생성합니다:

keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file trust_key.cer

인증서 생성 결과

1.2 공개키를 별도 키스토어로 생성

Config 서버에서 사용할 공개키만 포함된 키스토어를 생성합니다:

keytool -import -alias trust_publicKey -file trust_key.cer -keystore publicKey.jks

2. Config 서버 설정

Config 서버는 복호화 기능을 비활성화하고 공개키를 사용해 암호화만 수행하도록 설정합니다.

application.yml

encrypt:
  key-store:
    password: test1234
    alias: trust_publicKey
    location: classpath:/publicKey.jks

spring:
  cloud:
    config:
      server:
        encrypt:
          enabled: false

3. 테스트

3.1 암호화 테스트

Config 서버에서 /encrypt 엔드포인트를 통해 데이터를 암호화합니다.

curl -X POST http://localhost:8888/encrypt -d "mySecretValue"

결과:
암호화 테스트 성공

3.2 복호화 테스트 실패

Config 서버에서 /decrypt 엔드포인트를 통해 데이터 복호화가 불가합니다.

복호화 테스트 실패


4. 클라이언트 수정

4.1 개인키 설정

각 클라이언트에서 개인키가 포함된 apiEncryptionKey.jks를 참조하도록 설정합니다.

application.yml

encrypt:
  key-store:
    password: test1234
    alias: apiEncryptionKey
    location: classpath:/apiEncryptionKey.jks

4.2 실행 성공

클라이언트에서 개인키를 활용해 암호화된 데이터를 복호화하는 데 성공했습니다.


정리

  • Config 서버:

    • 공개키만 포함된 publicKey.jks를 사용해 암호화 수행.
    • 복호화 기능 비활성화(spring.cloud.config.server.encrypt.enabled=false).
  • 클라이언트:

    • 개인키가 포함된 apiEncryptionKey.jks를 사용해 복호화 수행.

Reference

0개의 댓글