카테고리 없음
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에서 인증서를 추출하는 명령어
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 입력
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 서버가 잘 올라가는지 확인
- 로그 확인
- 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를 적용
}
}