728x90
HTTPS (HTTP Secure)
- HTTP 프로토콜의 암호화된 버전
- 클라이언트와 서버 간의 모든 커뮤니케이션을 암호화 하기 위하여 SSL 이나 TLS 를 사용한다.
- SSL (Secure Socket Layer)
- 넷스케이프사에서 개발한 인터넷 보안 프로토콜
- TLS (Transport Layer Security)
- SSL 이 표준화 되면서 바뀐 이름
HTTPS 암호화 방식
- 클라이언트 → 서버로 랜덤 데이터와 사용 가능한 암호화 방식을 보낸다.
- 서버 → 클라이언트로 랜덤 데이터, 사용할 암호화 방식과 SSL 인증서를 보낸다.
- 클라이언트는 서버에게 받은 인증서의 CA 가 자신이 들고 있는 CA 리스트에 있는지 확인하고, 있다면 CA 의 공개키로 복호화한다. 이는 곧 CA 비밀키에 의해 암호화됐다는 것이므로 인증서의 신원을 보증해준다. (공개키 암호화 방식)
- 클라이언트는 자기가 보낸 랜덤 데이터와 서버로부터 받은 랜덤 데이터를 조합하여 임시 키(pre master secret key) 를 만든다.
- 만들어진 임시 키를 인증서의 공개키로 암호화하여 서버에게 보낸다.
- 서버는 자신이 들고 있던 비밀 키로 임시 키를 복호화한다.
- 이로써 클라이언트와 서버는 동일한 임시 키를 공유하게 되는데, 일련의 과정을 거쳐 master secret 값을 만들고 세션 키를 생성한다.
- 이렇게 만들어진 세션 키로 암호화된 데이터를 주고받는다. (대칭키 암호화 방식)
- 세션이 종료되면 클라이언트와 서버 모두 세션 키를 폐기한다.
HTTPS 구성
- SSL/TLS 지원 활성화를 위해 확장 모듈을 설치한다.
- mod_ssl 패키지 설치
- $ yum install mod_ssl
- 443/TCP에서 대기하는 기본 가상 호스트에 대해 httpd를 자동으로 활성화
- $ systemctl start httpd
$ systemctl enable httpd
$ firewall-cmd --add-service=https
$ firewall-cmd --relaod - /etc/httpd/conf.d/ssl.conf 파일에서 ssl 환경 설정을 할 수 있다.
- SSLEngine
- SSL/TLS 프로토콜 엔진의 사용여부를 설정합니다.
- SSLProxyEngine
- 프록시를 이용한 SSL/TLS 프로토콜 엔진 사용여부를 설정합니다.
- 프록시를 이용하고 싶다면 on 설정을 해야합니다.
- SSLProtocol
- 사용가능한 SSL/TLS 프로토콜 버전을 설정합니다.
SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3, all
- all
- OpenSSL 1.0.1 이상버전
- +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2
- OpenSSL 1.0.1 미만버전
- +SSLv3 +TLSv1
- OpenSSL 1.0.1 이상버전
+all -SSLv3
=TLSv1, TLSv1.1, TLSv1.2
- TLSv1.3은 OpenSSL 1.1.1 이상 버전부터 지원합니다.
- SSLCertificateKeyFile
- private key(비밀키)
- SSLCertificateFile
- 서버인증서
- SSLCACertificateFile
- 루트 CA 인증서
- 체인인증서와 루트CA인증서를 하나로 통합해서 설정해도 됩니다.(통합했을 경우에는 체인인증서는 설정하지 않습니다.)
- SSLCertificateChainFile
- 체인인증서
- SSLEngine
인증서
- 자체 서명된 인증서를 만들거나 CA 에 요청해서 서명을 받아 만드는 방법이 있다.
- openssl 도구를 사용해서 인증서를 생성하는 방법
- 개인 키 생성
openssl genrsa [-aes256, des3..] -out 비밀키 bit크기
- RSA 알고리즘을 사용하여 pirvate key 를 생성하고, SSL/TLS 인증서를 설치할 서버의 SSLCertificateKeyFile 에 공개 키를 설정하고, SSL/TLS 인증서를 발급해주는 사이트에 이 비밀키와 짝을 이루는 공개키를 제출한다.
$ openssl genrsa -out private.key 2048
$ file private.key
private.key: PEM RSA private key - 생성된 키로 발급 요청서(csr) 생성
openssl req -new -key /etc/pki/tls/private/demo.key -out /etc/pki/tls/certs/demo/demo.csr
csr 은 Certificate Signing Request 의 약자로, 서버 인증서의 발급신청을 위해 인증기관에게 보낼 요청 파일이다. 이 csr 파일은 인증서에 설정할 서버의 정보와 개인 키와 짝을 이룰 공개 키 내용을 포함하고 있다.
$ openssl req -new -key private.key -out cert.csr # 발급 신청서 작성
$ openssl x509 -req -signkey private.key -in cert.csr -out cert.crt- Country Name (2 letter code)
- 2자로 약속된 국가 코드를 작성합니다.
- 대한민국은 KR 입니다.
- State or Province Name (full name)
- 주나 시이름을 작성합니다.
- ex) Seoul
- Locality Name (eg, city)
- 구나 군이름을 작성합니다.
- ex) Seoul
- Organization Name (eg, company)
- 기관명을 작성합니다.
- Organizational Unit Name (eg, section)
- 조직명을 작성합니다.
- ex) Dev
- Email Address
- 이메일을 작성합니다.
- Country Name (2 letter code)
- 생성된 key 파일, csr 파일, crt 파일 모두 아래에 지정된 경로에 저장해 둔다.
- /etc/pki/tls/private/ : 개인 키를 저장하는 디렉토리로, chmod 600 또는 400 으로 key 파일들 사용권한을 수정
- /etc/pki/tls/certs/ : 서명 요청할 때 생성되는 CA 로 보내는 파일들을 보낸다.(csr, 서명용 파일들)
- /etc/pki/tls/certs/ : 공개 인증서, 자체 서명된 인증서가 요청될 때만 서명 요청이 있고 CA로 전송될 때 CA 에서 반환되는 파일 chmod 644 로 crt 파일 권한 수정
- 개인 키 생성
https 실습
# ssl 패키지 설치
$ yum -y install mod_ssl
$ openssl genrsa -out private.key 2048
$ openssl req –new –key private.key –out cert.csr
$ openssl x509 –req –signkey private.key –in cert.csr –out cert.crt
$ chmod 600 private.key cert.crt
$ mv private.key /etc/pki/tls/private/
$ mv cert.* /etc/pki/tls/certs/
----------------------------------------------------
$ vi /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>
DocumentRoot "/var/www/html" => # 제거
ServerName server.test.example.com:443 => # 제거 후에 server.test.example.com:443 으로 변경
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
SSLCertificateFile /etc/pki/tls/certs/localhost.crt => cert.crt 으로 변경
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key => private.key 로 변경
:wq
----------------------------------------------------------
만약 가상 호스트를 사용하고 있을 경우에는 아래와 같이 처리해준다.
$ vi /etc/httpd/conf.d/00-vhost.conf
<VirtualHost *:80>
DocumentRoot /var/www/html0
ServerName vhost0.test.example.com
ServerAlias vhost0
RewriteEngine On => 추가
RewriteCond %{HTTPS} off => 추가
RewriteRule ^(.*)$https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] => 추가
</VirtualHost>
<Directory /var/www/html0>
AllowOverride None
Require all granted
</Directory>
:wq
----------------------------------------------------------------
$ vi /etc/httpd/conf.d/01-vhost.conf
<VirtualHost *:80>
DocumentRoot /var/www/html1
ServerName vhost1.test.example.com
ServerAlias vhost1
RewriteEngine On => 추가
RewriteCond %{HTTPS} off => 추가
RewriteRule ^(.*)$https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] => 추가
</VirtualHost>
<Directory /var/www/html1>
AllowOverride None
Require all granted
</Directory>
:wq
----------------------------------------------------------
$ systemcl restart httpd
$ firewall-cmd --add-service=https --permanent
$ firewall-cmd --reload
728x90