
Config-Server와 Private Repository 간의 연결을 위해서 다음과 같이 설정한 뒤 프로젝트를 실행했습니다.
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/hyensukim/BooTakHae-Config.git
username: github 아이디
password: github 비밀번호
콘솔에 다음과 같은 오류가 발생했습니다.

이를 확인해보니 Github 내 private repository에 엑세스하기 위해서는 SSH 프로토콜을 통해 접근이 가능하다고 합니다. 따라서, not authorized 오류가 발생했습니다.
이를 해결하기 위해서 SSH 관련 설정 및 Github와 연동을 하겠습니다.
우선, 필자는 기존에 SSH 키 생성을 하지 않았기 때문에 SSH 키부터 생성해보겠습니다.
📜 참고 문서
Git Bash를 열어줍니다.
다음 텍스트를 붙여넣은 뒤 예제에서 사용한 이메일을 Github 이메일 주소로 바꿔서 붙여넣습니다.
ssh-keygen -t ed25519 -C "your_email@example.com"
위 과정을 통해서 Github 이메일을 라벨로 사용하여 새로운 SSH 키가 생성됩니다.
Enter file in which to save the key (/c/Users/user/.ssh/id_ed25519):
위처럼 "키를 저장할 파일을 입력하세요" 라는 프롬프트가 표시되는 경우, Enter를 통해 기본 파일 위치 적용이 가능합니다.
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
SSH 키를 사용하는 경우, 공격자가 컴퓨터에 대한 엑세스 권한을 얻을 경우 해당 키를 사용하는 모든 시스템에 대한 엑세스 권한을 얻을 수 있게 됩니다. 추가 보안 계층을 추가하기 위해서는 SSH 키에 암호를 추가할 수 있습니다.
이는 연결 시마다 암호를 입력해줘야 하는데 이를 해결하기 위해서는 SSH agent에 암호를 안전하게 저장해주면 매번 입력하지 않아도 됩니다.
Github에 접속하여 해당 Configuration 메타 데이터를 관리할 레포지토리로 들어가줍니다.


위에 title과 id_ecdsa.pub 공개키의 내부 값을 붙여넣기 한 뒤 key를 생성해줍니다.

이제 Config Server에서 private key를 가지고 해당 repository에 접근이 가능합니다.
server:
port: 8888
spring:
cloud:
config:
server:
encrypt:
enabled: false
git:
default-label: main
uri: git@github.com:hyensukim/BooTakHae-Config.git
# search-paths:
ignoreLocalSshSettings: true
strictHostKeyChecking: false
hostKey: # ssh-keyscan 명령어로 확인
hostKeyAlgorithm: # ssh-keyscan 명령어로 확인
privateKey: |
-----BEGIN EC PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END EC PRIVATE KEY-----
# passphrase: # 비대칭키 생성 시 입력한 값
Config 서버가 설정 정보를 읽어올 때 암호화된 문자열을 클라이언트 서버에서 복호화할지 여부를 결정합니다. false인 경우, 클라이언트 서버에서 암호화된 문자열을 받아와서 직접 복호화합니다.
Git 관련 설정
설정 정보가 저장된 repository의 브렌치를 설정합니다.
SSH를 통해 git에 접속하기 위한 URL을 의미합니다.
⚠️주의사항
HTTP URL이 아닌 SSH 관련 URL을 가져와야 합니다.

repository에서 탐색을 시작할 경로를 설정합니다. yml 파일이 config 디렉토리 안에 있는 경우, config 라고 추가해주면 됩니다.
두 설정은 git bash에서 다음 명령어를 통해서 확인할 수 있습니다.
ssh-keyscan -t ecdsa github.com

해당 값을 복사하여 설정에 추가해주면 됩니다.
privateKey 는 ~/.ssh 디렉토리 내 id_ecdsa를 열어준 뒤 값을 복사해줍니다. 이 때, | 를 반드시 추가해줘야 합니다.
passphrase는 SSH 키 생성 시 설정한 암호를 입력해주면 됩니다.
Git 저장소에 접근 시 로컬 SSH 설정을 무시할지 여부를 결정합니다. true로 설정 시, 로컬 설정을 무시합니다.
Config Server가 Git 저장소에 접근 시 호스트 키 검사를 엄격하게할지 여부를 결정합니다. 해당 설정에서는 false로 비활성화합니다.

