OpenSSL

Fox·2024년 1월 31일
0
post-thumbnail

무료로 SSL 인증서를 발급받을 수 있는 곳 중에 Let's Encrypt 가 있다.
그러나, 이 서비스는 공개적으로 접근 가능한 도메인에 대해서만 인증서를 발급하도록 설계되었다.
따라서, 로컬호스트(127.0.0.1)나 내부 IP 주소에 대해서는 인증서를 발급받을 수 없다.
하지만, 테스트 목적이라면 자체 서명 SSL(Self-Signed SSL) 인증서를 생성하고 사용할 수 있다.

Open SSL이란?

  • 암호화 통신을 위한 오픈소스 라이브러리로, 보안 소켓 레이어(SSL) 및 전송 계층 보안(TLS) 프로토콜의 구현체이다.
  • 서버와 클라이언트 사이의 통신을 암호화하여 정보를 안전하게 전송할 수 있게 도와준다.
  • 통신하는 두 당사자의 신원을 확인하고, 데이터의 무결성을 보장하며, 데이터 변조를 방지하는 기능을 제공한다.
  • 다양한 암호 알고리즘을 지원하며, 비밀키, 공개키, 인증서 관리 등의 기능도 제공한다.
  • 웹 서버, 이메일 서버, VPN 서버 등 다양한 곳에서 OpenSSL을 사용한다.
  • 커맨드라인 도구를 제공하여 인증서 생성, 검증, 변환 등의 작업을 할 수 있다.
  • 복잡한 API와 구성으로 인해 사용하기 어려울 수 있으며, 이로 인한 보안 취약점이 발생할 수 있다.

Open SSL 취약점

2014년 4월 HeartBleed라는 버그가 OpenSSL에서 발생하였으며, OpenSSL 1.0.1 버전부터 1.0.1f 버전까지 존재했었다.

공격할 때마다 작은 정보들이 새어 나오는 것을, 심장이 한 번씩 뛸 때마다(HeartBeat) 심장에서 피가 한 방울씩 떨어지는 치명적인 심장출혈(HeartBleed)로 비유한 것이다.

이 취약점의 발생 원인은 OpenSSL의 'heartbeat' 확장 기능에 있다.
이 확장 기능은 두 시스템 간의 연결을 유지하고, 불필요한 재연결을 방지하기 위한 역할을 하지만, 이 확장 기능에서 발생한 버그로 인해 공격자들이 시스템의 메모리를 임의로 읽어낼 수 있게 되었다.

[정상적인 요청]

이로 인해 공격자들은 SSL 키, 사용자 이름, 비밀번호, 이메일 등의 민감한 정보를 노출시킬 수 있었다.
공격자들은 이 정보를 통해 시스템이나 네트워크를 공격하는 데 사용할 수 있고, 이 취약점의 심각성 때문에 'HeartBleed'라는 이름으로 널리 알려지게 되었다.

[데이터의 길이를 조작하여 정보유출 예제]

OpenSSL 1.0.1g 버전에서 이 취약점을 수정하였고, 이후의 버전들에서는 이 취약점이 존재하지 않게 되었다.
사용자들에게는 이 취약점이 수정된 최신 버전의 OpenSSL로 업데이트하거나, 이 취약점이 존재하지 않는 OpenSSL 버전을 사용하도록 권장되었다.

설치법

1. 바이너리 다운로드

아래 URL에 접속하여 본인이 사용하는 PC에 맞는 버전을 다운로드한다.
https://slproweb.com/products/Win32OpenSSL.html


2. 프로그램 실행

다운로드한 OpenSSL 프로그램을 실행하고 순서대로 설치해 준다.
OpenSSL을 사용하려면 시스템에 Microsoft Visual C++ 이 설치 돼 있어야 하고, 그렇지 않은 경우에는 설치메세지를 띄워준다.


3. 환경변수 설정

이제 시스템에서 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_CONF

Path


4. 실행 테스트

OpenSSL 버전을 보려면 OpenSSL에서 아래와 같이 version 명령을 실행할 수 있다.


Open SSL 발급

주의할 점은, 이 방법으로 생성된 인증서는 자체 서명 인증서이기 때문에 사용자의 브라우저는 이 인증서를 신뢰하지 않을 수 있다.
그러나, 테스트 목적으로는 충분히 사용할 수 있다.

즉, 생성된 인증서는 자체 서명된 인증서(self-signed certificate)이므로, 일반적으로 신뢰할 수 있는 CA(Certificate Authority)에 의해 서명된 인증서를 사용하는 것이 좋다.

1. 개인키 생성

openssl genrsa -out localhost.key 2048

openssl genrsa -out localhost.key 2048:

  • 이 명령어는 RSA 알고리즘을 사용하여 2048비트 개인 키를 생성한다.
  • 생성된 키는 'localhost.key'라는 파일에 저장된다.
  • 개인 키는 인증서의 소유자만이 가지고 있어야 하며, 이 키를 통해 데이터를 암호화하거나 서명할 수 있다.

2. CSR(Certificate Signing Request) 파일 생성

openssl req -new -key localhost.key -out localhost.csr

openssl req -new -key localhost.key -out localhost.csr:

  • 이 명령어는 생성된 개인 키('localhost.key')를 사용하여 새로운 인증서 서명 요청(CSR, Certificate Signing Request)을 생성한다.
  • CSR에는 인증서에 포함될 정보(예: 조직 이름, 웹 사이트 주소 등)와 함께 공개 키 정보가 포함되어 있다.
  • 생성된 CSR은 '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 []:

3. 인증서 생성

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:

  • 이 명령어는 CSR('localhost.csr')과 개인 키('localhost.key')를 사용하여 자체 서명된 인증서를 생성한다.
  • 이 인증서는 365일 동안 유효하며, 'localhost.crt'라는 파일에 저장된다.
  • 이 인증서는 서버와 클라이언트 간의 안전한 통신을 위해 사용된다.











    참고 : https://brownbears.tistory.com/232
    참고 : https://aspdotnet.tistory.com/2653
profile
주니어개발자 Fox 입니다 🦊

0개의 댓글