Lightsail 에서 NGINX에 SSL 적용하기 (2)

제대로 접속이 된다면 Lightsail 관리자페이지에서 HTTPS 접속을 위한 환경을 추가한다. ssl.83rpm.com 도메인을 추가한 다음, 443 포트를 연다.

이제 SSL 설정을 시작한다.

내가 수정해야될 사이트의 가상호스트 설정 파일을 연다. 내 경우에는, /opt/bitnami/apps/ssl.83rpm.com/conf/nginx-vhost.conf 파일.

기존의 파일 내용은 다음과 같다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

이 파일 내용을 다음과 같이 변경한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

수정이 완료되었다면 lightsail 재시작 명령어로 모두 재시작한다.

sudo /opt/bitnami/ctlscript.sh restart

재시작하고 난 뒤 웹브라우저를 열고 https://ssl.83rpm.com 으로 접속이 잘 되는지 확인해본다.

구글 크롬과 인터넷 익스플로러의 경우 다음과 같이 표시된다.

내가 임의로 생성한 인증서이므로 안전하지 않기에 경고가 표시되지만 경고를 무시하면 어찌됐든 잘 표시된다.

만약, HTTP로 접속하더래도 무조건 HTTPS로 강제로 접속시키고 싶다면, nginx-vhost.conf 파일을 열고 다음과 같은 설정을 추가한다.

server {
        listen          80;
        root            /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name     ssl.83rpm.com;
        client_max_body_size    40M;
        include         "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
        rewrite ^ https://$server_name:443?request_uri? permanent;
}

server {
        listen                  443 ssl;
        root                    /opt/bitnami/apps/ssl.83rpm.com/htdocs;
        server_name             ssl.83rpm.com;
        ssl_certificate         /opt/bitnami/nginx/ssl/server.crt;
        ssl_certificate_key     /opt/bitnami/nginx/ssl/server.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        include                 "/opt/bitnami/apps/ssl.83rpm.com/conf/nginx-app.conf";
}

엔진엑스를 재실행하면 이제부터는 http로 접속하더라도 https 로 자동전환된다.

테스트하려면 http://ssl.83rpm.com 혹은 https://ssl.83rpm.com 으로 접속해보시길. (언제 닫을지는 모릅니다.)

참고자료

Lightsail 에서 NGINX에 SSL 적용하기 (1)

Lightsail을 사용하며 SSL을 적용하는 방법에 대한 포스팅이다. SSL을 써본적도 없고 앞으로도 내가 이런걸 쓸일이 있을지는 모르겠으나 한번 시도해본다. (사실은 푸우시로님의 요청으로)

나는 상용인증서를 구매할 생각이 없으므로 셀프로 생성해서 테스트해보기로 했다.

이제부터 쓸 내용은 AWS Lightsail NGINX 스택에서 설정한 것이며 운영체제는 우분투 리눅스, 웹서버는 nginx 이다. 굳이 lightsail에만 국한된 것은 아니고 어떤 리눅스라도 같은 과정을 거치면 HTTPS 설정이 가능하다. 상용인증서를 사용한다해도 인증서 공급업체의 인증서를 쓸뿐이지 다른 과정은 똑같다.

https://goo.gl/gBSf5b

을 참고하여 인증서를 생성한다.

아래부터의 내용은 위 URL에 있는 개인인증서 생성을 직접 실행해본 것이다.

bitnami@ip-172-26-10-176:~$ openssl version
OpenSSL 1.0.2l  25 May 2017
bitnami@ip-172-26-10-176:~$

명령으로 openssl이 설치되어 있는지 확인한다. 설치가 되어있지 않다면 apt-get install openssl로 openssl 패키지를 설치한다.

개인키를 생성한다.

bitnami@ip-172-26-10-176:~$ openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
....................................+++
............................+++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
bitnami@ip-172-26-10-176:~$

인증요청서를 생성한다. 몇가지 입력을 요구하는데 자기 상황에 맞도록 알아서 입력한다. 챌린지패스워드와 옵셔널 컴패니 네임은 입력하지 말라고 해서 그냥 엔터쳐서 넘기면 된다.

bitnami@ip-172-26-10-176:~$ openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Seadaemoon-gu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:83RPM.com
Organizational Unit Name (eg, section) []:83RPM.com
Common Name (e.g. server FQDN or YOUR name) []:83rpm.com
Email Address []:YOUR_EMAIL@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
bitnami@ip-172-26-10-176:~$

개인키에서 패스워드 제거하기

bitnami@ip-172-26-10-176:~$ cp server.key server.key.origin
bitnami@ip-172-26-10-176:~$ openssl rsa -in server.key.origin -out server.key
Enter pass phrase for server.key.origin:
writing RSA key
bitnami@ip-172-26-10-176:~$

인증서 생성

