이번에 포스팅할 내용은 SSL 적용이다.
SSL은 Secure Socket Layer이라는 약자로 보안 소켓 레이어이다.
보통 443포트를 사용하며 https:// 를 사용한다.
쓰는 이유를 물어보면 보안과 SEO로 나눌 수 있다.
적용 시 보안적으로는 안정적인 통신을 보장해주고, SEO적으로는 구글에서 검색순위를 높게 측정한다고 한다.
단점으로는 SSL인증서를 발급받아 적용해야 하는데 이 인증서는 매년 갱신해주어야 하며, 공짜가 아니다.
한마디로 돈이 들어간다.
그리고 아주 기초적인 수준의 개발실력이 있어야 적용할 수 있다.
이번에 소개할 Sectigo SSL 인증서는 비교적 저렴하게 사용할 수 있어서 사용했다.
수 많은 대행사이트에서 이 인증서를 사용하는데,
쌀수록 설명이나 사후지원이 약하고, 비쌀수록 그런 부분이 잘 되는 정도의 차이가 있는 것 같이 보였다.
이 글을 보는 분들은 다 직접 결국 세팅을 하실 것이기 때문에 (그렇게 만들 것이기 때문에..)
개인적으로는 싼 게 좋아보인다.
* secure sign 사이트가 저렴하다.
더 저렴한 사이트도 분명 있을 것이다.
나름 덩치가 커진 supercup 사이트는 가비아에서 구매했는데, securesign사이트에 비하면 4배정도 비쌌다..
배상금 정책같은 소소한 차이가 있을 것이므로 인증서도 잘 살펴보고 사자..
* 가비아든 securesign이든 어떤 곳이든 발급기관이랑 무관하게 SSL 적용은 전체적으로 아래와 같다.
자 이제 사설은 여기까지 하고 적용하는 법을 보자~
1번째. 인증에 사용할 JKS(Java Keystore) 파일을 생성한다.
keytool -keysize 2048 -genkey -alias scup -keystore 경로/scup.jks -keyalg RSA
* scup은 개인키의 별칭이다 아무거나 입력해줘도 된다.
앞으로 쓸 비밀번호를 2번 입력한 후 첫 입력창으로 이름을 말하라고 할 때 사이트 주소를 입력해야 한다.
(http,https를 제외한 사이트 도메인만)
마지막엔 국가코드 KR을 입력하면 된다
- Country (C) : 국가코드, 대문자로 입력해야 합니다. (한국 : KR)
- State (ST) : 시/도
- Locality (L) : 구/군
- Organization (O) : 회사명
- Organization Unit (OU) : 부서명
- Common Name (CN) : 인증서 도메인 주소를 입력합니다. 와일드카드 인증서는 *.도메인을 입력합니다.
다 입력한 후 맞냐고 여쭤볼때 y로 맞다고 입력하고 비밀번호 확인 시 그냥 enter를 누르고 넘어가자.
개인적으로는 인증서 폴더를 따로 만들어서 이런식으로 명령어를 쳤다.
mkdir cert
cd cert
keytool -keysize 2048 -genkey -alias superbalance -keystore superbalance.jks -keyalg RSA
* superbalance는 개인키의 별칭이다.
2번째. csr파일을 만들자.
csr파일 내용을 가비아나 securesign사이트를 제출해야 한다.
keytool -certreq -keyalg RSA -alias superbalance -file superbalance.csr -keystore superbalance.jks
이렇게 만들어진 csr을 vi로 열어서 보던지, 파일질라로 notepad++이나, 메모장으로 열어서 보면
-----BEGIN NEW CERTIFICATE REQUEST-----
******
***
**
**
**
-----END NEW CERTIFICATE REQUEST-----
이런식으로 적혀있다. 안에 내용은 *로 대체했다.
주석까지 싹 긁어서 제출을 하면 된다.
* 제출 시 인증방법을 메일로 하자. 나머지 방법으로는 안해봐서 모르겠다 !!
3번째. 인증을 하자
그렇게 SSL 인증서를 신청하면 sectigo에서 인증 메일이 온다. (물론 신청 시 결제도 해야된다.. 유료예요)
* 인증 메일이 오는 데 시간이 좀 걸릴 수 있다. (securesign은 3분 안, 가비아는 40분정도 걸렸다.)
메일 중앙에 있는 인증코드를 복사한 후 here버튼을 누른 뒤 복사한 인증코드를 입력하면 인증이 된다.
4번째. 인증서 파일을 다운로드하고 import하자
그 후 발행 사이트(가비아 등등)에서 내 정보를 확인하면 인증서 파일을 받을 수 있다.
(* 이건 거의 바로 된다. 지체되면 2-3분 정도는 걸릴 수도 있다.)
인증서 파일 구성은 이렇다.
----------------------
Root인증서
Chain1번 인증서
Chain2번 인증서
SSL 인증서
----------------------
깨알같이 Root+Chain1번+Chain2번 이렇게 합쳐진 인증서를 줘서 한 번만 import하도록 해주던데
그냥 정석으로 각 파일마다 import하자. 맘 편한 게 정석이니까..
SSL 인증서는 거의 확장자가 pem이고 나머지 인증서는 crt이거나 pem이었다.
루트 - 체인 1 - 체인 2 - SSL 인증서 순으로 jks파일에 import해주자
체인 3번이 있으면 SSL 인증서 전에 체인 3번도 넣어주자.
keytool -import -alias root -keystore superbalance.jks -trustcacerts -file AAACertificateServicesRoot.crt.pem
keytool -import -alias chain1 -keystore superbalance.jks -trustcacerts -file USERTrustRSACertificationAuthorityChain1.crt.pem
keytool -import -alias chain2 -keystore superbalance.jks -trustcacerts -file SectigoRSADomainValidationChain2.crt.pem
keytool -import -alias superbalance -keystore superbalance.jks -file superbalance.co.kr_20201209L4Z7.crt.pem
위의 예제는 루트 - 체인 1 - 체인 2 - SSL 인증서 순으로 jks파일에 import한 것이다.
루트 인증서를 import할 때 이미 있다는 식으로 뜨는데 그냥 y 누르고 넘어가면 된다.
자 이제 SSL인증서가 import된 jks파일은 준비가 되었다.
5번째. Tomcat 셋팅
돈도 들여가며 어렵사리 준비한 jks파일을 톰캣에 셋팅하자.
클라우드 서비스를 쓰시는 분들은 (AWS, GCP, AZURE) SSL용으로 쓸 443포트를 미리 열어두자.
tomcat이 설치된 디렉토리로 들어가서 conf폴더에 server.xml을 열자
HTTPS 프로토콜을 사용하기 위해 Connector 설정을 해주자.
<Connector
URIEncoding="UTF-8"
compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/javascript"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443" SSLEnabled="true" maxThreads="200"
scheme="https" secure="true"
keystoreFile="$경로/$파일명.jks"
keystorePass="$비밀번호" clientAuth="false"
sslProtocol="TLS" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="443" URIEncoding="UTF-8"/>
$경로, $파일명, $비밀번호에 본인이 셋팅한 값을 넣자 ~
이렇게 톰캣을 내렸다 올리면, https가 적용이 된다.
물론 http도 된다.
http로 접근하면 https로 바뀌게 프로젝트 셋팅을 바꿔보자 ~
6번째. 프로젝트 셋팅(spring)
6-1)web.xml을 수정하자!
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
..
..
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/spring/security-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
..
..
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL Forward</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</web-app>
HTTPS로 붙도록 수정해주자.
그리고 security-config.xml을 참조하도록 수정!
maven이나 gradlel로 spring security쪽을 가져오자~
security-config.xml쪽도 수정하자.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<http auto-config="true" use-expressions="true" create-session="never">
<intercept-url pattern="/**" requires-channel="https" access="permitAll" />
...
...
</beans:beans>
이러면 모두 끝났다 ~
사이트에 접근했을 때 상단에 자물쇠 마크가 정상적으로 보이면 성공!
superbalance.co.kr/
'개발' 카테고리의 다른 글
jsp html js 한글깨짐 이슈 (0) | 2022.09.30 |
---|---|
[JAVA] Spring @Transactional 사용시 주의사항 (0) | 2021.06.29 |
애드센스 VS 애드핏 VS 애드포스트 비교 (feat.머니머신) (0) | 2020.06.22 |
무료 이미지 호스팅 사이트 추천 - [imgbb] (7) | 2020.06.05 |
HTML, JS 소스 코드 자동정렬 사이트 (0) | 2020.03.10 |