컴퓨터 네트워크 수업을 들으며 HTTPS 서버를 수립해야 하는 과제를 받았다.
이를 AWS EC2 리눅스/우분투 환경에서 수립하는 방법은 여러 문서가 존재하였지만, 윈도우 로컬 환경에서 수립하는 것은 상대적으로 확연하게 적었다.
이를 수행하기 위해 외국 링크를 참고하여 과정을 따라해보며 정리해본다.
가장 먼저 필요한 것은 OpenSSL용 .exe
파일입니다.
이게 설치되어 있지 않다면 샤아닝 라이트 프로덕션 페이지에 방문하여 Win64 OpenSSL 파일을 다운로드하고 설치합니다.
만약 이미 설치되어 있다면 그 파일이 존재하는 해당 경로를 시스템 환경변수 PATH에 추가하면 됩니다.
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
찾아서 아래처럼 사용을 중지시키면 됩니다.
파일위치 : 인증서를 저장하는 경로에 모아두는걸 추천합니다.
[ 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 # <=== 요기를 변경
아래 명령어로 생성하면 된다.
openssl genrsa -des3 -out rootSSL.key 2048
위 과정을 git bash에서 하려고 했더니 계속 제대로 동작이 되지 않았다... 따라서 cmd에서 했더니 한번에 되어서 좀 놀랐다. -des3 옵션에 따라 비밀번호 입력은 필수이고, 이번 프로젝트에선 0000으로 설정했다.
아래 명령어로 생성하면 된다.
아래 명령어 중에서
-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%
위 정보는 로컬에서만 돌릴거면 무조건 법적으로 유효한 정보를 입력할 필욘 없다고 합니다.
탐색기(finder)
를 이용하여 MMC(Microsoft Management Console)을 실행합니다. (이때 스냅인에 접근하려면 관리자 권한이 필요하므로, 관리자 권한으로 실행해야 합니다. 만약 그렇지 않으면 스냅인 초기화 실패가 발생합니다.).pem
파일을 선택하고, "타사 루트 인증 기관"을 설정합니다.client-1.local
이라는 이름으로 등록해서 아래처럼 보입니다.err_invalid_authorization
위 에러가 발생하면, 우선
신뢰할 수 있는 루트 인증 기관
과,타사 루트 인증 기관
에 모두 인증서를 가져와서 등록해줘야 합니다. 위 과정을 거쳐야 시스템에서 해당 인증서를 신뢰할 수 있습니다. 가져오는 파일은 저의 경우client-1.local.crt
였습니다. 이를 통해 저는 해결했습니다.
C:\Windows\System32\drivers\etc\hosts
파일을 확인합니다.127.0.0.1 client-1.local
이라고 임의 도메인을 설정합니다.만약 관리자 권한으로 접근하지 않으면 아래와 같은 오류가 발생합니다. 저는 vim 편집기로 편하게 가려고 했는데 실패했네요ㅠ
chmod
도 거부됩니다.
이러한 방식으로 설정할 겁니다. 현재 진행하고 있는 게, https://client-1.local
와 같이 로컬에서 접근하는 걸 구현하고 있는 겁니다.
아래 명령어를 이용하여 새로운 도메인에 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
을 자신의 로컬 서버 도메인 이름으로 수정해줘야 합니다.
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.conf 파일에 접근하여 아래처럼 설정해줍니다.