컬쥐네 다락방

리눅스 | HTTPS (HTTP Secure) 본문

클라우드/리눅스

리눅스 | HTTPS (HTTP Secure)

코딩하는 갱얼쥐 2022. 3. 11. 14:11

HTTP protocol의 암호화된 버전

클라이언트와 서버간의 모든 커뮤니케이션을 암호화하기 위해 SSL이나 TLS을 사용한다.

SSL (Secure Socket Layer)

넷스케이프사에서 개발한 인터넷 보안 프로토콜

TLS (Transport Layer Security)

SSL이 표준화 되면서 바뀐 이름

HTTPS 암호화 방식 과정

1. 클라이언트 -> 서버로 랜덤 데이터와 사용 가능한 암호화 방식을 보낸다.

2. 서버 -> 클라이언트로 랜덤 데이터, 사용할 암호화 방식과 SSL 인증서를 보낸다.

3. 클라이언트는 서버에게 받은 인증서의 CA가 자신이 들고 있는 CA 리스트에 있는지 확인하고, 있다면 CA의 공개키로 복호화한다. (공개키 암호화 방식)

4. 클라이언트는 자기가 보낸 랜덤 데이터와 서버로부터 받은 랜덤 데이터를 조합하여 임시 키(pre master secret key)를 만든다.

5. 만들어진 임시 키를 인증서의 공개키로 암호화하여 서버에게 보낸다.

6. 서버는 자신이 들고 있던 비밀키로 임시 키를 복호화한다.

7. 이로써 클라이언트와 서버는 동일한 임시 키를 공유하게 되는데, 일련의 과정을 거쳐 master secret 값을 만들고 세션 키를 생성한다.

8. 이렇게 만들어진 세션 키로 암호화된 데이터를 주고 받는다. (대칭키 암호화 방식)

9. 세션이 종료되면 클라이언트와 서버 모두 세션 키를 폐기한다.

 

HTTPS 관련 방화벽 설정

1. https 서비스 설정

2. 443/tcp 443/udp 서비스 열어주기

 

HTTPS의 구성

SSL/TLS 지원 활성화를 위해 확장 모듈 설치

# yum install mod_ssl

443/TCP에 대기하는 기본 가상 호스트에 대해 httpd를 자동으로 활성화

# systemctl start httpd
# systemctl enable httpd
# firewall-cmd --add-service=https --permanent
# firewall-cmd --relaod

/etc/httpd/conf.d/ssl.conf 구성

Listen 443 https # 443 https 를 사용함
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog # passphrase를 검색할 프로그램 지정
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

<VirtualHost _default_:443> # 가상 호스트 정의
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on # TLS 의 사용여부
SSLProtocol all -SSLv2 # httpd가 클라이언트와통신할 프로토콜 목록
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 # httpd가 사용할암호화 나열
SSLCertificateFile /etc/pki/tls/certs/localhost.crt # 가상 호스트의인증서 위치
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key # 가상 호스트의 개인 키 위치
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

인증서

자체 서명된 인증서를 만들거나, CA에 요청해서 서명을 받아 만드는 방법이 있다.

openssl 도구를 이용해서 인증서를 생성하는 방법 :

1. 개인키 생성

# openssl genrsa -out private.key 2048
# file private.key
private.key: PEM RSA private key

실행 결과 
[root@server conf.d]# openssl genrsa -out private.key 2048
Generating RSA private key, 2048 bit long modulus
......+++
...........................+++
e is 65537 (0x10001)
[root@server conf.d]# ls
00-vhost0.conf  02-vhost2.conf  fcgid.conf   private.key  ssl.conf  userdir.conf
01-vhost1.conf  autoindex.conf  manual.conf  README       test      welcome.conf
[root@server conf.d]# file private.key
private.key: PEM RSA private key

2. 생성된 키로 인증서 생성

# openssl req –new –key private.key –out cert.csr # 발급 신청서 작성
# openssl x509 –req –signkey private.key –in cert.csr –out cert.crt

실행 결과
[root@server conf.d]# openssl req -new -key private.key -out test.csr
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) []:admin
Locality Name (eg, city) [Default City]:seoul
Organization Name (eg, company) [Default Company Ltd]:seoul
Organizational Unit Name (eg, section) []:adm
Common Name (eg, your name or your server's hostname) []:server.test.example.com
Email Address []:admin@test.example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@server conf.d]# ls
00-vhost0.conf  autoindex.conf  private.key  test          welcome.conf
01-vhost1.conf  fcgid.conf      README       test.csr
02-vhost2.conf  manual.conf     ssl.conf     userdir.conf
root@server conf.d]# openssl x509 -req -signkey private.key -in test.csr -out test.crt
Signature ok
subject=/C=kr/ST=admin/L=seoul/O=seoul/OU=adm/CN=server.test.example.com/emailAddress=admin@test.example.com
Getting Private key

key 파일, csr 파일, crt 파일 모두 지정된 경로에 저장해야 한다.

/etc/pki/tls/private/keyname.key : 개인키 600 또는 400 사용권한과 cert_t로 유지

/etc/pki/tls/certs/certname.csr : 서명 요청할 때만 생성한다. CA로 보내는 파일 (서명용)

/etc/pki/tls/cert/cretname.crt : 공개 인증서. 자체 서명된 인증서가 요청될 때만 생성한다. 서명 요청이 있고 CA로 전송될 때 CA에서 반환되는 파일 644 cert_t로 유지한다.

[root@server conf.d]# ls -l private.key test.csr test.crt
-rw-r--r--. 1 root root 1675 Mar 11 20:35 private.key
-rw-r--r--. 1 root root 1326 Mar 11 20:39 test.crt
-rw-r--r--. 1 root root 1066 Mar 11 20:38 test.csr
[root@server conf.d]# chmod 600 private.key test.crt  권한을 제한해줬다!
[root@server conf.d]# ls -l private.key test.csr test.crt
-rw-------. 1 root root 1675 Mar 11 20:35 private.key
-rw-------. 1 root root 1326 Mar 11 20:39 test.crt
-rw-r--r--. 1 root root 1066 Mar 11 20:38 test.csr
[root@server conf.d]# mv test.c* /etc/pki/tls/certs/  지정된 폴더로 이동시키기
[root@server conf.d]# mv private.key /etc/pki/tls/private
[root@server conf.d]# systemctl restart httpd
Comments