https 프로토콜에 쓰이는 ssl 인증서는 http 프로토콜을 안전하다고 공인해주는 인증서다. 구체적으로 암호화나 인증 방식까지는 제쳐두고 이런 역할을 하는 인증서 만드는 법만 해보자.
openssl은 ssl 프로토콜을 위한 도구다. 가장 중요한 점은 다양한 암호화 알고리즘을 지원하는 오픈소스다. 이 프로그램으로 인증서에 필요한 key를 생성하고 인증서도 만들 수 있다.
apt-get install openssl
openssl을 설치한다.
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Lee/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt
옵션이 너무 많아서 일일히 설명하기 힘들다. req는 CSR(인증서명요청 Certificate Signing Request) 생성하려고 쓰고 생성된 요청으로 crt(인증서 파일의 한 종류)를 생성한다. 하여튼 여차저차해서 localhost.dev.key 와 localhost.dev.crt가 생성된다.
chmod 600 localhost.dev.*
두 피일의 접근권한을 바꿔준다.(I don't know why!)
mv localhost.dev.crt etc/ssl/certs/ mv localhost.dev.key etc/ssl/private/
저 두 파일이 뭐하는 건지 몰랐다. 저렇게 명명된 디렉토리에 각각 넣어주니 추측해 본다. *.crt는 인증서파일이고 *.key는 개인키로 인증서를 암호화할 때 쓴게 아닐까? 공개키는 어떻게 된건지 모르겠다. 나만 보고 테스트할 거라 상관없나?
nginx의 설정파일을 수정해야한다. container에 vim이 설치되어 있지 않다면 불편하니 해주도록한다.
apt-get install vim
vim이 설치되어 있다면 /etc/nginx/sites-enabled/default 를 수정하면 된다. server블록에
ssl_certificate /etc/ssl/certs/localhost.dev.crt; ssl_certificate_key /etc/ssl/private/localhost.dev.key;
인증서 파일과 키파일의 경로를 추가한다.
server { listen 80 default_server; listen [::]:80 default_server; listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate /etc/ssl/certs/localhost.dev.crt; ssl_certificate_key /etc/ssl/private/localhost.dev.key; root /var/www/html; index index.php index.html index.htm; }
수정된 설정을 nginx에 적용하려면 실행되고 있는 nginx를 reload하거나 restart해야한다. reload가 더 가볍다.
service nginx reload
브라우저에서 localhost를 확인해본다. 본인은 ssh에서 작업 중이므로 openssl을 이용했다.
openssl s_client -connect localhost:443
443은 https 기본 포트로 container 생성 시 설정했었다. 설정파일 수정 전후를 비교해 봤다.
ssl설정 전 ssl설정 수정 후뭐가 엄청나게 나오는데 일단 본인이 작성한 인증서가 맞는 듯 하다. 브라우저도 꼭 확인 할 것! 설정파일 바꾸고 크롬 브라우저 주소창에 localhost:443이나 localhost 아무리 입력해도 경고 문구가 안떠서 헤맸다. 다행히 jaejeon님이 지나가시다가 https://localhost 입력해주시니 바로
이렇게 경고 문구가 떠 줘야한다. 저기서 고급 버튼 누르고 "localhost(안전하지 않음)으로 이동"으로 웹페이지로 이동한다.
여기까지 떠 주명 땡큐다! 이후에는 localhost:443로도 https로 접속 된다!