CS

[SSL]HTTPS 통신을 위한 SSL인증서 생성

뱅타 2021. 5. 22. 00:15

SSL?

  • Secure Socket Layer
  • 웹 서버와 브라우저 간의 보안을 위해 만들어짐.
  • 대칭키를 이용, 암호화 통신(Http → Https)
  • 암호화 통신을 하기 위해 ssl 인증서가 존재함.

참고

https://www.verisign.com/en_US/website-presence/online/ssl-certificates/index.xhtml?loc=en_US

https://ko.wikipedia.org/wiki/OpenSSL

 

인증서를 이용한 통신 과정

클라이언트가 서버에 접속하면 서버는 클라이언트에게 인증서를 전달한다.
2. 클라이언트는 인증서에 대한 신뢰 검증 후 인증서에 포함된 서버의 공개키를 추출한다.
3. 클라이언트가 세션키로 사용할 임의의 메시지를 서버의 공개키로 암호화하여 서버에 전송한다.
4. 서버는 자신의 개인키로 세션키를 복호화하여 그 키를 사용해 대칭키 암호방식으로 메시지를 암호
화하여 클라이언트와 통신하게 된다

인증서 발급

  • SSL 적용 서비스를 위해 공인된 CA 로부터 인증서가 필요한데, 여기에는 일정 비용과 절차가 필요하다. 인증서를 발급받는 방법에 따라 다음과 같은 종류의 인증서들이 사용될 수 있다
  1. 유료 인증 기관을 이용한 인증서 발급 : 공인된 CA(Comodo, DigitCert, GlobalSign)에 비용을 지불하고 받은 인증서 모듈(.cnf) 과 CA 인증 파일 등을 서버에 설치하여 인증서를 사용한다.
  2. 무료 인증 기관을 이용한 인증서 발급 : 무료 CA(letsencrypt)에서 도메인 단위의 간단한 인증 절차를 통해 인증서를 이용할 수 있다. 이러한 경우, letsencrypt 는 각 시스템에 기본 설치된 루트CA 들과의 cross singing 을 통해 서명한 인증서를 발급하게 된다.
  3. 자가서명(Self-Signed) 사설 인증서 : OpenSSL에 CA 툴을 이용해 Root CA 를 생성하고, 이 CA 를 이용해 자가서명된 사설 인증서를 발급한 후 생성된 Root CA 를 클라이언트에 직접 설치한다.

