카테고리 없음

SSL 인증서 생성 & SSL 서버 (https)올리기: 로컬 테스트 용

S2채닝S2 2023. 4. 6. 11:28

SSL 인증서 생성

  • keytool 도구를 이용해 임의로 SSL 인증서 생성
    • keytool은 java 설치경로 bin 디렉토리 아래에 위치
    • 실제 서비스에 사용 X, 로컬 테스트 용도

 

keystore 만들기

  • 아래의 명령어 입력: keystore를 생성하는 명령어
keytool -genkey -alias [keystore 별칭] -keyalg RSA -storetype PKCS12 -keystore [keystore 파일]
  • 설정 입력
    • 비밀번호/확인
    • 이름과 성: localhost
    • 조직단위 이름: 임의
    • 조직 이름: 임의
    • 구/군/시: 
    • 시/도
    • 국가코드(2자리): KR

keystore 생성 예시 화면

 

keystore 에서 인증서 추출하기

  • 아래의 명령어 입력: keystore에서 인증서를 추출하는 명령어
keytool -export -alias [keystore 별칭] -keystore [keystore 파일] -rfc -file [인증서 파일]
  • 비밀번호를 입력한 후 enter를 누르면 인증서가 만들어진다.

인증서 추출 예시 화면

 

trust-store 만들기

  • 아래의 명령어 입력: trust-store를 생성하는 명령어
keytool -import -alias [trust keystore 별칭] -file [인증서 파일] -keystore [trust keystore 파일]
  • trust-store에서 사용할 비밀번호를 입력
  • Trust this certificate: y 입력

trust-stor 생성 예시

 

 

SSL 인증 서버 - Spring boot 

  • keystore 파일과 truststore 파일을 프로젝트 경로에 복사하면 SSL 인증서를 적용해서 서버를 띄울 수 있다
  • keystore, trust-store 파일을 main/resources 경로 아래에 붙여넣는다.

  • application.yml 설정
    • port: 443 (https 서버 포트)
    • key-alias: [keystore 별칭]
    • key-store: keystore 파일 경로 classpath:keystore.p12
    • key-store-password: keystore 비밀번호 
    • key-password: keystore 비밀번호
    • trust-store: truststore 파일경로 classpath:truststore.p12
    • trust-store-password: truststore 비밀번호

 

SSL 서버 띄워보기

설정이 끝났으면 서버를 띄워 ssl 서버가 잘 올라가는지 확인

  • 로그 확인

443 포트, https 서버

  • https://localhost:443 접근
    • 브라우저에 https://localhost:443을 입력한 후 접근하면 아래와 같은 확인 페이지가 뜬다.
    • 신뢰할 수 있는 기관에서 발급받은 정식 인증서가 아니라, 로컬에서 만든 임의의 인증서이기 때문.

접근 확인 메세지

  • 고급 버튼을 클릭하고 https://localhost:443으로 이동하면 https 서버로 접근된 것을 확인할 수 있다.
    • 마찬가지로 정상적인 SSL 인증서가 아니기 때문에 브라우저에서 인증서(로컬에서 생성한 SSL 인증서)를 신뢰할 수 없다는 경고 메세지를 확인할 수 있다.

 

 

 

이 SSL 인증서 적용 방식은 어디까지나 로컬에서 적용할 수 있는 것이지,

실제 서버를 생성할 때 이 방식을 사용하면 안된다.

 

Spring security 설정

  • 모든 요청은 secure channel을 요구한다. 즉, https로 서비스 해야 한다는 것을 설정
@Configuraion
@EnableWebSecurity
public class WebSecurityConfigure extends WebSecurityConfigurerAdabter {
	
    @Override
    protected void configure(HttpSecurity http) throws Exception{
    	http
          .requiresChannel()
            .anyRequest().requiresSecure(); //모든 request는 secure channel을 요구한다
            //또는 url pattern을 줄 수도 있음 ↓
            .antMachers("/api/**").requiresSecure(); // /api 하위 모든 url에 https를 적용
    }
}