ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring + SSL 적용 (HTTPS)
    IT, 프로그래밍/Spring 2018. 7. 18. 21:20

    이번 프로젝트에 Facebook 로그인을 구현하던 중에, 리다이렉트 받을 URL의 스킴이 반드시 HTTPS 인 Facebook의 정책때문에 아파치톰캣 서버에 SSL 인증서를 적용하였습니다.


    만약 SSL 인증서와 HTTPS에 관한 설명이 필요하면, 생활 코딩에서 알아보시면 됩니다. 굉장히 쉽고 친절하게 설명되어 있습니다.



    과정은 간단합니다.



    1. cmd창을 관리자 모드로 엽니다. 그리고 JDK 설치 폴더 안의 bin으로 이동합니다. 저희는 이 안에 있는 keytool 이라는 실행파일을 사용해서 인증서를 만들겁니다.


    1
    C:\Users\user>cd C:\Program Files\Java\jdk1.8.0_121\bin
    cs

    2. 이동했으면 keytool을 실행하는 명령을 실행합니다.




    keytool -genkey -alias [ keystore 별칭 ] -keyalg RSA -keystore [ key file 이름 ]




    1
    C:\Program Files\Java\jdk1.8.0_121\bin>keytool -genkey -alias test -keyalg RSA -keystore test
    cs


    여기서는 별칭과 키파일 이름을 'test'로 설정하였습니다.


    3. 명령이 실행되면 키 스토어를 생성합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    키 저장소 비밀번호 입력:
    새 비밀번호 다시 입력:
    이름과 성을 입력하십시오.
      [Unknown]:  localhost
    조직 단위 이름을 입력하십시오.
      [Unknown]:  home
    조직 이름을 입력하십시오.
      [Unknown]:  home
    구/군/시 이름을 입력하십시오?
      [Unknown]:  seoul
    시/도 이름을 입력하십시오.
      [Unknown]:  seoul
    이 조직의 두 자리 국가 코드를 입력하십시오.
      [Unknown]:  KR
    CN=localhost, OU=home, O=home, L=seoul, ST=seoul, C=KR이(가) 맞습니까?
      [아니오]:  y
     
    <test>에 대한 키 비밀번호를 입력하십시오.
            (키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):
    cs


    한국의 경우는 국가코드가 KR 입니다.


    만약 저장이 실패했다는 내용이 뜨면 관리자 모드로 다시 접속해 주세요.


    4. 생성한 키를 바탕으로 인증서 파일을 생성합니다.



    keytool -certreq -alias [별칭] -keyalg rsa -file [파일 이름] -keystore [Keystore 파일 이름]




    1
    2
    C:\Program Files\Java\jdk1.8.0_121\bin>keytool -certreq -alias test -keyalg rsa -file certtest -keystore test
    키 저장소 비밀번호 입력:
    cs


    아까 지정했던 키 스토어의 비밀번호를 입력하면, certtest 파일에 인증서가 생성됩니다.


    만약 certtest를 certtest.txt로 지정해 명령을 실행하면 텍스트파일로 열어서 내용을 볼 수 있습니다.



    -----BEGIN NEW CERTIFICATE REQUEST-----

    MIIC1DCCAbwCAQAwXzELMAkGA1UEBhMCS1IxDjAMBgNVBAgTBWJ1c2FuMQ4wDAYD

    VQQHEwVidXNhbjENMAsGA1UEChMEaG9tZTENMAsGA1UECxMEaG9tZTESMBAGA1UE

    AxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0jJF

    ahFFQ0ko6mYgsFt/vwraPOmyv3bnL4RQapYP7fTZcYoXs5JBDxJt0nOHZs/lacBi

    uJWK0K+6iN42FmTTtjt7aBDnMaI07JHmz4rFXRxF1QpbrMFiFjpJSsMiHpjjtfR/

    R3VOMYUpuvK4MsZ+tm1rO5lUrTCHSF/YmOwyRy6D2NXvihSGQM3iU/qIEKhbB93A

    h4juuDkMZzxxggNmTYI8Fq0jHY0s2WOVmpevSxTQJBTahAt8SUZqEWdOLaiLcmcM

    llhQ6Pmp9wQ2szxQNTNUSHIG1nVkQYQdTkD30q3ZfORklPe8su52aHqUovXBDyUT

    gdqjd96566XM2wDGowIDAQABoDAwLgYJKoZIhvcNAQkOMSEwHzAdBgNVHQ4EFgQU

    4YJd5dUMCvPiVoz3FIR0aIr8sLkwDQYJKoZIhvcNAQELBQADggEBAABrhAOnVOd5

    EruhqscFG3Z/Yx5PV/ZH4cOkNVn5PxA0HUWq9T+8k4H8UNnwQ3JdJv6ep6qDoXFe

    l5xm4UtakEo4X1yjqucrVmdvGXUFIuxseTVf4uiP6op9Ncar1h9j7ftUI44ebCMl

    XcLlujDvmx2e1aLjLXeuOppt2G/WvMV2CnbTLkZ/v1wQrCcOtBkdlDR5wOR4dXkk

    csiFDQkNq/ONTOr97HYx+/5Xd/6mpM+kqE4go4RQCFUlwcaZXKQBVmaskwCPrl4J

    ZcIT5Er43h7ZMPIz4C+nYCzgImkBmXsBiOmFSjnHRJNdG/w/F73Gf9pmz/ISzGVr

    8BQjJnt5H7s=

    -----END NEW CERTIFICATE REQUEST-----




    5. 톰캣 설치경로/conf/ 로 이동합니다.


    C:\Program Files\Apache Software Foundation\Tomcat 9.0\conf


    그리고 관리자 권한으로 server.xml을 실행합니다.


    주석 처리 되어있는 부분을 풀어주고 아래처럼 작성합니다.


    1
    2
    3
    4
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
                maxThreads="150" SSLEnabled="true" keystoreFile="키스토어 경로" 
            keystorePass="키스토어 비번" scheme="https" secure="true"  clientAuth="false" sslProtocol="TLS"  />
     
    cs



    6. C:\Program Files\Apache Software Foundation\Tomcat 9.0\bin\startup.bat 으로 톰캣 서버를 실행시킵니다. 


    https://localhost:8443 으로 접속 해 봅니다. 만약 '신뢰 할 수 없는..' 이런 내용이 뜨면 무시하고 넘어가면 톰캣 페이지가 뜹니다. 크롬의 경우 고급으로 가서 넘어가면 됩니다.




    7. 이클립스에 server 설정으로 가서 Ports에 SSL 포트가 등록되었는지 확인합니다. 만약 시간이 지나도 뜨지 않으면 서버를 새로 하나 만들어서 확인 해 보시는 걸 추천합니다.




    8. 스프링 시큐리티를 설정합니다. 만약 pom.xml에 의존성이 설정되어 있지 않으면 설정합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
            <!-- Spring Security -->
     
            <dependency>
     
                <groupId>org.springframework.security</groupId>
     
                <artifactId>spring-security-web</artifactId>
     
                <version>3.2.8.RELEASE</version>
     
            </dependency>
     
            <dependency>
     
                <groupId>org.springframework.security</groupId>
     
                <artifactId>spring-security-config</artifactId>
     
                <version>3.2.8.RELEASE</version>
     
            </dependency>
     
    cs


    9. webapp\spring 아래에 security-context.xml을 작성합니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?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"
        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 auto-config='true' use-expressions="true">
     
            <intercept-url pattern="/" requires-channel="https" access="permitAll" />
     
            <!-- enable csrf protection -->
     
            <csrf />
     
        </http>
     
     
        <authentication-manager>
            <!-- <authentication-provider>
                <user-service>
                    <user name="master" password="kim1234" authorities="ROLE_USER" />
                </user-service>
            </authentication-provider> -->
        </authentication-manager>
     
     
     
     
     
    </beans:beans>
     
     
     
    cs


    시큐리티 관련 내용은 차후에 추가하겠습니다.



    10. web.xml에 필터를 추가합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
        <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>
     
     
        <security-constraint>
     
            <web-resource-collection>
     
                <web-resource-name>my-secure-app</web-resource-name>
     
                <url-pattern>/*</url-pattern>
     
            </web-resource-collection>
     
            
     
            <user-data-constraint>
     
                <transport-guarantee>CONFIDENTIAL</transport-guarantee>
     
            </user-data-constraint>
     
        </security-constraint>
    cs

    11. 톰캣을 구동시키고 localhost로 접속을 해봅니다. 아까같이 인증서 관련 화면이 나오거나 상단탭에 빨간 자물쇠가 나옵니다.



    다음편에는 이 SSL을 기반으로 페이스북 로그인 기능을 구현 해 보겠습니다.



    참조 블로그 : 


    http://glqdlt.tistory.com/332


    http://visu4l.tistory.com/419 


Designed by Tistory.