무료로 SSL 인증서를 발급받을 수 있는 곳 중에 Let's Encrypt
가 있다.
그러나, 이 서비스는 공개적으로 접근 가능한 도메인에 대해서만 인증서를 발급하도록 설계되었다.
따라서, 로컬호스트(127.0.0.1)나 내부 IP 주소에 대해서는 인증서를 발급받을 수 없다.
하지만, 테스트 목적이라면 자체 서명 SSL(Self-Signed SSL) 인증서를 생성하고 사용할 수 있다.
2014년 4월 HeartBleed라는 버그가 OpenSSL에서 발생하였으며, OpenSSL 1.0.1 버전부터 1.0.1f 버전까지 존재했었다.
공격할 때마다 작은 정보들이 새어 나오는 것을, 심장이 한 번씩 뛸 때마다(HeartBeat) 심장에서 피가 한 방울씩 떨어지는 치명적인 심장출혈(HeartBleed)로 비유한 것이다.
이 취약점의 발생 원인은 OpenSSL의 'heartbeat' 확장 기능에 있다.
이 확장 기능은 두 시스템 간의 연결을 유지하고, 불필요한 재연결을 방지하기 위한 역할을 하지만, 이 확장 기능에서 발생한 버그로 인해 공격자들이 시스템의 메모리를 임의로 읽어낼 수 있게 되었다.
[정상적인 요청]
이로 인해 공격자들은 SSL 키, 사용자 이름, 비밀번호, 이메일 등의 민감한 정보를 노출시킬 수 있었다.
공격자들은 이 정보를 통해 시스템이나 네트워크를 공격하는 데 사용할 수 있고, 이 취약점의 심각성 때문에 'HeartBleed'라는 이름으로 널리 알려지게 되었다.
[데이터의 길이를 조작하여 정보유출 예제]
OpenSSL 1.0.1g 버전에서 이 취약점을 수정하였고, 이후의 버전들에서는 이 취약점이 존재하지 않게 되었다.
사용자들에게는 이 취약점이 수정된 최신 버전의 OpenSSL로 업데이트하거나, 이 취약점이 존재하지 않는 OpenSSL 버전을 사용하도록 권장되었다.
아래 URL에 접속하여 본인이 사용하는 PC에 맞는 버전을 다운로드한다.
https://slproweb.com/products/Win32OpenSSL.html
다운로드한 OpenSSL 프로그램을 실행하고 순서대로 설치해 준다.
OpenSSL을 사용하려면 시스템에 Microsoft Visual C++
이 설치 돼 있어야 하고, 그렇지 않은 경우에는 설치메세지를 띄워준다.
이제 시스템에서 OpenSSL 이 제대로 작동하도록 환경 변수를 설정해 준다.
위와 같이 별도의 폴더에 설치하였다면, OPENSSL_CONF 및 Path 환경 변수를 설정해야 하지만, 만약에 기본 설정 경로인 C:\Program Files\OpenSSL-Win64 폴더에 설치되었다면 환경 변수 셋팅하지 않아도 된다.
set OPENSSL_CONF=C:\OpenSSL-Win32\bin\openssl.cfg
set Path=......Other Values here......;C:\OpenSSL-Win32\bin
OpenSSL 버전을 보려면 OpenSSL에서 아래와 같이 version
명령을 실행할 수 있다.
주의할 점은, 이 방법으로 생성된 인증서는 자체 서명 인증서이기 때문에 사용자의 브라우저는 이 인증서를 신뢰하지 않을 수 있다.
그러나, 테스트 목적으로는 충분히 사용할 수 있다.
즉, 생성된 인증서는 자체 서명된 인증서(self-signed certificate)이므로, 일반적으로 신뢰할 수 있는 CA(Certificate Authority)에 의해 서명된 인증서를 사용하는 것이 좋다.
openssl genrsa -out localhost.key 2048
openssl genrsa -out localhost.key 2048
:
openssl req -new -key localhost.key -out localhost.csr
openssl req -new -key localhost.key -out localhost.csr
:
위 명령어를 입력하면 인증서를 생성하기 위한 신청서이니 나라, 소속 등 몇 가지 정보를 입력하게 돼 있다.
나는 사설 인증서를 생성하고자 하는 거라 자유롭게 작성해 봤다.
또한 아래쪽에는 패스워드를 입력하게 돼 있는데 굳이 입력하지 않아도 된다.
생성 시 마주하는 명령어
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:MapoGu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company
Organizational Unit Name (eg, section) []:Developer
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:user@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt
openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt
: