티스토리 뷰

출처: https://offbyone.tistory.com/275 [쉬고 싶은 개발자]

 

사이트에 SSL을 적용하려면 인증기관으로부터 인증서를 발급받아 웹서버에 설치해야 합니다. 개발용으로 자신이 인증기관이 되어 인증서를 발급하여 Tomcat에 적용하는 방법을 알아봅니다.

 

 

1. openssl 설치하기

 

키와 인증서를 만들기 위해서 openssl을 설치합니다. 다음 사이트에서 자신의 PC에 맞는 파일을 다운 받습니다. 이 글에서는 윈도우에서 테스트하므로 openssl-0.9.8k_X64.zip 파일 다운로드 받았습니다.

 

https://code.google.com/archive/p/openssl-for-windows/downloads

 

다운 받은 파일은 압축을 풀어서 적당한곳에 복사해두면 됩니다. 여기에서는  D:\util\openssl-0.9.8k_X64 에 설치하였습니다. D:\util\openssl-0.9.8k_X64\bin 폴더 PATH 에 추가하면 편리하게 사용할 수 있습니다.

 

 

2. 인증기관(CA, Certificate Authority)

 

공인인증기관이 아닌 내가 인증기관처럼 작업을 해야 하므로 인증기관용 개인키를 먼저 만들고, 웹브라우저에 설치될 루트 인증서도 만듭니다. 공인인증기관의 루트 인증서와 중간 인증서는 이미 웹브라우저에 설치되어 있으므로 바로 인증이 되는 것입니다.

 

openssl 명령을 실행하기 위해서 명령창을 관리자 권한으로 실행합니다. 관리자 권한이 아니면 unable to write 'random state' 오류가 발생할 수 있습니다.

 

 

2.1. CA가 사용할 RSA  key 쌍(public, private key)을 만들기

 

2048bit 개인키를 생성하는데, 분실에 대비해서 AES256으로 암호화 합니다. 그러므로 암호를 잊어버리면 개인키를 사용할 수 없게 됩니다. 암호화 하지 않으려면 -aes256 옵션을 빼고 만들면 됩니다. 여기서는 D:\cert 폴더를 만들고 그곳에서 작업을 합니다.

 

D:\cert>openssl genrsa -aes256 -out rootca_private.key 2048

 

 

 

테스트용 이므로 암호는 적당히 넣으면 되겠습니다. 잊어 먹으면 진행이 안되니 잘 적어두기 바랍니다. D:\cert\rootca_private.key 파일이 생성되었습니다.

 

 

※ 참고 : 개인키로 공개키를 직접 만드는 방법 입니다.

D:\cert>openssl rsa -in rootca_private.key -out rootca_public_key.pem -pubout

 

 

 

2.2. 인증서 요청 파일 (.csr) 만들기

 

인증서를 발급받기 위해서는 나의 공개키와 도메인 정보를 담은 .csr 파일을 만들어서 인증기관에 보내게 되는데, 여기서는 내가 인증기관이 되어 인증서를 발급하여야 하므로 인증기관의 공개키를 나의 개인키로 서명하여 만들게 됩니다.

 

D:\cert>openssl req -new -key rootca_private.key -out rootca.csr -config D:\util\openssl-0.9.8k_X64\openssl.cnf

 

 

 

- Enter pass phrase for rootca_private.key: 에는 개인키 비밀번호를 입력합니다.

- A challenge password[]: 와 An optional company name []: 은 엔터만 치고 넘어갑니다.

- rootca.csr 파일이 만들어졌습니다.

 

 

2.3. 10년짜리 self-signed 인증서 만들기

 

내가 인증기관이므로 .csr 파일을 나의 인증기관 개인키로 서명합니다. X.509 버전 3 인증서를 만듭니다.

 

D:\cert>openssl x509 -req -days 3650 -extensions v3_ca -set_serial 1 -in rootca.csr -signkey rootca_private.key -out rootca.crt

 

 

 

- Enter pass phrase for rootca_privatge.key: 에는 인증기관 개인키 비밀번호를 입력합니다.

- rootca.crt 파일이 생성되었습니다. 이것이 루트 인증서 입니다.

- 다음 명령으로 인증서 내용을 확인할 수 있습니다.

  D:\cert>openssl x509 -text -in rootca.crt

 

 

 

- 인증기관의 공개키가 포함된 인증서를 확인할 수 있습니다.

 

 

3. 웹서버를 위한 인증서를 생성합니다.

 

위에서 인증기관에 필요한 것들이 준비가 되었습니다. 이제 웹서버에 필요한 키와 인증서를 생성합니다. 생성 방법은 위에서 작업한 것과 거의 비슷한 과정을 거치게 됩니다.

 

 

3.1 웹서버를 위한 개인키 만들기

 

D:\cert>openssl genrsa -aes256 -out localhost_private.key 2048

 

 

 

- 개인키 비밀번호는 잊어먹지 않도록 주의합니다.

- localhost_private.key 파일이 생성되었습니다.

 

 

3.2. 인증서 요청파일(.csr) 만들기

 

인증서 발급을 위한 .csr 파일을 생성합니다.

 

D:\cert>openssl req -new -key localhost_private.key -out localhost.csr -config D:\util\openssl-0.9.8k_X64\openssl.cnf

 

 

 

- Enter pass phrase for localhost_private.key: 에는 개인키 비밀번호를 입력합니다.

- Common Name(eg, YOUR name) []: 에는 도메인명 또는 hostname을 입력합니다.

- A challenge password[]: 와 An optional company name []: 은 엔터만 치고 넘어갑니다.

- localhost.csr 파일이 만들어졌습니다.

 

 

3.3. 5년짜리 localhost용 SSL 인증서 발급하기(CA 개인키로 서명)

 

D:\cert>openssl x509 -req -days 1825 -extensions v3_user -in localhost.csr -CA rootca.crt -CAcreateserial -CAkey rootca_private.key -out localhost.crt

 

 

 

- Enter pass phrase for rootca_privatge.key: 에는 인증기관 개인키 비밀번호를 입력합니다.

- localhost.crt 파일이 생성되었습니다. 이것이 웹서버용 인증서 입니다.

 

 

4. Tomcat용 인증서 파일 생성

 

인증서와 웹서버용 개인키를 이용해서 Tomcat용 keystore를 생성합니다.

 

D:\cert>openssl pkcs12 -export -in localhost.crt -inkey localhost_private.key -out keystore -name "localhost cert"

 

 

 

- (-name) 옵션은 keystore의 alias 가 됩니다.

- Enter pass phrase for localhost_private.key: 에 웹서버용 개인키 비밀번호를 입력합니다.

- Enter Export Password: 에는 키스토어 비밀번호를 입력합니다.

- Verifying - Enter Export Password: 에는 키스토어 비밀번호를 입력합니다.

- keystore 파일이 만들어 졌습니다.

 

** keystore를 만들면서 다음과 같은 에러가 발생했다.

>openssl pkcs12 -export -in localhost.crt -inkey localhost_private.key -out keystore -name "localhost cert"
Loading 'screen' into random state - done
27840:error:02001002:system library:fopen:No such file or directory:.\crypto\bio\bss_file.c:356:fopen('rootca.srl','rb')
27840:error:20074002:BIO routines:FILE_CTRL:system lib:.\crypto\bio\bss_file.c:358:
Enter pass phrase for localhost_private.key: 

openssl.cnf 파일을  key들이 있는 디렉토리에 복사 후 재 실행하니 잘 되었다.

localhost_private.key부터 다시 만들긴 했지만..

 

5. Tomcat 설정

 

server.xml 파일이 https 설정을 추가하고, 실행합니다.

 

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"

           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

           keystoreFile="D:/cert/keystore" keystorePass="keystorepwd"

           clientAuth="false" sslProtocol="TLS" />

 

 

 

 

6. 웹 브라우저로 https://localhost:8443/pentode 를 호출한 결과 입니다.

 

 

 

웹서버로 부터 받은 인증서를 보증 해줄 인증기관의 인증서가 웹브라우저에는 없으므로 신뢰할 수 없다고 나옵니다. 추가정보를 클릭하고 억지로 실행할 수 있습니다.

 

 

7. 사설 root 인증서 설치하기

 

