이번장에서는 저희가 지금까지 진행해왔던 프로젝트에 SSL 적용을 할 것입니다.

 

SSL을 사용하기전에 왜 사용할까요?

 

그 이유는 저희가 사이트가 다른 사람들이 보기에 해킹 위험이 있는 사이트인지, 개인정보를 뺏는 사이트인지 알 수 없기 때문에

저희 사이트가 어떤 사이트이고, 누가 만들었고, 통신이 안전한지 정보를 알아야 하기 때문에 HTTP 통신을 사용합니다.

 

HTTPS/SSL 적용한 통신을 하면, 인증기관(CA)에서 해당 사이트가 누구의 소유인지, 누가 만들었는지의 대한 정보를

인증해주고, root 인증기관인 CA의 인증으로 인한 안전한 사이트에 접속을 할 수 있습니다.

 

여기서 잠깐 알아야 할것이 2개가 있습니다.

 

1. HTTP 와 HTTPS의 차이점

 

HTTP는 Hypertext Transfer Protocol의 약자입니다.

즉, Hypertext인 HTML을 전송하기 위한 통신규약을 의미합니다.

HTTPS에서 S는 Over Secure Socket Layer의 약자로 Secure라는 말을 통해서 알 수 있듯이 보안이 강화된 HTTP입니다.

HTTP는 암호화 되지 않은 방법으로 데이터를 전송하기 때문에 서버와 클라이언트가 주고 받는 메시지를 훔쳐 볼 수 있습니다.

예를들어, 로그인을 위해 서버로 비밀번호를 전송하거나, 중요한 기밀 문서를 열람하는 과정에서

악의적인 감청이나 데이터의 변조등이 일어날 수 있는데 이를 막기 위해 HTTPS가 존재합니다.

 

2. HTTPS와 SSL이 같다?

 

보통의 사람들이 HTTPS와 SSL을 같은 의미로 이해하는 경우가 많은데요~?

정답이면서 오답입니다.

결론적으로는 웹이 인터넷 위에서 돌아가는 서비스 중의 하나인 것처럼,

HTTPS도 SSL 프로토콜 위에서 돌아가는 프로토콜이라고 이해하시면 될 것 같습니다.

 

 

이제 SSL을 하기위해 사용되는 암호화의 종류를 알아보겠습니다.

 

 

대칭키(속도가 빠름)

 

암호를 만드는 행위인 암호화를 할 때 사용하는 일종의 비밀번호를 key라고 합니다.

이 키에 따라서 암호화된 결과가 달라지기 때문에 키를 모르면 복호화를 할 수 없습니다.

대칭키는 동일한 키로 암호화, 복호화를 같이 할 수 있는 방식이기 때문에

보안에 취약합니다.

왜냐하면 다른 사람에게 암호화된 문서를 주고 싶으면 암호화한 비밀번호를 다른 사람이 알아야 하기 때문입니다.

 

비대칭키(RSA암호, 속도가 느림)

 

대칭키 방식은 위와 같이 단점이 있습니다. 암호를 주고 받는 사람들 사이에 대칭키를 전달하는 것이 어려운 것인데요.

대칭키가 유출이 된다면 키를 획득한 공격자는 암호의 내용을 복호화 할 수 있기 때문에 암호가 무용지물이 되기 때문입니다.

그렇게 대칭키를 보완한 암호화 방식을 비대칭키 방식이라고 합니다.

 

비대칭키는 두 개의 키를 갖게 되는데

바로 개인키(private key)와 공개키(public key)입니다.

개인키는 자신만이 가지고 있고, 공개키는 자신포함 사용자들도 가질 수 있으며,

다른 사용자에게 암호문을 보내고 싶다면 상대방의 공개키를 암호화하여 전송합니다.

그러면 암호문을 받은 사용자는 자신의 공개키로 암호화한 문서를 자신의 개인키로 복호화합니다.

 

아직 이해가 가지 않으실 분들을 위해 다시 설명하자면

이 과정에서 공개키는 유출되어도 됩니다.

개인키를 모르면 복호화 하지 못하기에 안전하기 때문입니다!!!

 

이 방식은 이렇게도 응용할 수 있습니다.

 

