[Linux] HTTPS 인증서 발급

728x90

HTTPS (HTTP Secure)

  • HTTP 프로토콜의 암호화된 버전
  • 클라이언트와 서버 간의 모든 커뮤니케이션을 암호화 하기 위하여 SSL 이나 TLS 를 사용한다.
    • SSL (Secure Socket Layer)
    • 넷스케이프사에서 개발한 인터넷 보안 프로토콜
    • TLS (Transport Layer Security)
    • SSL 이 표준화 되면서 바뀐 이름

HTTPS 암호화 방식

  1. 클라이언트 → 서버로 랜덤 데이터와 사용 가능한 암호화 방식을 보낸다.
  2. 서버 → 클라이언트로 랜덤 데이터, 사용할 암호화 방식과 SSL 인증서를 보낸다.
  3. 클라이언트는 서버에게 받은 인증서의 CA 가 자신이 들고 있는 CA 리스트에 있는지 확인하고, 있다면 CA 의 공개키로 복호화한다. 이는 곧 CA 비밀키에 의해 암호화됐다는 것이므로 인증서의 신원을 보증해준다. (공개키 암호화 방식)
  4. 클라이언트는 자기가 보낸 랜덤 데이터와 서버로부터 받은 랜덤 데이터를 조합하여 임시 키(pre master secret key) 를 만든다.
  5. 만들어진 임시 키를 인증서의 공개키로 암호화하여 서버에게 보낸다.
  6. 서버는 자신이 들고 있던 비밀 키로 임시 키를 복호화한다.
  7. 이로써 클라이언트와 서버는 동일한 임시 키를 공유하게 되는데, 일련의 과정을 거쳐 master secret 값을 만들고 세션 키를 생성한다.
  8. 이렇게 만들어진 세션 키로 암호화된 데이터를 주고받는다. (대칭키 암호화 방식)
  9. 세션이 종료되면 클라이언트와 서버 모두 세션 키를 폐기한다.

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
      • +all -SSLv3 = TLSv1, TLSv1.1, TLSv1.2
      • TLSv1.3은 OpenSSL 1.1.1 이상 버전부터 지원합니다.
    • SSLCertificateKeyFile
      • private key(비밀키)
    • SSLCertificateFile
      • 서버인증서
    • SSLCACertificateFile
      • 루트 CA 인증서
      • 체인인증서와 루트CA인증서를 하나로 통합해서 설정해도 됩니다.(통합했을 경우에는 체인인증서는 설정하지 않습니다.)
    • SSLCertificateChainFile
      • 체인인증서

인증서

  • 자체 서명된 인증서를 만들거나 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
        • 이메일을 작성합니다.
    • 생성된 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