윈도우 로컬환경 HTTPS 구축

HwangBaco·2023년 5월 18일
0

컴퓨터 네트워크 수업을 들으며 HTTPS 서버를 수립해야 하는 과제를 받았다.

이를 AWS EC2 리눅스/우분투 환경에서 수립하는 방법은 여러 문서가 존재하였지만, 윈도우 로컬 환경에서 수립하는 것은 상대적으로 확연하게 적었다.

이를 수행하기 위해 외국 링크를 참고하여 과정을 따라해보며 정리해본다.

준비


OpenSSL 설치

가장 먼저 필요한 것은 OpenSSL용 .exe파일입니다.

이게 설치되어 있지 않다면 샤아닝 라이트 프로덕션 페이지에 방문하여 Win64 OpenSSL 파일을 다운로드하고 설치합니다.

만약 이미 설치되어 있다면 그 파일이 존재하는 해당 경로를 시스템 환경변수 PATH에 추가하면 됩니다.

Nginx 설치

HTTPS를 구현하기 위한 방법으로 Nginx를 활용할 계획입니다. Nginx는 로드밸런싱에도 주로 사용되며, 지속적 배포 환경 구축에도 사용되고, 이렇게 HTTPS 환경을 수립할때에도 많이 사용됩니다.

  • nginx 홈페이지에 가서 stable 버전으로 다운로드 받아줍니다.

  • 압축 풀고 nginx.exe 실행해주면 localhost:80 으로 접속했을 때 Welcome to nginx!가 확인되면 문제 없는 겁니다.

저의 경우엔 아래와 같은 에러가 발생했습니다.
nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
위 에러는 이미 80포트를 사용하고 있어 발생하는 에러입니다. permission만 보면 일단 chmod 부터 해보고 보는 저를 반성합니다...

cmd를 실행하고 netstat -ano를 입력하면 현재 어떤 포트에 어떤 프로세스가 실행되고 있는지 그 아이디를 확인할 수 있습니다. PID 4인 녀석이 실행되고 있었는데, 알아보니까 누군가는 이 프로세스를 윈도우의 횡포라고 부르고 있었습니다.

World Wide Web Publishing Service라는 이름의 프로세스가 윈도우에서 기본적으로 로컬의 80포트를 점유하고 있던 겁니다. 깊게 알아보진 않았지만 IIS를 당장 사용할 일이 없어 보여서 꺼버리고 nginx 서버를 80포트로 열어주었습니다.
(근데 사실 나중에 443포트 열면 80을 꼭 써야 할 필욘 없습니다.)
1. windows+r -> services.msc 접근
2. world wide web publishing service찾아서 아래처럼 사용을 중지시키면 됩니다.

client-1.local.conf 생성

  • 인증서 발행용 설정파일(client-1.local.conf) 작성

파일위치 : 인증서를 저장하는 경로에 모아두는걸 추천합니다.

[ req ]

default_bits        = 2048

default_keyfile     = server-key.pem # 이 파일은 없어도 됨

distinguished_name  = subject

req_extensions      = req_ext

x509_extensions     = x509_ext

string_mask         = utf8only


[ subject ]

countryName                 = Country Name (2 letter code)

countryName_default         = US

stateOrProvinceName         = State or Province Name (full name)

stateOrProvinceName_default = NY

localityName                = Locality Name (eg, city)

localityName_default        = New York

organizationName            = Organization Name (eg, company)

organizationName_default    = *.domain.co.kr

commonName                  = Common Name (e.g. server FQDN or YOUR name)

commonName_default          = *.domain.co.kr  #  <=== 요기가 표시 이름

emailAddress                = Email Address

emailAddress_default        = test@example.com


[ x509_ext ]

subjectKeyIdentifier   = hash

authorityKeyIdentifier = keyid,issuer

basicConstraints       = CA:FALSE

keyUsage               = digitalSignature, keyEncipherment

subjectAltName         = @alternate_names

nsComment              = "OpenSSL Generated Certificate"


[ req_ext ]

subjectKeyIdentifier = hash


basicConstraints     = CA:FALSE

keyUsage             = digitalSignature, keyEncipherment

subjectAltName       = @alternate_names

nsComment            = "OpenSSL Generated Certificate"


[ alternate_names ] 

DNS.1 = client-1.local   #  <=== 요기를 변경

DNS.2 = *.client-1.local   #  <=== 요기를 변경

My Own Certificate Authority in Windows


Create a Private Key

아래 명령어로 생성하면 된다.

openssl genrsa -des3 -out rootSSL.key 2048

위 과정을 git bash에서 하려고 했더니 계속 제대로 동작이 되지 않았다... 따라서 cmd에서 했더니 한번에 되어서 좀 놀랐다. -des3 옵션에 따라 비밀번호 입력은 필수이고, 이번 프로젝트에선 0000으로 설정했다.

Create the Certificate File

아래 명령어로 생성하면 된다.

