DROWN Attack 취약점 방지용 SSL 설정

https://www.ssllabs.com 에서 SSL 테스트를 해봤는데 DROWN 취약점이 있다고 F 등급을 먹인다.

DROWN 공격 취약점에 대한 내용

줄여서 얘기하자면, SSL v1, v2, v3와 TLS 1.0은 사용하지 않도록 하는 것이 목표이다.

그렇게 설정했는데도 아무리해도 되질 않았다.

에서 답을 찾았다. default_server 설정이 있어야 한다는 것.

nginx virtualhost 설정에서

server {
        listen                  443 ssl default_server;
        root                    /opt/bitnami/apps/blog.dongbumkim.com/htdocs/;
        server_name             blog.dongbumkim.com;
        ssl_certificate         /etc/letsencrypt/live/blog.dongbumkim.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/blog.dongbumkim.com/privkey.pem;
        include                 "/opt/bitnami/nginx/conf/ssl_param.conf";
        include                 "/opt/bitnami/apps/blog.dongbumkim.com/conf/nginx-app.conf";
}

default_server 를 꼭 넣어줘야한다.

이 default_server 설정은 하나만 있어야하므로 여러 가상호스트를 쓰고 있다면 그 중 한 곳의 server 블록에만 넣어줘야한다. 만약 여러곳에 넣으면 nginx 실행시 에러난다.

SSL 설정은 다음 사이트에서도 만들 수 있다.

 

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로의 접근이 되지 않는다는 것… 휴…

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