바로 전자서명 이라는 것인데요?

 

A가 자신의 개인키를 사용하여 원본 데이터의 해시 값을 암호화(서명)합니다.

그 후에 믿을 수 있는 기관(CA)에 A의 공개키를 배포합니다.

그러면 믿을 수 있는 기관인 CA는 자신의 개인키로 A의 공개키를 암호화(서명)하고,

A의 주체 정보와 CA의 공개키를 담아 인증서를 만들어 배포합니다.

그리고 A는 원본 데이터와 원본 데이터의 해시 값을 암호화(서명)한 데이터를 합쳐 배포합니다.(이를 코드사인 이라함)

 

CA를 믿을 수 있는 사용자인 C는 코드사인된 데이터를 받아 인증서 안에 들어 있는 CA의 공개키를 이용하여 

A의 공개키를 얻어냅니다.(아까 CA의 개인키로 A의 공개키를 암호화 했기 때문)

이 A의 공개키로 암호화(서명)된 데이터를 복호화하여 얻은 해시값과 원본 데이터를 해싱하여 얻은 해시 값을 비교하여

일치한다면 원본데이터가 손상되지 않았다는 것을 의미합니다.

 

 

한마디로 두 사람이 서로의 개인키를 사용하여 공유하고 싶은데 서로의 사이를 믿을 수 없기 때문에

공통으로 신뢰할 수 있는 누군가를 개입시키는 형태입니다.

 

여기서 CA는 어떻게 믿을 수 있을까요?

그 이유는 바로 CA들은 마이크로소프트의 검증을 받고 시스템에 하드코딩으로 설치되어 있기 때문에

무조건 믿을 수 있다는 전제가 깔려 있습니다.

해커가 ROOT 발급자를 사칭하려면 마이크로소프트와 척을 지게 때문에도 있고 그만큼 어렵습니다.

 

이제 사이트로 넘어가겠습니다.

 

사이트에 접속했을 때의 3가지 경우가 있는데요.

 

 

1. SSL이 적용된 사이트(최상위 인증기관인 CA의 인증서)

 

- 해당 블로그도 SSL이 적용된것을 알 수 있습니다.

 

 

 

2. SSL이 적용되지 않은 사이트

 

 

 

3. SSL이 적용되었지만, 인증서가 보장되지 않은 사설인증(사설 CA)인 경우

 

- 해당 사이트는 전주대학교 도서관입니다.

 

 

 

 

이제 본격적으로 프로젝트에 SSL을 적용해보겠습니다.

 

사이트에 SSL을 적용하러면 인증기관으로부터 인증서를 발급받아 웹서버에 설치해야 합니다.

개발용으로 자신이 인증기관이 되어 인증서를 발급하여 Tomcat에 적용하는 방법을 알아보겠습니다.

 

1. openssl 설치하기

 

키와 인증서를 만들기 위해 openssl을 설치합니다.

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

저는 윈도우에서 테스트하므로 openssl-0.9.8k_X64.zip 을 다운받습니다.

다운받고 C드라이브 바로 아래에 util폴더를 생성합니다.

다운받은 파일은 util폴더에 압축을 풀어줍니다. 

 

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

 

공인인증기관이 아닌 내가 인증기관처럼 작업을 해야 하므로 인증기관용 개인키를 먼저 만들고,

웹 브라우저에 설치될 루트 인증서도 만듭니다.

공인인증기관의 루트 인증서와 중간 인증서는 이미 웹 브라우저에 설치되어 있으므로 바로 인증이 되는 것입니다.

 

openssl 명령을 실행하기 위해 cmd를 관리자 권한으로 실행합니다.

관리자 권한이 아니면 오류가 발생합니다.

 

1. CA가 사용할 RSA 키 쌍(publiic, private key) 생성

 

2048 bit 개인키를 생성하는데, 분실에 대비하여 AES256으로 암호화 합니다.

그러므로 암호를 잊어버리면 개인키를 사용할 수 없게 됩니다.

암호화 하지 않으려면 -aes256 옵션을 빼고 생성하면 됩니다.

 

C:\util\openssl-0.9.8k_X64\bin>openssl genrsa -aes256 -out rootca_private.key 2048

 

 