아래 명령어 중에서 -days 뒤에 1024는 유효기간을 1024일로 설정한 거다. 해당 유효기간은 custom하면 된다.

openssl req -x509 -new -nodes -key rootSSL.key -sha256 -days 1024 -out rootSSL.pem

본인의 경우 위처럼 했더니 아래와 같은 에러가 발생하였다.

환경변수 상에 OPENSSL_CONF가 설정되어 있지 않아 기본 경로로 탐색되었는데, 해당 경로에 openssl.cnf 파일이 없어 발생한 문제인 걸로 보였다.
따라서 아래 명령어를 이용하여 OPENSSL_CONF 환경변수를 설정하고 다시 실행하니 됐다.
(나의 경우 예전에 anaconda 설치하면서 openssl이 자동으로 설치됐기에 아래와 같은 경로를 가지고 있었다.)

set OPENSSL_CONF=C:\Users\HwangTaeyeon\anaconda3\pkgs\openssl-1.1.1o-h2bbff1b_0\Library\ssl\openssl.cnf

위 설정이 잘 되었는지 확인하려면 아래 명령어를 입력했을 때 경로가 나오면 된다.

echo %OPENSSL_CONF%


위 정보는 로컬에서만 돌릴거면 무조건 법적으로 유효한 정보를 입력할 필욘 없다고 합니다.

Get Windows to Trust the Certificate Authority (CA)

  1. 탐색기(finder)를 이용하여 MMC(Microsoft Management Console)을 실행합니다. (이때 스냅인에 접근하려면 관리자 권한이 필요하므로, 관리자 권한으로 실행해야 합니다. 만약 그렇지 않으면 스냅인 초기화 실패가 발생합니다.)
  2. "File -> 스냅인 추가/제거" 를 접근,

    인증서->Computer Account

    ->Local Computer로 설정하고 확인을 누릅니다.

    신뢰할 수 있는 루트 인증 기관을 누르고 모든 작업 -> 가져오기를 수행합니다. 그 이후 뜨는 창에서 이번에 발급한 .pem파일을 선택하고, "타사 루트 인증 기관"을 설정합니다.

    그러면 이제 아래처럼 확인할 수 있습니다. 제가 client-1.local이라는 이름으로 등록해서 아래처럼 보입니다.

    err_invalid_authorization

    위 에러가 발생하면, 우선 신뢰할 수 있는 루트 인증 기관과, 타사 루트 인증 기관에 모두 인증서를 가져와서 등록해줘야 합니다. 위 과정을 거쳐야 시스템에서 해당 인증서를 신뢰할 수 있습니다. 가져오는 파일은 저의 경우 client-1.local.crt였습니다. 이를 통해 저는 해결했습니다.

Issuing Certificates for Local Domains


Creating a Local Domain Site

  1. C:\Windows\System32\drivers\etc\hosts 파일을 확인합니다.
  2. 위 파일을 편집하기 위해 관리자 권한으로 메모장 프로그램을 키고 해당 파일을 열어서 localhost 아래에 127.0.0.1 client-1.local이라고 임의 도메인을 설정합니다.

만약 관리자 권한으로 접근하지 않으면 아래와 같은 오류가 발생합니다. 저는 vim 편집기로 편하게 가려고 했는데 실패했네요ㅠ chmod도 거부됩니다.

이러한 방식으로 설정할 겁니다. 현재 진행하고 있는 게, https://client-1.local와 같이 로컬에서 접근하는 걸 구현하고 있는 겁니다.

Create a Private Key for the New Domain

아래 명령어를 이용하여 새로운 도메인에 private key를 추가해 봅시다.

openssl req -new -sha256 -nodes -out client-1.local.csr -newkey rsa:2048 -keyout client-1.local.key -subj "/C=KR/ST=SEOUL/L=YONGSAN/O=Client One/OU=DEV/CN=client-1.local/emailAddress=hello@client-1.local"

만약 도메인 네임을 client-1.local이 아닌 다른 것을 하고 싶다면, 위 명령어 중 client-1.local을 자신의 로컬 서버 도메인 이름으로 수정해줘야 합니다.

Issue the New Certificate Using the Root SSL Certificate

openssl x509 -req -in client-1.local.csr -CA rootSSL.pem -CAkey rootSSL.key -CAcreateserial -out client-1.local.crt -days 500 -sha256 -extensions "authorityKeyIdentifier=keyid,issuer\n basicConstraints=CA:FALSE\n keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment\n  subjectAltName=DNS:client-1.local"

nginx 설정

이제 nginx서버에 접근 시 인증 과정을 거치도록 해보겠습니다. nginx.conf 파일에 접근하여 아래처럼 설정해줍니다.

로컬 웹 서버 접속에 https 구현 완료


진행시 주 참조
이슈 해결 주 참조
윈도우 80포트 pid 4 참조

http redirect / ssl->tsl 참조

profile
알고리즘 풀이 아카이브

0개의 댓글