[ openssl 자가인증서 구축 ] CA 인증서를 자가 서명한 뒤 자가 인증서로 웹 서버 Apache2에 적용할 인증서 생성하고 CA 루트 인증서 예외 처리하기 - Whitmem
[ openssl 자가인증서 구축 ] CA 인증서를 자가 서명한 뒤 자가 인증서로 웹 서버 Apache2에 적용할 인증서 생성하고 CA 루트 인증서 예외 처리하기
System
2023-06-18 03:28 게시 a0569fd3a3ef6b7a3d82

0
0
91
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
서론
이 게시물에서는 직접 CA인증서와 자가 서명 인증서를 만든 뒤 내부망에서 인증서 경고가 뜨지 않도록 하는 방법에 대해 설명합니다.
기본적으로 웹 서버를 설치하고 자가 서명된 인증서를 아무거나 적용하여 서버를 운영하여도 경고 메시지가 뜰 뿐 암호화는 정상적으로 수행됩니다. 하지만 완전한 내부망이 아닌 경우 중간자 공격 등에 의해 서버가 위조된 경우 위조된 사실을 알아차리지 못할 가능성이 존재합니다. 서버가 위조된 경우에 경고 메시지를 띄우는데, 자가 서명된 인증서는 애초에 처음부터 경고 메시지를 띄우기 때문에 인증서가 위조되더라도 똑같은 경고 메시지가 뜰 것이고, 이를 정상적인 서버 인증서로 오해하여 계속 접속하거나, 예외 사항으로 추가할 가능성이 매우 높기 때문입니다.
그렇기 때문에 CA인증서와 자가 서명된 인증서를 직접 발급하고, CA 인증서는 본인이 신뢰하는 기기에 신뢰할 수 있는 루트 인증서로 등록함으로써 혹시 모른 인증서 위조에 대비하는 것이 매우 좋습니다.
이 게시물에서는 편의상 sudo 관리자 모드로 작업을 진행했습니다.
1. CA 인증서의 생성
CA 인증서를 생성하기 위해서, OpenSSL이 필요합니다. 적당한 위치에 들어간 뒤 작업을 진행합니다. 저는 /ssl/ 폴더에 작업을 진행할 것이기 때문에 해당 위치에 폴더를 만들고 cd 명령으로 작업 디렉터리를 변경합니다.
작업 디렉터리 설정
개인키 생성
먼저 CA 루트 인증서의 개인 키를 생성해야 합니다. 이 개인 키로 일반적인 서버의 인증서를 서명하기 때문에 무엇보다 CA 루트의 개인 키를 안전하게 보관해야 합니다. CA 루트키가 유출되는 경우, 제 3자가 불법 서버에 대해 인증서를 만들 수 있게 되기 때문에 사실상 인증서의 신뢰의미는 사라집니다.
$ openssl genrsa -out ca-certification.key 4096
끝의 숫자는 RSA 암호 강도를 의미합니다. 보통 1024 2048 4096 중에서 선택합니다. 숫자가 높아질 수록 인증서의 암호 강도는 강해집니다만, 속도가 느려집니다. 보통은 2048을 많이 사용합니다.
ca-certification.key 가 생성된 모습
성공적으로 생성이 완료되면 ca-certification.key가 생성됩니다.
요청서 생성
다음으로 개인 키를 활용하여 어떤 인증서를 만들 것인지에 대한 요청 정보를 담은 csr을 생성해야 합니다.
$ openssl req -new -out ca-certificaiton.csr -key ca-certification.key
출력 모습
해당 명령어를 입력하면 요청서를 생성합니다. 그 과정에서 필요한 몇 가지 정보를 요구합니다. 어차피 사설 인증서이기 때문에 저는 간단하게 저의 사이트 이름 또는 닉네임으로 지정하였습니다.
Country Name (2 letter code) [AU]:KR State or Province Name (full name) [Some-State]:whitmem Locality Name (eg, city) []:whitmem Organization Name (eg, company) [Internet Widgits Pty Ltd]:whitmem Organizational Unit Name (eg, section) []:whitmem Common Name (e.g. server FQDN or YOUR name) []:whitmem root Email Address []:help@whitmem.xyz
끝의 A challenge passwordAn optional company name은 전 비워두었습니다.
출력
생성이 완료되면 ca-certification.csr가 생긴 모습을 확인할 수 있습니다.
csr가 생긴 모습
인증서 생성
마지막으로 CA 인증서를 생성합니다. 개인키와 요청서를 혼합하여 새 자가 서명된 CA 루트 인증서를 발급받습니다. 이 때 3650일의 인증서 기간을 발급하여 적어도 3650일 동안은 편하게 사용할 수 있도록 하겠습니다.
$ openssl x509 -req -out ca-certification.crt -in ca-certification.csr -signkey ca-certification.key -days 3650
인증서 생성
결과적으로 3개의 ca-certification.crt [.rp]ca-certification.csr ca-certification.key가 생성된 것을 볼 수 있습니다. 참고로 여기서 ca-certification.csr 는 더 이상 필요가 없습니다.
생성된 CA 인증서들
2. CA 인증서와 함께 자가 서명된 서버 인증서 생성
이제 앞에서 만든 CA 인증서를 활용하여 Apache2 등에서 사용 가능한 서버용 자가 서명된 서버 인증서를 만들어봅시다. 기본적으로 CA 인증서뿐만 아니라 앞서 생성한 CA 키 파일도 같이 있어야 CA로 인증된 서버 인증서를 생성할 수 있습니다.
개인키 생성
먼저 서버 인증서에서 사용할 개인키를 생성합니다.
$ openssl genrsa -out server.key 4096
서버 개인키 생성
인증 요청서 생성
다음으로 CA와 동일하게 인증 요청서를 생성합니다.
$ openssl req -new -out server.csr -key server.key
요청서 생성
끝의 A challenge passwordAn optional company name은 전 비워두었습니다.
중요 도메인 또는 내부 IP 선언
제일 중요한 파트입니다. 이 파트를 진행하지 않으면 추후 루트 인증서를 신뢰할 수 있는 인증서로 지정하더라도 브라우저에서 ERR_CERT_COMMON_NAME_INVALID 오류를 띄우면서 잘못된 인증서라고 차단합니다.
먼저 작업하던 공간에서 ssl.cnf와 같은 파일을 하나 만듭니다.
파일 생성
그런 뒤 여기에 서버의 IP 주소를 선언해야 합니다. 서버 IP는 이 인증서가 담긴 웹 서버의 IP를 의미하며, 이는 곧 외부에서 접속할 때의 서버 아이피를 의미합니다. 즉 현재 목표는 내부망에서를 목적으로 하기 때문에 내부망에서 접속하는 IP 주소를 선언해야 합니다. 저 같은 경우 내부 망의 웹 서버 192.168.61.128의 인증서를 만들고 있기 때문에 다음과 같이 입력하겠습니다.
ssl.cnf 의 내용
subjectAltName = @altnames [ altnames ] IP.1 = 192.168.61.128
만약 접속 대상인 IP가 여러 개인 경우, IP.2 = *, IP.3 = * 형태로 추가하시면 됩니다. 예를 들어, 이 웹 서버에 192.168.61.128192.168.62.128로도 접속할 수 있는 경우 둘 다 인증서의 허용 가능 IP (SAN)로 등록하고자 하는 경우 다음과 같이 입력합니다.
subjectAltName = @altnames [ altnames ] IP.1 = 192.168.61.128 IP.2 = 192.168.62.128
만약, IP 주소가 아닌 내부 DNS가 있어, 도메인으로 따로 표시하는 경우 DNS.1 과 같이 표시합니다.
subjectAltName = @altnames [ altnames ] IP.1 = 192.168.61.128 IP.2 = 192.168.62.128 DNS.1 = test.whitmem.xyz
이의 경우, 192.168.61.128 192.168.62.128 test.whitmem.xyz의 주소로 접속하는 아이피에 대해 신뢰할 수 있도록 선언하게 됩니다.
작성이 완료되면 vim기준 esc, :wq을 입력하여 통해 저장을 합니다.
여기까지 왔으면 다음과 같이 파일이 존재합니다.
파일 목록
서버용 개인키로 CA로 서명된 자가 서명 인증서 서명
마지막 단계 입니다. 이때동안 만들었던 CA 정보와 자가 서버 키를 모두 활용하여 서버용 인증서를 만듭니다. 기간은 3650일 동안 서버 인증서를 바꾸지 않을 것이기에, 3650일로 지정합니다.
$ openssl x509 -req -out server.crt -in server.csr -CA ca-certification.crt -CAkey ca-certification.key -extfile ssl.cnf -days 3650
인증서 생성
인증서가 성공적으로 생성되면 Certificate request self-signature ok 메시지가 표시됩니다.
모든 파일
결과적으로 총 7개의 파일이 존재하며 여기서 계속 남겨둬야 할 파일은 ca-certification.crt ca-certification.key server.crt server.key 입니다. server 인증서는 뒤에 적용할 대상 서버에만 사용하기 위해 생성한 것이지만, ca 인증서는 추후 다른 서버에 적용할 인증서를 생성할 때 계속 이용할 수 있습니다. 즉 ca인증서는 루트 인증서이기 때문에 본인이 영구적으로 가지고 있으면서 서버를 추가하거나 관리할 때 마다 계속 사용할 수 있습니다.
3. Apache2 서버에 적용
Apache2 서버에 적용을 하기 위해서는 SSL 모드가 활성화되어 있어야 합니다. SSL 를 활성화 하는 방법에 대해서는 https 통신을 위한 SSL 모드 활성화 방법을 담은https://whitmem.kr/read/155을 참조 해 보세요.
본인의 서버의 Apache2 서버의 ssl 사이트 conf 를 열고 인증서 경로를 수정합니다.
저 같은 경우 ssl-server.conf로 지정 해 뒀기 때문에 해당 파일을 엽니다. 자세한 것은 위 https 통신을 위한 SSL 모드 활성화 방법을 참고하세요.
그런 뒤 SSLCertificateFile에는 공개 인증서인 server.crt의 경로를, SSLCertificateKeyFile에는 서버의 비밀키인 server.key의 경로를 정의 합니다. 주의 할 것은 여기에 CA 키나 CA 인증서를 넣지 않도록합니다. CA 인증서는 서버 인증서를 생성할 때 사용되는 인증서 생성 목적일 뿐, 실제 서버를 열 때 적용되거나 이용되지 않습니다.
서버 인증서 적용
서버 인증서를 적용하였다면 저장하고 Apache2 서버를 재 시작합니다.
$ sudo systemctl stop apache2 $ sudo systemctl start apache2
그런 다음, apache2 서버가 제대로 열렸는지 확인합니다.
$ sudo systemctl status apache2
서버가 열린 모습
정상적으로 열렸다면, 사이트에 접속 해 봅니다.
4. 신뢰할 수 있는 루트 인증서 추가
여기까지 모두 제대로 되었다면, 인증서는 적용되었지만 아래와 같은 오류가 발생합니다.
연결이 비공개로 설정되어 있지 않습니다.
공격자가 192.168.61.128에서 정보(예: 비밀번호, 메시지, 신용카드 등)를 도용하려고 시도 중일 수 있습니다. 자세히 알아보기 NET::ERR_CERT_AUTHORITY_INVALID
NET::ERR_CERT_AUTHORITY_INVALID 오류에서 알 수 있듯 신뢰할 수 있는 인증서라고 뜹니다. 우리가 생성한 사설 인증서는 공식으로 발급받은 인증서가 아니기 때문에 해당 인증서의 루트 인증서를 접속하고자 하는 컴퓨터 클라이언트의 신뢰할 수 있는 인증서에 등록해야 합니다.
루트 인증서 다운로드
먼저 맨 처음 서버에서 생성한 CA 인증서ca-certification.crt를 접속하고자 하는 컴퓨터에 다운로드하거나 복사합니다.
서버에서 내려받은 ca-certification.crt 파일
이 파일을 더블클릭하여 인증서 정보 창을 엽니다.
인증서 창
신뢰 할 수 없다는 메시지가 뜨는데, 인증서 설치 버튼을 눌러 설치를 진행합니다.
Step1. 저장소 위치
처음으로 저장소 위치가 뜨는데, 본인 컴퓨터의 해당 계정에만 등록하려면 "현재 사용자"를 선택, 컴퓨터 자체에 전역으로 등록하려면 "로컬 컴퓨터"를 선택합니다.
Step2. 인증서 저장소 선택
"모든 인증서를 다음 저장소에 저장 (P)"를 체크하고 인증서 저장소 찾아보기를 누릅니다.
모든 인증서를 다음 저장소에 저장 선택
찾아보기를 누른 뒤 새 창이 뜨면, "신뢰할 수 있는 루트 인증 기관"을 선택하고 확인합니다.
신뢰할 수 있는 루트 인증 기관 선택
마지막으로 마침 버튼을 눌러 등록합니다.
다음과 같은 경고 메시지가 뜨는데, 예를 누릅니다.
--------------------------- 보안 경고 --------------------------- CA(인증 기관)로부터 다음을 위한 인증서를 설치하려고 합니다. whitmem root 인증서가 실제로 "whitmem root"에서 제공된 것인지 확인할 수 없습니다. "whitmem root"에 문의하여 출처를 확인해야 합니다. 다음 숫자는 이 과정에 도움이 됩니다. 지문(sha1): ****** ****** ******** ******* 경고: 이 루트 인증서를 설치하면 이 CA에서 발급된 모든 인증서가 자동으로 신뢰됩니다. 확인되지 않은 지문을 가진 인증서를 설치하는 것은 보안상 위험합니다. 이 위험 사항을 인정하면 "예"를 클릭하십시오. 이 인증서를 설치하시겠습니까? --------------------------- 예(Y) 아니요(N) ---------------------------
CA 인증 기관은 인증할 수 있는 인증서만 등록해야 합니다. 우리가 방금 만든 인증서는 나 자신이 만든 것이기 때문에 본인이 만든 것이라는 사실이 명확하므로 등록합니다. 인터넷에서 다운로드 받은 루트 인증서의 경우, 정말 해당 루트 인증서가 해당 발급자가 맞는지, 의도한대로 동작하는게 맞는지 확인하는 것이 좋습니다.
--------------------------- 인증서 가져오기 마법사 --------------------------- 가져오기를 완료했습니다. --------------------------- 확인 ---------------------------
브라우저 또는 시스템 재 시작후 재 접속
이제 브라우저 또는 시스템을 재 시작한 후 사이트에 접속 해 봅니다. 크롬 브라우저의 경우 세션이 남아있기 때문에 브라우저를 모두 닫고 프로세스를 모두 닫은 뒤 재 접속 해야 합니다.
인증된 모습
안전하게 접속된 모습을 확인할 수 있습니다. 이제 외부 제 3자에 의해 서버가 공격되거나 중간자 공격에 의해 서버가 위조되는 경우 해당 루트 인증서를 벗어나기 때문에 경고 메시지가 뜨게 될 것 입니다!
사용한 명령어 정리
#CA 개인키 생성 $ openssl genrsa -out ca-certification.key 4096 #CA 요청서 생성 $ openssl req -new -out ca-certificaiton.csr -key ca-certification.key #CA 인증서 발급 $ openssl x509 -req -out ca-certification.crt -in ca-certification.csr -signkey ca-certification.key -days 3650 #서버 개인키 생성 $ openssl genrsa -out server.key 4096 #서버 요청서 생성 $ openssl req -new -out server.csr -key server.key #서버 인증서의 서버 SAN(IP) 선언 echo -e "subjectAltName = @altnames\n\ \n\n\ [ altnames ]\n\ IP.1 = 내부IP주소" > ssl.cnf #서버 인증서 발급 $ openssl x509 -req -out server.crt -in server.csr -CA ca-certification.crt -CAkey ca-certification.key -days 3650 -extfile ssl.cnf
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.