2.Openssl 활용 HTTPS 적용 실습
openssl 을 활용하여 자체적인 인증기관 및 인증서용 키를 생성하고, HTTPS가 적용되어 통신되는지 확인하는 실습 진행
로컬 인증기관(CA) 생성
1. CA 개인키 생성
openssl genrsa -out rootCA.key 4096인증기관에서 사용할 개인 키(PRIVATE KEY) 생성
CA가 인증서에 서명할 때 사용되며, 외부에 절대 공개되면 안됨
2. CA 인증서 생성(자체 서명)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt비밀키(rootCA.key)를 가지고 공개키 인증서(rootCA.crt)로 변환
브라우저가 신뢰해야 할 최상위 루트 인증서
즉, rootCA.crt는 브라우저에 등록해야 하는 나만의 최상위 인증기관(Root)에서 발급한 인증서라고 보면 됨
서버 인증서용 키 생성
openssl genrsa -out server.key 2048서버 인증서용 키는 서버 자체의 개인 키(PRIVATE KEY)를 말함
이후 TLS 핸드셰이킹 과정에서 클라이언트가 보낸 비밀정보(PreMasterSecret or DH 값 등)를 복호화하는 데 사용됨
CSR 작성(SAN 포함)
CSR(Certificate Signing Request)이란 서버가 CA에게 인증서를 만들어달라고 요청하는 문서
CSR 내부에는 다음의 항목들이 들어있음
- 서버의 공개키
- 서버의 도메인 정보(CN, SAN)
- 서버의 신원 정보
1. 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에게 인증서를 서명해달라고 부탁하는 메시지
openssl req -new -key server.key -out server.csr -config server.csr.cnfCSR 생성 후, 서버는 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 지원
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.12. 서버 인증서 생성(서명)
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 등록