bitnami@ip-172-26-10-176:~$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=KR/ST=Seoul/L=Seadaemoon-gu/O=83RPM.com/OU=83RPM.com/CN=83rpm.com/emailAddress=YOUR_EMAIL@gmail.com
Getting Private key
unable to write 'random state'
bitnami@ip-172-26-10-176:~$

여기까지 하고 나면, server.crt / server.csr / server.key / server.key.origin 이렇게 4개의 파일이 생긴다.

인증서 파일들을 넣을 폴더를 생성한다. 나는 /opt/bitnami/nginx/ssl 로 지정했다. 이걸로 할 필요는 없으니 자기 마음대로 결정한다. (예를 들면, 사이트마다 설정할 사람은 apps 디렉토리의 자기사이트 디렉토리 밑에 만드는게 더 나을 것이다.)

bitnami@ip-172-26-10-176:~$ sudo mkdir /opt/bitnami/nginx/ssl

생성된 3개의 파일을 인증서 관리용 디렉토리로 복사한다.

bitnami@ip-172-26-10-176:~$ sudo cp server.crt /opt/bitnami/nginx/ssl/
bitnami@ip-172-26-10-176:~$ sudo cp server.csr /opt/bitnami/nginx/ssl/
bitnami@ip-172-26-10-176:~$ sudo cp server.key /opt/bitnami/nginx/ssl/

SSL을 적용할 사이트에 설정을 시작한다.

난 SSL 테스트를 위한 것이므로 따로 SSL을 위한 사이트 설정을 하나 만들었다. 주소는 ssl.83rpm.com 으로 하기로 했다. 사이트 설정을 한다. vhost 등등….

일단 http://ssl.83rpm.com 으로 접속해본다. 만약 여기서 제대로 접속이 안된다면 nginx 가상호스트 설정이 제대로 안되었으니 제대로 나올 떄까지 수정해야된다.

 

글의 내용이 너무 길어져 두 포스팅으로 나눠서 써야겠다.

https 접근 문제 해결방법

 

플래시에서 SSL이 적용된 경로로 접근하려할때 접근이 되지 않는데 이럴 경우 다음 코드를 HTML에 삽입함으로써 해결할 수 있다.




안타까운건 이 코드를 이용해 ‘웹’에서는 해결할 수 있지만 AIR에서는 여전히 https로의 접근이 되지 않는다는 것… 휴…

언제쯤 이 문제가 해결될라나 모르겠다.

 

플래시에서 https 프로토콜의 데이터를 읽어올 때 문제점

얼마전에 일하다가보니까…

서버에 있는 jsp 파일에다가 데이터를 던져주고 리턴값을 받아서 처리하려고 하는데 이게 안되는거다.

그 경로가 https://~~~~.jsp 였는데 https로는 연결할 수 없나….? 하면서 레퍼런스를 찾아봤더니 또 레퍼런스에는 https에도 연결할 수 있다고 분명히 써있었다.

뭐지…? 하면서 개삽질을 하는데 옆에서 사수형님께서 그거 안되는거라고 http로 바꿔보랜다. 레퍼런스에 된다고 써있는데요? 하면서 반신반의하며 http로 바꿔보니…. 되는거다. ㅡㅡ;; 이럴수가!

원래 https로 하면 경로가 절대경로로 인식 안된다고 주장하는 사수형님을 보며… 음 역시 경험이란게 무섭구나 생각했었다.

방금 전에 네이버 카페를 돌아다니다가 이 문제에 대한 정확한 정보를 얻었다.

나와 동일한 문제점을 겪은 사람이 올린 글에 사람들이 리플을 달아준 것.

플래시에서 https로 데이터를 받아올 수 없고 ioError를 내는데 이것은 플래시의 문제가 아니라, IE의 버그라고 한다. 이 정보에 대한 두개의 포스팅.

http://www.blog.lessrain.com/flash-nasty-xml-load-bug-in-internet-explorer/
http://www.blog.lessrain.com/flash-loading-and-browser-cache-test-suite/

마이크로소프트에도 버그리포팅이 올라가 있구나.

결론은 서버사이드 캐시를 이용하는 방법 밖에 없다고 한다. (솔직히 서버사이드 캐시를 이용하라는 말이 뭔말인지 난 잘 모르겠다.)

AIR 환경에서도 같은 문제가 있는것인지는 확인해봐야 알것 같다. 아마 익스플로러를 거치지 않으니까 버그가 없을 것 같지만… 그래도 모르니까.

플래시에서 일단 저 버그 때문에 https 통신이 불가능하다는 것은 알았으니… 만약 로그인이 들어가고 하는 부분은 어떻게 처리해야할까 하는 생각이 든다. 암호화 통신하는 모듈을 또 붙여야하는건가…

여튼… 최근에 삽질을 하다보니 별의 별 버그들을 다 찾아내는구나.