SSL 자체인증? 뭔데 그게

Junkyu_Kang·2024년 12월 5일

원래 Ngnix로 배포할 때 해봤으니.. 날먹 가능하지않겠나.. 생각을 했다

하지만 지금 내가 받은 일은 TEST를 목적으로 Local 환경에서 https로 할 수 있게끔 자체인증을 하라는 것.

그래서 잠깐 조사하며 본 내용을 써본다.

1. OpenSSL Download

이건 쉽다.
https://slproweb.com/products/Win32OpenSSL.html
위 링크에서 본인에게 맞는 설치파일을 받으면 된다. 물론 버전 선택도 가능


나는 가장 최신 버전으로 Win64 OpenSSL v3.4.0을 받았다.

설치를 하고 난 후 해야할 건 환경 변수에 대한 설정이다.

환경변수는 2개의 과정이 필요하다.
1. path에 OpenSSL|bin 위치를 지정할 것.
2. 시스템 변수에 OpenSSL_CONFIG를 추가할 것.

1번은 그냥 path에서 새로 만들기로
C:\Program Files\OpenSSL-Win64\bin 경로를 추가하면 된다.

물론.. 설치 경로가 다르면 수정해야지.. 폴더 위치 확인해요

2번은 시스템 변수에 OPENSSL_CONF를 추가해야하는데 이건 경로를 넣으면 된다.
어떤 경로? conf파일을 찾아가야지.

openssl 폴더로 들어가서 bin, cnf 순으로 들어가면 보일 것

그럼 이제 cmd를 관리자모드로 켜면 확인할 수 있다.

설정이 완료되고 cmd에 openssl을 입력하면


위 처럼 사용가능한 명령어가 나온다!

비공개 키(Private Key) 생성

openssl genrsa -out private.key 2048

CSR(인증서 서명 요청, Certificate Signing Request) 생성

openssl req -new -key private.key -out request.csr

이 과정에서 여러 질문이 나오며, 주로 다음과 같은 정보를 입력합니다:

Country Name (2-letter code) [XX]: KR
State or Province Name (full name): Daejeon
Locality Name (e.g., city): YuSeong-gu
Organization Name (e.g., company): MyCompany
Organizational Unit Name (e.g., section): Software Team
Common Name (e.g., domain name): example.com
Email Address: admin@example.com
Self-signed 인증서 생성 (테스트 용도)

뭐 바꿔도 된다 위 내용은 근데 나는 아직 도메인이 없어서 ip로 진행하는 방법이 있나 찾아봤다.

openssl x509 -req -days 365 -in request.csr -signkey private.key -out certificate.crt

다 되면 이렇게 입력하면 됨 인증서 생성임

인증 절차 및 과정

보통 Let's Encrypt의 CA를 사용하죠..

이걸 하는 방법은 일단 도메인이 있어야 하더라구요..

sudo certbot certonly --standalone -d example.com

아까 받은 domain으로 certbot을 사용하여 무료 인증서를 발급 받습니다.

이걸 ngnix에 적용하면 되죠

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
}

위 과정을 끝내면 도메인에 접속해 https가 잘 적용되어있는지 확인하면 됩니다.

나 도메인 없는데?

아이고 저랑 같은 분이 또..

순서대로

  1. 비공개 키 생성
openssl genrsa -out private.key 2048
  1. CSR 생성 시 IP 주소를 사용한다.
openssl req -new -key private.key -out request.csr -subj "/CN=YOUR_IP_ADDRESS"
  1. 인증서 생성!
openssl x509 -req -days 365 -in request.csr -signkey private.key -out certificate.crt -extfile <(echo "subjectAltName = IP:YOUR_IP_ADDRESS")

근데 이러면 Window 환경에서 에러난다.. <(가 안되는 문법이라

그래서 openssl-ext.cnf 파일을 만들어서 설정정보를 넣어줘야 한다.

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]

[v3_req]
subjectAltName = IP:0.0.0.0

위 내용을 메모장에 추가하고 저장한다. ip는 바꿔야함

그리고 powershell에서

PS C:\WINDOWS\system32> $content = @"
>> [req]
>> distinguished_name = req_distinguished_name
>> req_extensions = v3_req
>>
>> [req_distinguished_name]
>>
>> [v3_req]
>> subjectAltName = IP:0.0.0.0
>> "@
>>
>> $content | Out-File -Encoding utf8 "C:\Users\junkyu\Desktop\openssl-ext.cnf"

이렇게 encode해서 파일을 만들면 된다 conf 파일을,,

그 후 실행하면 된다.

openssl x509 -req -days 365 -in request.csr -signkey private.key -out certificate.crt -extfile openssl-ext.cnf -extensions v3_req

Certificate request self-signature ok
subject=CN=0.0.0.0

위에 명령어를 실행하면 아래처럼 ok 메시지와 증명서가 발급된다.

IP는 다 바꿔야함!!

근데 문제는? 역시나 신뢰할 수 없는 인증서다.. 이건 Only test 환경에서만 사용할 것
브라우저에서 신뢰할 수 있게 하려면 루트 인증서로 추가해야함!

당연히 Let's Encrypt 사용은.. 불가.. 이유는? DNS 검증을 못하기 때문..

위 과정을 거치면? test에서는 실행이 가능하다!

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, SSL World!"

if __name__ == '__main__':
    app.run(ssl_context=('certificate.crt', 'private.key'), host='0.0.0.0', port=443)

위 예제처럼 certificate.crt랑 private.key의 경로를 위에 입력하면 된다.. 뭐 host는 local IP로 맞추는게..

다른 이슈사항은 발생하면 올릴 것!

profile
강준규

0개의 댓글