디지털 인증서(Digital Certifiate)
우리가 웹 사이트나 모바일 뱅킹 등의 서비스를 이용할 때 안전하게 사용할 수 있는 이유로는
TLS(Transport Layer Security) 방식으로 서버와 노드간 주고받는 내용을 암호화 처리하여
패킷을 가로채더라도 복호화를 해야만 볼 수 있게끔 만들어주는 기술이 적용되기 때문이다.
웹 서버는 클라이언트와 서버의 보안접속을 위해서
대중적으로 많이 사용되는 웹 브라우저(Chrome, Firefox, Whale, MS Edge, Opera ..)에
자신들의 인증서(.crt = Public Key)를 웹 브라우저에 배포해 보안접속을 가능하게 해준다.
실제로 서비스에 사용되는 인증서의 경우는 금액을 지불하고 인증기관(CA)에 요청하여
CA에게 서명을 받은 인증서를 발급받게 되는데, 이런 공인된 인증서를 발급해주는 회사로는
COMODO, VeriSign, DigiCert ... 등의 대표적인 기업이 존재한다.
공인된 인증서의 경우 금액과 복잡성의 리스크가 존재하므로,
이번 실습에서는 로컬 및 집단의 내부에서만 사용되는 인증서 생성 및 배포를 실시
▶ 공인된 인증서의 발급 과정
1. 인증서 발급을 위한 개인 키(Private Key)를 생성
2. 인증서 발급 요청서(*.csr)을 개인 키와 공개 키를 이용하여 생성
(공개 키를 포함한 인증서(*.crt) 생성을 위해서 개인 키로 인증을 실시한다)
3. 생성된 인증서 발급 요청서를 이용하여 인증 기관(CA)에 인증서 인증을 요청
4. 검토 절차가 종료된 후 FingerPrint와 Digita Signing을 인증서에 등록하여 발부
물론 로컬에서 웹 서비스등의 서비스 테스트를 위한 사설 인증서 발급의 경우에는
위의 절차 보다는 편리하게 사설 인증서로 직접 인증서를 생성하여 사용할 수도 있다.
* 실습환경 : Intel i7-1260P(AMD64)
** 네트워크 대역 : 192.168.100.0/24
*** 해당 실습에서 사용된 가상 머신 : CentOS 7(.140 = Web Server), Windows 7(.147 = Web Client)
▼ HTTP(평문장) 연결방식과 HTTPS(암호화) 전송 방식의 차이점 참고자료
[Security]HTTPS
HTTPS(Hyper Text Tranfer Protocol Secure) 네트워크 서비스(웹 사이트, 금융, 공인인증서 ...)를 안전하게 이용할 수 있게 해주는 역할을 하는 방식으로 대부분 네트워크 패킷 전송에 사용되는 TCP 프로토콜
for-security.tistory.com
● 개인 키와 서명 인증 요청서 생성
# openssl 패키지 다운로드 및 수동설치
sudo wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz
sudo tar xvfz openssl-1.1.1t.tar.gz
# www.ditto.com의 개인 키 생성
sudo openssl genrsa -out www.ditto.com.key 2048 # 2048은 키의 복잡도를 의미
# 개인키의 보안을 위한 허가권 변경
sudo chmod 600 www.ditto.com.key
# 개인 키를 암호화 포맷으로 저장하는 방법
sudo openssl rsa -in www.ditto.com.key -des3 -out www.ditto.com.key.secure.key
# sha256 암호화 알고리즘이 적용된 서명 인증 요청서를 생성
sudo openssl req -new -sha256 -key www.ditto.com.key -out www.ditto.com.csr
위의 두 파일을 사용하여 공인 기관(CA)를 통한 기간제 무료 인증서 발급이 가능하며,
해당 기관의 인증을 받은 인증서는 실제 웹 서비스 호스팅 시 사용이 가능하다.
▼ 로컬 도메인에서만 사용 가능한 사설 인증서 발급과정
# 앞에서 생성한 개인 키로 자체적으로 인증서(*.crt)를 발급
# x509는 공개키 알고리즘의 표준(방식)
sudo openssl req -new -sha256 -x509 -nodes -days 365 -key www.ditto.com.key -out www.ditto.com.crt
# 인증서 발급 시 기재사항
# Country Name ~ Email Address까지 순서대로 국가, 도시, 지역(구), 조직이름, 부서명, 이메일을 의미함
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter the field will be left blank.
---
Country Name (2 letter code) [XX]:KR
State or Province Name (full name) []:Seoul
Locality Name (eg, city) [Default City]:Mapo
Organization Name (eg, company) [Default Company Ltd]: Company
Organizational Unit Name (eg, section) []:Security
Common Name (eg, your name or your server's hostname) []:www.ditto.com
Email Address J:admin@ditto.com
# 생성된 인증서의 내용을 확인
sudo openssl ×509 -noout -text -in www.ditto.com.crt
# 보안을 위해 허가권과 저장 경로를 변경
sudo cp -arp www.ditto.* /etc/pki/tls/private
sudo chmod 600 -R /etc/pki/tls/private/*
# mod_ssl 패키지 다운로드
sudo yum install -y mod_ssl
# Apache 구성파일 중, /etc/httpd/conf.d/ssl_conf 파일 수정
sudo vim /etc/httpd/conf.d/ssl_conf
[파일 내용]
95 # Server Certificate:
96 # Point SSLCertificateFile at a PEM encoded certificate. If
97 # the certificate is encrypted, then you will be prompted for a
98 # pass phrase. Note that a kill -HUP will prompt again. A new
99 # certificate can be generated using the genkey (1) command.
100 SSLCertificateFile/etc/pki/tls/private/www.ditto.com.crt # 인증서 경로
101
102 #Server Private Key:
103 #If the key is not combined with the certificate, use this
104 #directive to point at the key file. Keep in mind that if
105 #you've both a RSA and a DSA private key you can configure
106 #both in parallel (to also allow the use of DSA ciphers, etc.)
107 SSLCertificateKeyFile/etc/pki/tls/private/www.ditto.com.key # 개인 키 경로
서버 내에 웹 서비스 뿐이 아닌 다른 서비스가 존재한다면,
해당 프로토콜을 지원하는 인증서를 함께 발급하여 인증서를 유효화할 수 있다.
# 클라이언트에서 접속할 수 있도록 방화벽 개방
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
# 포트 개방상태를 확인
sudo netstat -nltp | grep LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 80/httpd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 443/httpd
# 간단한 웹 페이지를 생성
[centos@localhost ~]$ su -c "echo \"<h1>This is Ditto's Web For test Certificates</h1>\" > /var/www/html/index.html"
[centos@localhost ~]$ cat /var/www/html/index.html
<h1>This is Ditto's Web For test Certifiacate</h1>
# httpd 서비스 재시작 후 상태확인
sudo systemctl restart httpd
sudo systemctl status httpd
오류 메시지의 내용을 읽어보면, 해당 컨텐츠의 내용을 사용자가 읽기 가능하게 하려면
'httpd_user_read_user_content'의 SEboolean 값을 1(참)로 변경하라는 것을 확인할 수 있다.
SELinux 의 Status를 Permissive(0)으로 만들어 해결도 가능하지만 보안상 취약하므로 선호되지 않는다.
(아래에 표기되어 있는 방식대로 SELinux의 보안 레벨을 수정 후 재시작하면 해결)
▼ Web Client Windows 7(.147) 에서의 작업
관리자 권한으로 메모장을 실행한 뒤 해당 경로의 hosts 파일에
CentOS 7의 웹 서버 FQDN을 정의해준다.
본래 인증서는 USB나 SMB .. 등의 수단으로 인증서를 옮기지만,
실습 편의를 위해 드래그 앤 드롭 형태로 인증서를 복사하였다.
더블 클릭하여 인증서 등록 과정을 진행한다.
로컬에서 CA의 공식 인증이 아닌 자체적으로 제작된 인증서인 관계로
위의 그림과 같은 경고문을 확인할 수 있는데, 출력된 내용대로
'루트 인증 기관 저장소'에 설치해야 인증서로서의 기능이 적용된다.
(해당 인증서는 Google Chrome에서 사용이 불가했다)
인증서 내용 확인 시, CentOS에서 생성 시 기입했던 내용의 정보와 일치하는 것을 확인할 수 있다.
https 프로토콜로 접속 시 서버와의 연결이 암호화 되었다는 안내문구를 확인할 수 있음
'System_Security' 카테고리의 다른 글
[Security]TrueCrypt (0) | 2023.02.02 |
---|---|
[Security]SSH_Keygen (0) | 2023.02.01 |
[Security]HTTPS (0) | 2023.01.31 |
[Security]chroot (0) | 2023.01.27 |
[Security]Snort (0) | 2023.01.26 |