1. OpenSSL 설치 (http://slproweb.com/products/Win32OpenSSL.html 윈도우 설치 파일 제공)

mac은 기본적으로 openssl이 설치되어 있다는 군요!! search했을 때 나와서 제가 따로 설치한줄 알았네요ㅎㅎ

$brew install openssl

2. 인증서 생성하기(Root CA 인증서 생성)

openssl genrsa -aes256 -out rootca_private.key 2048
// csr(Certificate Signing Requests) 파일 설정
openssl req -new -key rootca_private.key -out tootca.csr -config {openssl.cnf경로}
// 생성된 인증서 요청 파일 확인
openssl req -in rootca.csr -noout -text
// RootCA 인증서 생성
openssl x509 -req -days 3650 -set_serial 1 -in rootca.csr -signkey rootca_private.key -out rootca.crt -extenstions v3_ca
openssl x509 -text -in rootca.crt

3. 자가 서명된 CA 로 발급할 로컬 서버(톰캣)의 인증서 생성

cd \usr\local\Cellar\openssl@1.1\1.1.1k\local_cert

openssl genrsa -aes256 -out localhost_private.key 4096
openssl req -new -key localhost_private.key -out localhost.csr -config /private/etc/ssl/openssl.cnf
openssl x509 -req -days 1825 -in localhost.csr -out localhost.crt -CA ../rootCA/rootca.crt -CAcreateserial -CAkey ../rootCA/rootca_private.key -extensions v3_req -extfile /private/etc/ssl/openssl.cnf
openssl pkcs12 -export -in localhost.crt -inkey localhost_private.key -aes256 -out keystore -name "tomcat cert" -CAfile ../rootCA/rootca.crt -caname root -chain

*1.1.1k\local_cert 폴더는 제가 직접 만든 폴더입니다.

*localhost_private.key는 생성하고자 하는 key 이름을 적으시면 됩니다.

*localhost.csr, localhost.crt 둘 역시 원하시는 이름을 작성하시면 됩니다.

*/private/etc/ssl/openssl.cnf 처럼 openssl.cnf 경로의 경우 아래 코드로 알 수 있습니다.

$ openssl version -d

명령어들을 치다보면 아래와 같이 지역 등을 입력하거나 비밀번호 입력을 요구할 때가 있습니다. 크게 어려운 영어는 아니기 때문에 잘 입력하면 됩니다.

 

생성이 모두 완료 되었다면 아래와 같은 파일들이 생성됩니다.

keychain에 둘 다 등록합니다.

그 후 두 인증서 모두 Trust → Always trust로 변경합니다.

이제 Tomcat에 등록하합니다.

Tomcat의 server.xml 파일에 추가하기(로컬 서버에 https 설정)

<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443" useBodyEncodingForURI="true"/>
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="D:/B_Util/10.openSSL/local_cert/keystore"
            keystorePass="java" keystoreType="pkcs12" maxThreads="150" port="443"
            protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>

Tomcat의 web.xml 파일에 추가하기(http로 접속 시 https 로 리다이렉션 설정)

<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>

secure에 체크가 되어있지 않다면 체크해 주면 됩니다.

모든 과정이 끝났다면

이 두 화면을 볼 수 있을 겁니다.

경험(이후로는 제 개인적인 경험을 작성한 것이므로 굳이 읽지 않으셔도 됩니다)

이 이후로는 제가 ssl 하면서 겪은 경험들이 적혀져 있습니다.


그 후 설치된 경로로 이동합니다. 저 같은 경우

여기에 저장되어 있네요. bin으로 이동 후

$openssl md5 * > rand.dat
$openssl genrsa -des3 1024 > key.pem

명령어로 인증서 설치에 필요한 파일들을 생성합니다.

 

이후 CSR 파일을 생성합니다. (Certificate Signing Request)

CSR은 인증서 발급을 위한 필요한 정보를 담고 있는 인증서 신청 형식 데이터입니다.

openssl req -new -key key.pem > csr.pem

 

이후 인증서 파일을 생성합니다.

$openssl req -key key.pem -x509 -nodes -sha1 -days 365 -in csr.pem -out crt.pem

 

위에 입력한 비밀번호를 입력하면 됩니다.

ssl 적용에 필요한 OpenSSL 인증서 생성은 완료했으며, Tomcat에 적용하기 위해 PKCS12 포맷의 키 저장소 파일을 생성합니다.

$openssl pkcs12 -export -in crt.pem -inkey key.pem -out .keystore -name tomcat

.keystore 파일이 잘 생성되어있는지 확인.

이제 Tomcat 의 설정을 변경해 줍니다.

Tomcat의 server.xml 파일에 추가하기(로컬 서버에 https 설정)

<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443" useBodyEncodingForURI="true"/>
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="D:/B_Util/10.openSSL/local_cert/keystore"
            keystorePass="java" keystoreType="pkcs12" maxThreads="150" port="443"
            protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>

Tomcat의 web.xml 파일에 추가하기(http로 접속 시 https 로 리다이렉션 설정)

<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>

keychain에 등록하기(구글을 통해서 등록해도 되고, Keychain Access(/System/Applications/Utilities/Keychain Access.app)에서 직접 등록해도 됩니다)

 

인증서 관리를 클릭하면 맥의 경우 keychain access가 바로 켜집니다.

 

이후 여기에 생성해 두었던 인증서들을 등록하면 됩니다.(이때에는 인증서를 2개 등록해야한다는 사실을 까마득히 모르고 있었어요...)



실패 ( 인증서가 제대로 적용되지 않음)

  • openssl.cnf의 설정을 따로 변경해 주지 않아서 적용이 제대로 안되었던 듯 합니다,

Openssl.cnf 설정하기

openssl.cnf를 찾아보았는데... 생각보다 여러 파일들이 존재하더군요.

그래서 openssl.cnf 파일 경로를 찾기 위한 명령어를 terminal에서 실행시켜 줍니다.

$ openssl version -d

 

참고 :

https://stackoverflow.com/questions/27702462/cant-find-the-openssl-cnf-file-on-my-mac/27724156

https://stackoverflow.com/questions/21477210/correct-location-of-openssl-cnf-file

그 후 찾은 파일에 v3_req를 추가해줍니다.

 

파일 변경 후 아래의 코드들을 terminal에서 한줄씩 작성했습니다.

cd \usr\local\Cellar\openssl@1.1\1.1.1k\local_cert

openssl genrsa -aes256 -out localhost_private.key 2048

openssl req -new -key localhost_private.key -out localhost.csr -config /private/etc/ssl/openssl.cnf

openssl x509 -req -days 1825 -in localhost.csr -out localhost.crt -CA ../rootCA/ro otca.crt -CAcreateserial -CAkey ../rootCA/rootca_private.key -extensions v3_req -extfile /private/etc/ssl/openssl.cnf

openssl pkcs12 -export -in localhost.crt -inkey localhost_private.key -out keystore -name "tomcat cert" -CAfile ../rootCA/rootca.crt -caname root -chain

 

비밀번호의 경우 원하는 것을 작성하면 됩니다.

 

email 이후는 계속 스킵했습니다.

비밀번호를 입력하라는 곳에는 위에 입력한 비밀번호를 입력하면 됩니다.

위의 과정이 완료 되었다면 다시 keychain에서 인증서를 등록합니다.

총 두개의 localhost CA가 등록되어야함.(이때 우연하게 2개를 등록해야한다는 사실을 알았네요 ㅠㅠ)

 

등록하니 sha-1 말고 sha-2로 등록하라고 말했습니다.( 이때 인증서 두개 모두 등록했었는데... 밑의 과정을 한번 더 거치긴 했습니다만 sha-1이 sha-2로 변경되진 않았습니다 ㅠ)

위에 등록한 코드들을 변경해서 다시 등록했습니다.(사실 이걸 등록 안해줘도 되었을 듯 하네요...)

길이를 2048 → 4096으로 변경

openssl genrsa -aes256 -out localhost_private.key 4096

중간에 -sha256을 집어넣음

openssl req -new -key localhost_private.key -sha256 -out localhost.csr -config /private/etc/ssl/openssl.cnf

중간에 aes256을 집어넣음

openssl pkcs12 -export -in localhost.crt -inkey localhost_private.key -aes256 -out keystore -name "tomcat cert" -CAfile ../rootCA/rootca.crt -caname root -chain

전체적인 실행 순서

cd \usr\local\Cellar\openssl@1.1\1.1.1k\local_cert

openssl genrsa -aes256 -out localhost_private.key 4096

openssl req -new -key localhost_private.key -out localhost.csr -config /private/etc/ssl/openssl.cnf

openssl x509 -req -days 1825 -in localhost.csr -out localhost.crt -CA ../rootCA/rootca.crt -CAcreateserial -CAkey ../rootCA/rootca_private.key -extensions v3_req -extfile /private/etc/ssl/openssl.cnf

openssl pkcs12 -export -in localhost.crt -inkey localhost_private.key -aes256 -out keystore -name "tomcat cert" -CAfile ../rootCA/rootca.crt -caname root -chain

참고

https://blog.naver.com/oxcow119/220449926380

이 후 한번 더 security 창에서 에러가 발생했습니다.

You have recently allowed content loaded with certificate errors (such as scripts or iframes) to run on this site.

아래의 방법을 이용해서 다시 재시작

  • Open developer tools
  • Goto the Application tab
  • Clear storage
  • Close and re-open tab

 

clear site data 클릭 후 자신의 도메인에 해당하는 창들을 모두 종료 후 다시 시도

참고

https://stackoverflow.com/questions/44145936/chrome-active-content-with-certificate-errors

성공...

등록하는데 꼬박 하루를 잡아먹었네요...

ssl에 대한 개념도가 많이 늘진 않았는 듯 한데 시간이 상당히 많이 걸린 듯 합니다 ㅠ

그리고 여전히 왜 굳이 인증서 2개를 등록해야 제대로 작동하는지 그 이유에 대해서 잘 모르겠네요!! 양방향 키라서 그런건지...

여전히 많이 부족하네요!! 공부가 좀 더 절실해 보입니다ㅎㅎ

728x90
반응형