tomcat9 https 설정

lifeisegg·2022년 7월 14일

server settings

목록 보기
1/1
post-thumbnail

1. 목표

도메인 서비스된 웹서버를 https로 설정한다.

2. 환경

3. 방법

1) 도메인 구입

가장 먼저 구입하는 이유는 인증서를 구매 할 때 해당 도메인의 정보가 필요하기 때문이다.

  • hostingkr의 링크를 따라가서 설정하고자하는 도메인을 검색하고 구입한다.
    "lifeisegg"로 검색 한 결과. 구매 가능 유무와 비용이 명시된다.

  • 여담으로 ssl이던 도메인이던 다른 사이트에서 구입해도 과정과 결과는 비슷하니 금액과 옵션을 자신의 환경에 맞게 설정하면 된다.

2) ssl 구입

위 구매한 도메인 정보를 이용하여 신청하면 된다.

  • 부가적으로 기능에 따라 금액이 달라지는데, 가장 저렴한 라이트로 구매했다.
  • 비밀번호를 설정해야하는데 잘 기억해두도록 하자.
  • sectico = comoran 인 듯하다.

3) tomcat9와 was 준비

  • https 설정이 목표이기에 작성하지 않아요. 관련된건 추후 기술할수도..

4) ssl 인증서 변환

  • 구입한 ssl을 확인하면 비밀번호 인증후에 다운로드가 가능하다.
    인증서(ssl.crt), 인증키(ssl.key), 2)에서 입력한 비밀번호를 준비한다.
  • tomcat9에서 호환하는 형식으로 변경해야한다. jks (java keystore)
    참고 : https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html
    linux 서버 cmd에 아래와 같은 명령어를 입력한다.
openssl pkcs12 -export -in {인증서.crt} -inkey {인증키.key} -out .keystore -name {keyname}

openssl pkcs12 -export -in ssl.crt -inkey ssl.key -out .keystore -name tomcat
  • 명령어를 입력하면 비밀번호를 입력하라는 문구가 나오고, 사용을 위한 비밀번호 설정이 있다.
    인증서 비밀번호와 사용 비밀번호를 다르게하여 입력하였다.
    사용 비밀번호는 잊어버리면 다시 변환해서 만들면 된다.
ls -al
  • .keystore 파일을 확인하고 넘어가자.

5) tomcat server.xml 설정

  • 설정 방법이 아주 많다. 위에 4)인증서 변환의 tomcat9 참고에도 명시되어 있다.
    로 끝내면 좀 불친절하니까 몇 가지 방법을 정리해보았다.
    각각의 장단점은 있는데 기본 port를 사용 한 case 3을 추천한다.

  • .keystore 파일을 tomcat9 home 위치에서 conf 밑에 두었다.
    opt/tomcat/conf/ssl_manage/.keystore

  • case 1 : Http11NioProtocol

	<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
				port="{포트번호}" scheme="https"
				keystoreFile="{.keystore 경로}" 
                keystorePass="{사용 비밀번호}"
				maxThreads="100" secure="true"
				SSLEnabled="true"
                clientAuth="false" sslProtocol="TLS"
				enableLookups="true" disableUploadTimeout="true" 
                acceptCount="100"
                sslEnabledProtocols="TLSv1.2,TLSv1.1,TLSv1"
                />
	<!-- keystoreFile 위치 설정을 쉽게하려고 conf 밑에 두었다. -->
	<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
			port="8080" scheme="https"
			keystoreFile="conf/ssl_manage/.keystore" 
			keystorePass="12345678"
			maxThreads="100" secure="true"
			SSLEnabled="true"
			clientAuth="false" sslProtocol="TLS"
			enableLookups="true" disableUploadTimeout="true" 
			acceptCount="100"
			sslEnabledProtocols="TLSv1.2,TLSv1.1,TLSv1"
			/>                
  • case 2 : HTTP/1.1
        <Connector protocol="HTTP/1.1" port="{포트번호}" scheme="https"
				keystoreFile="{.keystore 경로}" 
                keystorePass="{사용 비밀번호}"
                maxThreads="200" secure="true"
                SSLEnabled="true"
                clientAuth="false" sslProtocol="TLS"
                ciphers="TLS_ECDH_RSA_WITH_AES_256_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA"
                />
  • case 3 : HTTP/1.1 & Http11NioProtocol 두개의 connector
		<Connector port="80" protocol="HTTP/1.1"
				connectionTimeout="20000"
				redirectPort="443"
				/>

		<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
					 maxThreads="150" SSLEnabled="true">
			<SSLHostConfig>
				<Certificate certificateKeystoreFile="{.keystore 경로}"
				certificateKeystorePassword="{사용 비밀번호}" type="RSA" />
			</SSLHostConfig>
		</Connector>
  • "http://127.0.0.1:80"으로 접근하면 HTTP/1.1이 받아서 redirectPort를 통해 "https://127.0.0.1:443"의 Http11NioProtocol이 받는 방식이다.
  • 기본 포트 80과 443을 사용한 이유 :
    1) url을 클린하게 다룰 수 있다.
    "http://127.0.0.1:80"과 "https://127.0.0.1:443"은 포트번호 영역이 암시적으로 변경되어 표기한다.
    둘 다 실제 화면에서는 도메인 이름(127.0.0.1)만 표기된다는 뜻이다.
    2) dns레코드 설정에 고정적으로 기본포트(80)를 사용하게끔 되어있었다.

6) 도메인 및 서버 방화벽 설정

  • 도메인 업체에 가면 dns레코드를 설정할 수 있다.

    값에는 ip를 입력하면 된다. ex) 127.0.0.1

  • 서버의 방화벽을 열어줘야 한다. 내부에서 firewalld를 통해 80과 443을 열고, 클라우드 콘솔에서 http 80, https 443을 열어주었다.

7) 확인

  • "http://127.0.0.1:80", "https://127.0.0.1:443", "도메인 이름" 으로 접근해보자.
    앞의 80과 443은 안전하지 않음 표기가 나오고 "도메인 이름" 으로 접근하니 정상동작한다.
profile
재밌게일하고 힘들게놉니다

0개의 댓글