원래 Ngnix로 배포할 때 해봤으니.. 날먹 가능하지않겠나.. 생각을 했다
하지만 지금 내가 받은 일은 TEST를 목적으로 Local 환경에서 https로 할 수 있게끔 자체인증을 하라는 것.
그래서 잠깐 조사하며 본 내용을 써본다.
이건 쉽다.
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가 잘 적용되어있는지 확인하면 됩니다.
아이고 저랑 같은 분이 또..
순서대로
openssl genrsa -out private.key 2048
openssl req -new -key private.key -out request.csr -subj "/CN=YOUR_IP_ADDRESS"
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 메시지와 증명서가 발급된다.
근데 문제는? 역시나 신뢰할 수 없는 인증서다.. 이건 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로 맞추는게..
다른 이슈사항은 발생하면 올릴 것!