테스트용이므로 암호는 본인이 하고 싶은대로 설정하시면 됩니다.

하지만 잊어버리면 진행이 안되니 잘 적어주셔야 합니다.

C:\util\openssl-0.9.8k_X64\bin\rootca_private.key 파일이 생성되었습니다.

 

* 참고 (개인키로 공개키를 직접 만드는 방법)

C:\util\openssl-0.9.8k_X64\bin>openssl rsa -in rootca_private.key -out rootca_public_key.pem -pubout

 

 

 

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

 

인증서를 발급받기 위해 나의 공개키와 도메인 정보를 담은 .csr 파일을 만들어 인증기관에 보내게 되는데,

여기서는 내가 인증기관이 되어 인증서를 발급해야 하므로 인증기관의 공개키를 나의 개인키로 서명하여 생성합니다.

 

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

 

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

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

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

 

3. 10년짜리 self-signed 인증서 생성

 

내가 인증기관이므로 .csr 파일을 나의 인증기관 개인키로 서명합니다.

X.509 버전 3 인증서를 만듭니다.

C:\util\openssl-0.9.8k_X64\bin>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_private.key : 인증기관의 개인키 비밀번호 입력

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

- 다음의 명령으로 인증서 내용을 확인합니다.

C:\util\openssl-0.9.8k_X64\bin>openssl x509 -text -in rootca.crt

 

 

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

 

 

 

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

 

위에서 인증기관에 필요한 것들이 준비가 되었기 때문에

이제 웹서버에 필요한 키와 인증서를 생성합니다. 생성방법은 위와 비슷한 과정을 거칩니다.

 

 

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

 

C:\util\openssl-0.9.8k_X64\bin>openssl genrsa -aes256 -out localhost_private.key 2048

 

- 개인키 잘 적어두기

localhost_private.key 파일 생성

 

 

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

 

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

 

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

 

 

- Enter pass phrase for localhost_private.key : 개인키 입력

- Common Name(eg, YOUR name) [] : 도메인명 또는 hostname 입력

- Email Address [] :  엔터

- A challenge password[]: 와 An optional company name [] :   엔터


 

3. 5년짜리 localhost용 SSL 인증서 방급(CA 개인키로 서명)

 

C:\util\openssl-0.9.8k_X64\bin>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_prrivate.key : 인증 기관 개인키 비밀번호 입력

- localhost.crt 파일이 생성되었으며 이것이 바로 웹서버용 인증서 입니다!

 

 

4. Tomcat용 인증서 파일 생성

 

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

 

C:\util\openssl-0.9.8k_X64\bin>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 파일이 생성되었습니다.

 

 

5. 톰캣 설정

 

server.xml 파일에 https 설정을 추가하고 실행

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
     maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
     keystoreFile="C:/util/openssl-0.9.8k_X64/bin/keystore" keystorePass="keystorepwd"
     clientAuth="false" sslProtocol="TLS" />

 

* keystorePass에는 아까 설정한 키스토어 비밀번호를 입력해야합니다!

해당 코드의 keystorePass는 예시입니다.

 

 

6. 웹 브라우저로 해당 프로젝트(https://localhost:8443/board/listPage)를 호출한 결과

 

 

 

보통은 "이 사이트는 안전하지 않습니다." 라고 출력됩니다.

그 이유는 웹서버로부터 받은 인증서를 보증 해줄 인증기관의 인증서가 웹브라우저에는 없기 때문입니다.

 

하지만 저는 사설 root 인증서를 설치하여 구현하였습니다.

 

7. 사설 root 인증서 설치

 

- IE 웹 브라우저 도구 -> 인터넷 옵션 -> 내용 -> 인증서

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

 

 

이렇게 한 후에 웹브라우저를 요청하면 제가 한것처럼 에러없이 페이지가 잘 출력이 될것입니다!!!

 

Chrome도 마찬가지고 고급에가서 IE와 같이 설정하면 다음과 깉이 출력이 됩니다.

 

 

사설 인증서이기 때문에 저렇게 출력되지만 8443포트는 사용할 수 있습니다.

그리고, 구현하는 방식은 같으며 사설과 실제 인증서의 차이라고 알고 계시면 좋을것 같습니다.

+ Recent posts