티스토리 뷰

Spring

[Spring] Spring Cloud Config 사용 시의 주의사항 및 에러 해결 (Internal Server Error, RSA key with SHA-1)

망나니개발자 2022. 7. 4. 10:00
반응형

이번에는 Spring Cloud Config 사용 시의 주의사항 중 하나인 baseDir 설정에 대해 알아보겠습니다.

 

 

 

 

1. Spring Cloud Config 사용 시의 주의사항(baseDir 설정)


[ Spring Cloud Config Server의 동작 방식 ]

Spring Cloud Config Server는 기본적으로 파일 저장소를 클론하여 관리한다. 그래서 클라이언트가 설정 정보를 요청하면 클론받은 디렉토리의 파일들을 읽어 값을 반환한다. 별도의 설정이 없다면 클론받은 폴더는 config-repo-<randomId>의 형태로 시스템의 임시 저장소에 쓰여진다고 공식 문서에 설명되어 있다. 예를 들어 리눅스 환경이라면 /tmp/config-repo-<randomId>에 저장된다. 

 

 

 

 

 

[ 500 Internal Server Error ]

문제 상황

Spring Cloud Config Server를 운영하다보니 주기적으로 특정 시간이 지나면 500 에러가 발생하기 시작하였다.

 

 

 

로그를 살펴보니 파일을 클론받은 repo를 찾을 수 없다는 것인데, 그 원인은 OS로 사용중인 CentOS 때문이였다. 스택오버플로우에서 찾아보니 CentOS는 주기적으로 /tmp 를 지켜보고, 자동으로 청소하는 Cron이 등록되어 있다고 한다. 그래서 특정 시간이 지나도 사용되지 않는 파일 및 디렉토리들이 삭제된다는 것이다.

2022-06-30 19:17:01,090 ERROR org.apache.juli.logging.DirectJDKLog [http-nio-8888-exec-2] Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot load environment] with root cause
org.eclipse.jgit.errors.RepositoryNotFoundException: repository not found: /tmp/config-repo-5689147535204177175
        at org.eclipse.jgit.lib.BaseRepositoryBuilder.build(BaseRepositoryBuilder.java:627)
        at org.eclipse.jgit.api.Git.open(Git.java:93)
        at org.eclipse.jgit.api.Git.open(Git.java:73)
        at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository$JGitFactory.getGitByOpen(JGitEnvironmentRepository.java:782)
        at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.openGitRepository(JGitEnvironmentRepository.java:638)
        at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.createGitClient(JGitEnvironmentRepository.java:613)
        at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:296)
        at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:262)
        at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.getLocations(MultipleJGitEnvironmentRepository.java:139)
        at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:55)
        at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOneFromCandidate(MultipleJGitEnvironmentRepository.java:188)
        at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOne(MultipleJGitEnvironmentRepository.java:173)
        at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:64)
        at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61)
        at org.springframework.cloud.config.server.environment.EnvironmentController.getEnvironment(EnvironmentController.java:134)
        at org.springframework.cloud.config.server.environment.EnvironmentController.defaultLabel(EnvironmentController.java:110)

 

 

 

 

 

해결 방안 (baseDir 설정)

스프링 클라우드 공식 문서에서는 이미 이와 관련된 내용을 Warning으로 다루고 있다. 아래의 내용을 보면 OS에 따라서 주기적으로 임시 디렉토리가 삭제될 수 있으니, basedir을 설정해주라는 것이다.

 

 

즉, 설정 파일을 클론받는 위치를 직접 지정해서 임시 디렉토리에 받지 말라는 것이다. 그러므로 Config Server의 설정 파일에서 다음과 같이 baseDir을 설정해주면 문제가 해결된다. 아래에서는 프로젝트 폴더 하위의 repo 폴더에 클론받도록 해두었다.

server:
  port: 8888
spring:
  cloud:
    config:
      server:
        git:
          default-label: master
          uri: https://github.com/MangKyu/spring-cloud-config-sample
          search-paths: test-cloud-config-file/**
          basedir: ./repo

 

 

 

 

[ NoRemoteRepositoryException(You're using an RSA key with SHA-1) ]

문제 상황

Spring Cloud Config Server를 구축한 후에 다음과 같은 에러가 발생할 수 있다.

Caused by: org.eclipse.jgit.errors.NoRemoteRepositoryException: git@github.com:MangKyu/spring-cloud-config-sample.git: ERROR: You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.


        at org.eclipse.jgit.transport.TransportGitSsh.cleanNotFound(TransportGitSsh.java:201)
        at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:325)
        at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:153)
        at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:142)
        at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:94)
        at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1309)
        at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:213)

 

 

 

 

로그를 살펴보니 입력된 Key는 더이상 지원되지 않으니, 새로운 키를 발급받으라는 것이다. 해당 문제가 발생하는 이유는 22.03.15 이후로 github 에서 RSA 를 이용한 SHA-1 인증을 더 이상 지원하지 않기 때문이다. Ubuntu 역시 Ubuntu22부터 RSA-SHA1 방식을 지원하지 않는다. 따라서 보안을 위해 다른 키(ecdsa, ed25519, RSA-SHA2)를 대신 사용해주어야 한다.

 

 

 

 

해결 방안 (새로운 키 발급 및 설정)

보안을 위해 RSA-SHA1 키 대신 다른 알고리즘의 키를 발급받고 설정해주면 된다. 전체 플로우는 첫 번째 포스팅에 업데이트해두었으니, 헷갈리면 해당 포스팅을 참고해서 다시 설정해주도록 하자.

ssh-keygen -m PEM -t ecdsa -b 256
// ssh-keygen -m PEM -t rsa -b 4096 보안 취약점 때문에 GitHub SHA-1 error가 발생할 수 있음

 

 

 

 

이번에는 Spring Cloud Config를 사용하면서 주의할 점에 대해 알아보았습니다. 전체 소스 코드는 깃 허브를 참고해주세요! 추가로 혹시 피드백 주실 부분 있으면 환영하겠습니다. 감사합니다:)

 

 

 

관련 포스팅

  1. Spring Cloud Config 도입하기 및 private 레포지토리 SSL로 연결 설정 및 privateKey 암호화
  2. Spring Cloud Config 설정 파일 내용을 갱신하는 방법, Spring Cloud Bus 없이 자동 갱신하기
  3. Spring Cloud Config 사용 시의 주의사항 및 에러 해결 (Internal Server Error, RSA key with SHA-1)

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함