정상적으로 Config Server에서 Git Repository에 있는 정보를 정상적으로 불러온다는 점을 알 수 있습니다.
설정 정보를 검색 시에 다음과 같은 경로로 검색이 가능합니다.
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
보안을 높이기 위해 private Key를 암호화해줘야 합니다. 이처럼 application.yml 또는 properties 설정 파일에 있는 민감 정보를 암호화 해줄때 사용하는 대표적인 라이브러리로써 Jasypt가 있습니다.
Jasypt 라이브러리는 암호화에 대한 깊은 지식이 없더라도 최소 비용으로 암호화 기능을 제공해주도록 도와주는 Java 라이브러리 입니다.
Jasypt를 Spring에서 편하게 사용하기 위해서 jasypt-spring-boot를 사용해줍니다.
@SpringBootApplication 또는 @EnableAutoConfiguration을 사용중인 경우에 jasypt-spring-boot-starter 의존성을 추가만 해주면 됩니다.
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
반드시 다음과 같이 'test' 시에 password 값을 읽어오도록 설정해줘야 합니다.

@Configuration
public class JasyptConfig{
final sttic String SECRET = "";
final static String ALGORITHM = "";
@Bean
public StringEncryptor jasyptStringEncryptor(){
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(KEY);
config.setAlgorithm(ALGORITHM);
encryptor.setConfig(config);
return encryptor;
}
}
Jasypt 암호화/복호화 사이트
위 웹 사이트에서 암호화할 정보를 암호화 해준 뒤 다음과 같은 형태로 수정해줍니다.
private-key: ENC(7IKT80NMLZjej7a+pXs1hEKiIqZIG38FzYn8bwTIhHyk+IU3KlZhC2EDa2U+D/EMUkRhlaSMH15QyQ1A+yEf1mX5ELFOJ0AUCQ1N3zp+3uPmHNq36JJz4zlORXy8ZcHvsRErJVJjsZA/qLirwGBTObNWeDBsDWPVAcy+3cwykHBpt0IXfNgx2y+NAvoGyFHvT8Br+PeZxFRO5phNRF12n8Z9g457S/629/1axwRh61SuSi25tYzjcAE8v7fFmIWUrOlWxtUH8UmDOjU5OrTANlvLCaTF8M/Se3flHCwSxLHfcj+003lcUE0CFsiWPg5QaGkXflY2hxHIGQSDA++1aulCLTAJoQJencSbvqbxtfUyOsi0ji/TvPdDWX7Fb+xAHrZx8ZCx9DtEBOFtwqVuXVBWevnK/1tHoh/aEebbf22n+Hn53mq9n9mDv6kBwfQbi6J9OoxBUVEctt5v/rZqOXhyIzeptmS3tIzQTJRSEIGxVHWa+M+yproGcXPbQQe25Y+mG9x3CPDXf3qQltWdpJbSwKUJ19JPLZghiZrMdsfK4ipTX0zO1D0Nm5cb9LoCkfUx2XM85KxaFtNDnf9zbaZedzYqbpOhBjfHX5dfBQVWrHLQ9wbal7eAIapv0FP5CPAbZM2NF1qKpYZ11kMHdKBkMHmEyrY+jgXdH3a8huk=)
host-key: ENC(eqPbi2MQBwTauZUv4B8D5VitXMtXk49BlTYbMBPw1K1h9i3mUEgyxPugHCm2blg3IStqF6Gz/mDHA3pzQqfVTf4CyxeEWYB0D0DNpzKeBzqEhzdS9k2T+LyTuBxV9A5joETMFNncRk5D4ON7l9jVjGCK1huoKKnmAvuG0L5RfWdlnwSaI7vfd/k/XDyFvkBVncU+tkKHAS0=)
ENC() 를 붙여줌으로써, 애플리케이션 실행 시 해당 설정 정보를 읽어올 때 복호화도 함께 수행합니다.
위 과정을 통해서 application.yml 파일의 암호화를 설정해줬지만, class 내 jasypt 관련 password가 노출되어 보안성이 떨어지게 됩니다.
이를 해결하기 위해서 VM Option을 사용하여 PASSWORD를 환경 변수로 넣어줘야 합니다.
우선, 기존의 전역 변수로 정의한 static 변수를 yml 파일 내에서 관리하도록 코드를 수정해줍니다.

Run → Edit Configurations → SpringBoot → VM options
해당 화면에서 -Djasypt.encryptor.password={암호} 를 입력해줍니다.
실행해보면, 정상적으로 설정 정보를 가져오는 것을 알 수 있습니다.
이번 포스팅에서는 config server와 Github private repository 간의 연동 시 SSL 과정을 반드시 거쳐야 한다는 것에 대해서 알 수 있었습니다.
이 과정에서 처음으로 SSH 비대칭 키를 발급 받고 이를 암호화/복호화 작업을 통해 연동해보는 경험을 할 수 있었습니다.