- IE 웹 브라우저에서  도구 -> 인터넷 옵션 -> 내용 -> 인증서를 클릭합니다.

- 신뢰할 수 있는 루트 인증기관 탭에서 "가져오기" 를 실행하여 앞에서 만든 rootca.crt 를 가져옵니다.

 

 

 

- 웹브라우저로 요청하면 에러 없이 페이지가 열립니다.

 

 

 

이것으로 개발, 테스트용으로 Tomcat 에 사설 인증서를 설치하는 방법을 알아보았습니다.



----------------------------------------

참고 용어 설명

출처 : https://www.lesstif.com/system-admin/openssl-root-ca-ssl-6979614.html

Self Signed Certificate(SSC)란 ?

인증서(digital certificate)는 개인키 소유자의 공개키(public key)에 인증기관의 개인키로 전자서명한 데이타다. 모든 인증서는 발급기관(CA) 이 있어야 하나 최상위에 있는 인증기관(root ca)은 서명해줄 상위 인증기관이 없으므로 root ca의 개인키로 스스로의 인증서에 서명하여 최상위 인증기관 인증서를 만든다. 이렇게 스스로 서명한 ROOT CA 인증서를 Self Signed Certificate 라고 부른다.

IE, FireFox, Chrome 등의 Web Browser 제작사는 VeriSign 이나 comodo 같은 유명 ROOT CA 들의 인증서를 신뢰하는 CA로 미리 등록해 놓으므로 저런 기관에서 발급된 SSL 인증서를 사용해야 browser 에서는 해당 SSL 인증서를 신뢰할수 있는데

OpenSSL 로 만든 ROOT CA와 SSL 인증서는 Browser가 모르는 기관이 발급한 인증서이므로 보안 경고를 발생시킬 것이나 테스트 사용에는 지장이 없다.

ROOT CA 인증서를 Browser에 추가하여 보안 경고를 발생시키지 않으려면 Browser 에 SSL 인증서 발급기관 추가하기 를 참고하자.

 

CSR(Certificate Signing Request)은?

공개키 기반(PKI)은 private key(개인키)와 public key(공개키)로 이루어져 있다. 인증서라고 하는 것은 내 공개키가 맞다고 인증기관(CA)이 전자서명하여 주는 것이며 나와 보안 통신을 하려는 당사자는 내 인증서를 구해서 그 안에 있는 공개키를 이용하여 보안 통신을 할 수 있다.

CSR 은 인증기관에 인증서 발급 요청을 하는 특별한 ASN.1 형식의 파일이며(PKCS#10 - RFC2986)  그 안에는 내 공개키 정보와 사용하는 알고리즘 정보등이 들어 있다. 개인키는 외부에 유출되면 안 되므로 저런 특별한 형식의 파일을 만들어서 인증기관에 전달하여 인증서를 발급 받는다.

SSL 인증서 발급시 CSR 생성은 Web Server 에서 이루어지는데 Web Server 마다 방식이 상이하여 사용자들이 CSR 생성등을 어려워하니 인증서 발급 대행 기관에서 개인키까지 생성해서 보내주고는 한다.

 

---------------------------------------

IP에 대한 SSL Self-signed Certificate 생성

참조 : https://ssup2.github.io/record/SSL_Self-signed_Certificate_%EC%83%9D%EC%84%B1/

 

참조사이트에서 알려주는 바와 같이

csr(인증요청서) 만들 때 Common Name : 192.168.1.xxx 요렇게 ip주소를 입력한다.

v3.ext는 적용하지 않았다.

windows tomcat에서 https://ip주소:8443 으로 접근했을 때 안되는 현상으로 3일 고생..
https://localhost:8443 으로는 잘되었다.
외부에서 8443port로 접근할 수 있도록 방화벽을 열고

 

server.xml 설정할 때 address="0.0.0.0"을 추가해 주면 된다~~

   <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" address="0.0.0.0"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               keystoreFile="c:/cert/keystore" keystorePass="unifmsse"
               clientAuth="false" sslProtocol="TLS">

 

 

<!-- 2020.07.27 http로 들어온 request를 https로 redirect 시키기 -->
<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>

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함