암호화 비대칭키 암호화 문서 및 코드 작성 완료
@@ -1,2 +1,6 @@
|
||||
encrypt:
|
||||
key: secretkey123456789
|
||||
# key: secretkey123456789
|
||||
key-store:
|
||||
location: classpath:keystore/encryptionKey.jks
|
||||
password: 1q2w3e4r
|
||||
alias: encryptionKey
|
||||
BIN
config/src/main/resources/keystore/encryptionKey.jks
Normal file
BIN
config/src/main/resources/keystore/publicEncryptionKey.jks
Normal file
21
config/src/main/resources/keystore/trustServer.cer
Normal file
@@ -0,0 +1,21 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDXTCCAkWgAwIBAgIEdCYMHDANBgkqhkiG9w0BAQsFADBfMQswCQYDVQQGEwJL
|
||||
UjEPMA0GA1UEBxMGUGFuZ3lvMRQwEgYDVQQKEwtkZXZlbG9wbWVudDEUMBIGA1UE
|
||||
CxMLZGV2ZWxvcG1lbnQxEzARBgNVBAMTCnJveWNvbXBhbnkwHhcNMjIwNDI0MTIw
|
||||
ODQwWhcNMjIwNzIzMTIwODQwWjBfMQswCQYDVQQGEwJLUjEPMA0GA1UEBxMGUGFu
|
||||
Z3lvMRQwEgYDVQQKEwtkZXZlbG9wbWVudDEUMBIGA1UECxMLZGV2ZWxvcG1lbnQx
|
||||
EzARBgNVBAMTCnJveWNvbXBhbnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||
AoIBAQCyl5WDZdJCTSP5A0WQwN0rGevShKQ8mGGeLEJoQvu0vzBTQwt8pY7E5EOE
|
||||
xVljFUJ0qrNwIImyiJdsw1cdfbw61v3rt+0KSEo34w8cLG2ghbIlU5PSqq6scuL9
|
||||
96xZ+y6zuE+PKfE3a/w9FhFWuEoFXdI+3N2B4lbOcjNgz2YskEMlV+mEYg08CRko
|
||||
KN3DwvRyTynnqRB5dUhbuhGe2w/TmHZWOdxp81aGSGhbLvEX7Llz5gdFQNLj0tzt
|
||||
J5Pf0DY9ytzD6Pq1UBqy1IA/R5An2tvn14/bowl2C0YN0dzrXf32vyzq+5+CZRsq
|
||||
Ucz/yku+4vS0hlZNAs/McIhRGzZLAgMBAAGjITAfMB0GA1UdDgQWBBQZ+hQyGtpQ
|
||||
FwdezjN3r7Q/+VtIaTANBgkqhkiG9w0BAQsFAAOCAQEAprheuS0Qj6G3hyIGbS56
|
||||
l4XZnceGGmfthl+v7ucMV8EOl8O2OQKvwjhu2cinbTgqdjuPwDqMXLh5OiLed6C2
|
||||
9nMIhK6sMFqi9mTLIf1dyguN3hnUf9ool8M8D/MXN/7KsML1vQjqNXt1+KkCjkvZ
|
||||
DgRS18FEVlxRB9+fyC36HV5GBFy64hr1Tl1Qzu/EWqAHwrRWIhoUeAwNb5Lq9tJ8
|
||||
A64UHq1O/ciEtFXEUmMvE2vJIRuxUBqPEbYPcimUqBwLqXNl/PgNv1oQaIALE3xd
|
||||
9I83Qy6eB1vtinfg9toBxPYPrCoiMK6Ma1SVgRIYIS/YiKZGFgCgtBhdhuqmak5d
|
||||
Zg==
|
||||
-----END CERTIFICATE-----
|
||||
148
document/encryption/asymmetric_encryption.md
Normal file
@@ -0,0 +1,148 @@
|
||||
[이전 장 (링크)](https://imprint.tistory.com/224) 에서는 대칭키를 통해서 Config 서버의 정보를 암호화하는 방식에 대해서 알아보았다.
|
||||
이번 장에서는 Config 서버의 정보를 비대칭키를 사용하여 암호화하는 방식에 대해서 알아본다.
|
||||
모든 소스 코드는 [깃허브 (링크)](https://github.com/roy-zz/spring-cloud) 에 올려두었다.
|
||||
|
||||
---
|
||||
|
||||
### Asymmetric Encryption (비대칭키)
|
||||
|
||||
#### 적용 및 테스트
|
||||
|
||||
1. Key를 저장할 디렉토리 생성
|
||||
|
||||
필자는 Config 서버의 resource 디렉토리에 생성하였다.
|
||||
|
||||

|
||||
|
||||
2. 비대칭키 생성
|
||||
|
||||
1단계에서 생성한 디렉토리로 이동하여 아래의 커맨드를 입력하여 키를 생성한다.
|
||||
- CN: Company Name
|
||||
- OU: Organization Unit
|
||||
- O: Organization
|
||||
- L: Location
|
||||
- C: Country
|
||||
|
||||
```bash
|
||||
$ keytool -genkeypair -alias encryptionKey -keyalg RSA -dname "CN=roycompany, OU=development, O=development, L=Pangyo, C=KR" \
|
||||
-keypass "1q2w3e4r" -keystore encryptionKey.jks -storepass "1q2w3e4r"
|
||||
```
|
||||
|
||||

|
||||
|
||||
3. Config 서버 bootstrap.yml 파일 수정
|
||||
|
||||
Config 서버에서 생성된 key 파일을 참조 할 수 있도록 bootstrap.yml 파일을 수정한다.
|
||||
classpath는 src/main/resources/ 를 의미한다.
|
||||
|
||||
```yaml
|
||||
encrypt:
|
||||
key-store:
|
||||
location: classpath:keystore/encryptionKey.jks
|
||||
password: 1q2w3e4r
|
||||
alias: encryptionKey
|
||||
```
|
||||
|
||||
4. 암호화 테스트
|
||||
|
||||
Postman을 사용하여 Config 서버의 encrypt API를 호출한다.
|
||||
대칭키를 통한 암호화보다 훨씬 길어진 암호화된 비밀번호를 확인할 수 있다.
|
||||
|
||||

|
||||
|
||||
5. 복호화 테스트
|
||||
|
||||
decrypt API를 호출하여 정상적으로 복호화가 되는지 확인한다.
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
#### User Service 적용
|
||||
|
||||
유저 서비스의 application.yml 파일에서 DB 접속 정보를 Config 용 원격 깃 저장소의 yml 파일로 옮기는 과정은 [이전 장(링크)](https://imprint.tistory.com/224) 에서 다루었으므로 생략한다.
|
||||
혹시라도 분리되어 있지 않다면 대칭키 암호화를 다루었던 이전 장을 먼저 확인하고 다시 이 글로 돌아오는 것을 추천한다.
|
||||
|
||||
1. Config 용 원격 깃 저장소 수정
|
||||
|
||||
encrypt API를 호출하여 암호화된 문자열을 DB 접속정보 중 비밀번호 부분에 입력한다.
|
||||
이때 비밀번호는 암호화된 비밀번호로 변경하고 암호화된 비밀번호임을 표시하기 위해 비밀번호 앞에 {cipher}라는 접두사를 붙인다.
|
||||
|
||||

|
||||
|
||||
변경된 설정 정보를 원격 저장소로 Push하고 [Spring Cloud Bus(링크)](https://imprint.tistory.com/223?category=1069520) 를 사용하여 서버에 반영한다.
|
||||
|
||||
2. 정상 반영 확인
|
||||
|
||||
- Config 서버를 통한 확인
|
||||
localhost:8888/user/default 로 접속하여 정상적으로 복호화(decrypt)되는지 확인해본다.
|
||||
|
||||

|
||||
|
||||
- 유저 서비스에서 API로 확인
|
||||
health-check API를 아래와 같이 DB 설정 정보를 반환하도록 수정한다
|
||||
|
||||

|
||||
|
||||
정상적으로 반영된 것을 확인할 수 있다.
|
||||
|
||||
---
|
||||
|
||||
#### Keytool 살펴보기
|
||||
|
||||
우리는 keytool을 사용하여 비대칭 암호화 키를 생성하였다.
|
||||
몇가지 기능들을 추가로 알아보도록 한다.
|
||||
|
||||
1. 키 상세정보 보기
|
||||
|
||||
아래의 커맨드를 입력하면 비밀번호를 입력하라는 문구가 출력된다.
|
||||
키를 생성할 때 입력한 비밀번호를 입력하면 된다.
|
||||
|
||||
```bash
|
||||
$ keytool -list -keystore encryptKey.jks -v
|
||||
```
|
||||
|
||||

|
||||
|
||||
2. 공개 인증서 생성
|
||||
|
||||
아래의 커맨드를 입력하면 키 상세정보 보기와 동일하게 비밀번호 입력하라는 문구가 출력된다.
|
||||
키를 생성할 때 입력한 비밀번호를 입력한다.
|
||||
|
||||
```bash
|
||||
$ keytool -export -alias encryptionKey -keystore encryptionKey.jks -rfc -file trustServer.cer
|
||||
```
|
||||
|
||||

|
||||
|
||||
3. 공개 인증서로 공개키 생성
|
||||
|
||||
아래의 커맨드를 입력하여 공개 인증서를 통해서 공개키를 생성한다.
|
||||
|
||||
```bash
|
||||
$ keytool -import -alias trustServer -file trustServer.cer -keystore publicEncryptionKey.jks
|
||||
```
|
||||
|
||||
비밀번호 입력과 새로운 비밀번호 입력하라고 나오면 키를 생성할 때 입력한 비밀번호를 입력한다.
|
||||
비밀번호가 정상적으로 입력되면 인증서를 신뢰하냐는 질문(Trust this certificate)이 나오는데 `yes`를 입력해준다.
|
||||
|
||||

|
||||
|
||||
4. 공개 키와 비공개키 비교
|
||||
|
||||
아래의 두 개의 커맨드를 입력하여 공개 키와 비공개 키의 내용을 확인해본다.
|
||||
|
||||
```bash
|
||||
$ keytool -list -keystore encryptionKey.jks
|
||||
$ keytool -list -keystore publicEncryptionKey.jks
|
||||
```
|
||||
|
||||

|
||||
|
||||
우리가 비대칭키로 Config 서버를 구축할 때 공개키는 사용하지 않았지만 만약 우리 서버에서 만든 키를 외부 서비스에서 복호화 해야한다면 지금처럼 생성된 공개키를 제공해야한다.
|
||||
|
||||
---
|
||||
|
||||
**참고한 강의**:
|
||||
|
||||
- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4
|
||||
BIN
document/encryption/image/cer-to-jks-public-key.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
document/encryption/image/check-asym-via-config.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
document/encryption/image/check-asym-via-user.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
document/encryption/image/decrypt-test.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
document/encryption/image/encrypt-test.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
document/encryption/image/generated-key.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
document/encryption/image/generated-public-key.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
document/encryption/image/key-detail-info.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
document/encryption/image/make-keystore-directory.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
document/encryption/image/modifed-asym-user-default.png
Normal file
|
After Width: | Height: | Size: 212 KiB |
BIN
document/encryption/image/public-nonpublic-info.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
@@ -1,4 +1,4 @@
|
||||
이번 장에서는 대칭키와 비대칭키를 통한 암호화에 대해서 알아본다.
|
||||
이번 장에서는 Config 서버의 정보를 대칭키를 사용하여 암호화하는 방식에 대해서 알아본다.
|
||||
모든 소스 코드는 [깃허브 (링크)](https://github.com/roy-zz/spring-cloud) 에 올려두었다.
|
||||
|
||||
---
|
||||
@@ -102,7 +102,7 @@ encrypt:
|
||||
|
||||

|
||||
|
||||
- 유저 서비스에서 콘솔 출력으로 확인
|
||||
- 유저 서비스에서 API로 확인
|
||||
health-check API를 아래와 같이 DB 설정 정보를 반환하도록 수정한다
|
||||
|
||||
```java
|
||||