이번에 포스팅할 내용은 SSL 적용이다. 

 

SSL은 Secure Socket Layer이라는 약자로 보안 소켓 레이어이다.

 

보통 443포트를 사용하며 https:// 를 사용한다.

 

쓰는 이유를 물어보면 보안과 SEO로 나눌 수 있다.

 

적용 시 보안적으로는 안정적인 통신을 보장해주고, SEO적으로는 구글에서 검색순위를 높게 측정한다고 한다.

 

단점으로는 SSL인증서를 발급받아 적용해야 하는데 이 인증서는 매년 갱신해주어야 하며, 공짜가 아니다. 

 

한마디로 돈이 들어간다. 

 

그리고 아주 기초적인 수준의 개발실력이 있어야 적용할 수 있다. 

 

이번에 소개할 Sectigo SSL 인증서는 비교적 저렴하게 사용할 수 있어서 사용했다.

 

수 많은 대행사이트에서 이 인증서를 사용하는데, 

 

쌀수록 설명이나 사후지원이 약하고, 비쌀수록 그런 부분이 잘 되는 정도의 차이가 있는 것 같이 보였다.

 

이 글을 보는 분들은 다 직접 결국 세팅을 하실 것이기 때문에 (그렇게 만들 것이기 때문에..) 

 

개인적으로는 싼 게 좋아보인다.

 

* secure sign 사이트가 저렴하다. 

* www.securesign.kr/

 

SSL 인증서 국내 최저가 Sectigo Comodo GeoTrust Thawte RapidSSL - SecureSign

글로벌 SSL 인증서 최저가 발급. 와일드카드, 멀티도메인. CSR 자동 생성. PEM, PFX, JKS 포맷 제공. 재발급 무제한. 서버 무제한 설치. 모바일지원. 간편인증, SecureSign, SSLCERT

www.securesign.kr

 

더 저렴한 사이트도 분명 있을 것이다. 

 

나름 덩치가 커진 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/

 

황금 밸런스 게임 - SuperBalance

황금 밸런스 게임을 직접 플레이하고 만들어보세요 ~

superbalance.co.kr

 

+ Recent posts