디지털 인증서(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. 검토 절차가 종료된 후 FingerPrintDigita 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

openssl 개인 키 생성 및 허가권 변경

 

# 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		# 개인 키 경로

Apache 서비스, ssl_conf 파일

 

sudo vim /etc/pki/tls/openssl.cnf

서버 내에 웹 서비스 뿐이 아닌 다른 서비스가 존재한다면,
해당 프로토콜을 지원하는 인증서를 함께 발급하여 인증서를 유효화할 수 있다.

# 클라이언트에서 접속할 수 있도록 방화벽 개방
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 서비스 재시작 시 발생할 수 있는 경고문

오류 메시지의 내용을 읽어보면, 해당 컨텐츠의 내용을 사용자가 읽기 가능하게 하려면
'httpd_user_read_user_content'의 SEboolean 값을 1(참)로 변경하라는 것을 확인할 수 있다.
SELinux 의 Status를 Permissive(0)으로 만들어 해결도 가능하지만 보안상 취약하므로 선호되지 않는다.
(아래에 표기되어 있는 방식대로 SELinux의 보안 레벨을 수정 후 재시작하면 해결)

▼ Web Client Windows 7(.147) 에서의 작업

C:\Windows\System32\drivers\etc\hosts 파일

관리자 권한으로 메모장을 실행한 뒤 해당 경로의 hosts 파일에
CentOS 7의 웹 서버 FQDN을 정의해준다.

CentOS의 사설 인증서를 윈도우 PC로 복사

본래 인증서는 USB나 SMB .. 등의 수단으로 인증서를 옮기지만,
실습 편의를 위해 드래그 앤 드롭 형태로 인증서를 복사하였다.
더블 클릭하여 인증서 등록 과정을 진행한다.

 

외부 인증서를 윈도우 PC에 설치하는 과정

로컬에서 CA의 공식 인증이 아닌 자체적으로 제작된 인증서인 관계로
위의 그림과 같은 경고문을 확인할 수 있는데, 출력된 내용대로
'루트 인증 기관 저장소'에 설치해야 인증서로서의 기능이 적용된다.
(해당 인증서는 Google Chrome에서 사용이 불가했다)

 

(좌)등로된&nbsp; 후의 인증서 / (우)인증서의 정보를 확인

인증서 내용 확인 시, CentOS에서 생성 시 기입했던 내용의 정보와 일치하는 것을 확인할 수 있다.

 

https://www.ditto.com

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

HTTPS(Hyper Text Tranfer Protocol Secure)

네트워크 서비스(웹 사이트, 금융, 공인인증서 ...)를 안전하게 이용할 수 있게 해주는 역할을 하는 방식으로
대부분 네트워크 패킷 전송에 사용되는 TCP 프로토콜에 많은 보안기법을 제공하여 데이터 송수신 시 보안을 향상시켜준다.

TLS(Transport Layer Security)와 SSL(Secure Socket Layer)가 가장 대표적으로 알려져있는데,
SSL의 취약점을 보완되어 보다 안정성이 좋은 버전이 TLS 이다.

평소에 누구나 웹 브라우저(Chrome, Firefox, Whale ...)를 사용한다면 쉽게 접해볼 수 있는 HTTPS와 HTTP의 차이점을 확인

* 해당 실습에서는 Fedora36(10.211.55.20)이 이용되었음


▼ 보안 인증서(*.crt)관련 참고자료

[Security]Digital_Certificate

디지털 인증서(Digital Certifiate) 우리가 웹 사이트나 모바일 뱅킹 등의 서비스를 이용할 때 안전하게 사용할 수 있는 이유로는 TLS(Transport Layer Security) 방식으로 서버와 노드간 주고받는 내용을 암

for-security.tistory.com


● HTTP와 HTTPS

# 웹 사이트 실습을 위한 준비

sudo dnf install -y httpd 
# 로컬 웹 사이트를 활성화하기 위한 httpd 패키지를 다운로드

echo "<h1>This is HTTPS Test Web Site</h1>" > /var/www/html/index.html
# 관리자 권한으로 간단하게 HTML 작성 후 해당 경로로 리다이렉트하여 웹 페이지 생성
# 에디터로 직접 수정해주어도 상관 X

sudo systemctl start firewalld
# 방화벽 설정을 위한 firewalld 서비스 시작

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firweall-cmd --reload
firewall-cmd --list-service
# 로컬 및 외부에서 Fedora(.20)머신의 웹 페이지 접근을 허용하기 위한 방화벽 설정

sudo systemctl restart httpd
# 설정사항 적용을 위하여 서비스를 재시작



먼저 "firefox http://www.google.com"을 일반 사용자의 콘솔창에 입력하여 Google 사이트로 접속

firefox http://www.google.com

일반 사용자 콘솔에서 해당 명령어로 Google 사이트에 접속하면 정상적으로 진입되는 것을 확인
TLS 방식을 사용한 접속이기에 빨간색 네모칸 안에 있는 자물쇠로 해당 사이트에 대한
인증서를 확인해볼 수 있다.

* 'http'로 입력을 요청했지만 접속 시 'https' 로 강제 리다이렉트 되는 것은 ssl.conf 등의 설정으로 인한 이유이다.
해당 내용에 대해서는 추후 기술

자물쇠 버튼 클릭 후 인증서에 대한 내용을 확인

Firefox의 Certificate Manager로 인증서의 정보를 자세히 확인

'Google' 사에서 불특정 다수 이용자의 원활한 접속을 위해서
Firefox 웹 브라우저에 ~.crt(인증서)를 생성하여 클라이언트의 웹 브라우저에 넣어 둔 것인데,
클라이언트와 서버는 대칭키 방식으로 통신 간 데이터를 암호화하고, 공개키로 복호화 한다.

이 방식은 SSH에서 개인 키(Private Key)와 공개 키(Public Key)로
클라이언트와 서버 간 인증을 해주는 원리와 비슷하다.

이번에는 앞에서 미리 만들어 둔 로컬(인증서가 없는) 웹 페이지에 대한 접속방식을 확인해본다.

# 로컬에서 생성한 웹 페이지를 IP가 아닌 FQDN으로 접속하기 위한 /etc/hosts 파일을 수정

sudo vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
10.211.55.20    www.myhomepage.com www # 해당 부분을 추가함

# Name Resolving 시 가장 먼저 로컬에 정의된 /etc/hosts 파일을 참조하기 때문에
# URL 검색 창에 "www.myhomepage.com" 입력 시 앞에서 생성한 웹 페이지로 접근한다.



▼ Name Resolve 관련 참고자료

[Linux]DNS

DNS(Domain Name System) 우리가 흔히 구글링을 하러 구글 웹 사이트에 접속할 때, 123.123.123.123 ... 식의 ip주소를 입력해 웹 사이트에 접근하는 경우는 거의 없다. 이렇듯 복잡한 ip주소 대신 사람이 이용

for-security.tistory.com




"firefox http://www.myhomepage.com"을 일반 사용자의 콘솔창에 입력하여 로컬 웹 페이지로 접속

HTTP로 로컬 웹 페이지에 접속한 모습

해당 그림에서도 볼 수 있듯이 인증서가 없는 HTTP(Plain Text) 웹 페이지로
자물쇠 아이콘에 빨간색 사선이 표시되어 웹 사이트에 대한 인증서 정보가 웹 브라우저에 없다는 것을 확인해볼 수 있다.


이어서 "firefox https://www.myhomepage.com" 을 일반 사용자 콘솔에서 입력하여 웹 페이지 요청을 시도

HTTPS 접속을 시도한 모습

웹 브라우저에 인증서가 저장 되어있지 않은 웹 사이트에 HTTPS 접속 요청 시
해당 그림처럼 연결 불가(Unable to Connect)라는 경고문을 확인해볼 수 있다.

* Firefox 및 그 외 브라우저의 버전별로 경고문의 출력내용이 상이할 수 있음

다른 버전의 Firefox에서 동일한 조건으로 웹 페이지 요청을 시도

해당 버전의 웹 브라우저에서는 인증서 정보가 없는 웹 페이지에 대한 HTTPS 접근 요청 시
보안 연결 실패(Secure Connection Failed)라는 경고문이 출력되는 것을 확인해볼 수 있다.



---> 다음 포스트에서는 디지털 인증서(Digital Certificate) 생성 및 사용에 대한 포스트 진행

'System_Security' 카테고리의 다른 글

[Security]Digital_Certificate  (0) 2023.02.12
[Security]TrueCrypt  (0) 2023.02.02
[Security]SSH_Keygen  (0) 2023.02.01
[Security]chroot  (0) 2023.01.27
[Security]Snort  (0) 2023.01.26

+ Recent posts