Skip to Content
Suffering builds character
아카이브6.HTTPHTTPS실습2.Openssl 활용 HTTPS 적용 실습

2.Openssl 활용 HTTPS 적용 실습

openssl을 활용하여 자체적인 인증기관 및 인증서용 키를 생성하고, HTTPS가 적용되어 통신되는지 확인하는 실습 진행

로컬 인증기관(CA) 생성

1. CA 개인키 생성

terminal
openssl genrsa -out rootCA.key 4096

인증기관에서 사용할 개인 키(PRIVATE KEY) 생성

CA가 인증서에 서명할 때 사용되며, 외부에 절대 공개되면 안됨

2. CA 인증서 생성(자체 서명)

terminal
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt

비밀키(rootCA.key)를 가지고 공개키 인증서(rootCA.crt)로 변환

브라우저가 신뢰해야 할 최상위 루트 인증서

즉, rootCA.crt는 브라우저에 등록해야 하는 나만의 최상위 인증기관(Root)에서 발급한 인증서라고 보면 됨

서버 인증서용 키 생성

terminal
openssl genrsa -out server.key 2048

서버 인증서용 키는 서버 자체의 개인 키(PRIVATE KEY)를 말함

이후 TLS 핸드셰이킹 과정에서 클라이언트가 보낸 비밀정보(PreMasterSecret or DH 값 등)를 복호화하는 데 사용됨

CSR 작성(SAN 포함)

CSR(Certificate Signing Request)이란 서버가 CA에게 인증서를 만들어달라고 요청하는 문서

CSR 내부에는 다음의 항목들이 들어있음

  • 서버의 공개키
  • 서버의 도메인 정보(CN, SAN)
  • 서버의 신원 정보

1. cnf 파일 생성

server.csr.cnf
[req] default_bits = 2048 # 키 길이 prompt = no # 인터랙티브 질문 없이 자동 생성 default_md = sha256 # 서명 알고리즘 req_extensions = req_ext distinguished_name = dn [dn] CN = localhost # 서버의 대표 도메인 [req_ext] subjectAltName = @alt_names # SAN 확장 필드 사용 [alt_names] DNS.1 = localhost IP.1 = 127.0.0.1

Chrome은 SAN이 없으면 인증서를 거부하기 때문에 SAN을 포함해야 함
SAN(Subject Alternative Name) - DNS, IP 주소 등

2. CSR 생성

CSR이란 서버가 자신의 공개키와 자신의 식별 정보(주체, Subject)를 기반으로 CA에게 인증서를 서명해달라고 부탁하는 메시지

terminal
openssl req -new -key server.key -out server.csr -config server.csr.cnf

CSR 생성 후, 서버는 CA에게 인증서를 만들어달라고 요청을 전송함

server.csr 내부에 서버의 공개키와 SAN 정보가 담겨있음

CA는 CSR을 서명하여 서버 인증서 생성

CA가 CSR을 받아서 인증서(server.crt)를 만들어주는 과정이 진행됨
→ CA는 서버가 사용할 서버 인증서에 자신(CA)의 전자서명 기입

1. server.ext 파일 생성

CSR은 요청서, ext는 “인증서에 넣을 정책”

이 파일은 CSR과 별개의 인증서에 붙는 메타정보(확장 필드)로, 핵심 항목은 다음과 같음

  • basicConstraints = CA:FALSE
    → 이 인증서는 서버용이지 CA 인증서가 아님

  • extendedKeyUsage = serverAuth
    → 이 인증서는 서버 인증용임

  • subjectAltName
    → SAN 필드
    → localhost/127.0.0.1 지원

server.ext
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = localhost IP.1 = 127.0.0.1

2. 서버 인증서 생성(서명)

terminal
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext

→ 인증 기관인 CA(rootCA.crt + rootCA.key)가 server.csr 내용을 보고 server.crt 인증서를 발급함

위 명령어의 결과물로 생성된 server.crt는 localhost 서버의 신원 + 서버 공개키 + CA 서명을 포함한 서버용 인증서로 활용됨

이제 HTTPS 서버가 사용할 인증서/키쌍으로 server.crt와 server.key가 완성됨

각 OS 별로 CA를 신뢰할 수 있는 루트 인증기관에 등록

Windows 기준, 시작 메뉴에서 certmgr.msc 입력

신뢰할 수 있는 루트 인증기관 -> 인증서 -> 가져오기 -> roogCA.crt 등록

MacOS 키체인으로 인증서 추가하기

와이어샤크를 통해 HTTPS 통신이 적용되었는지 확인

Last updated on