공개키 기반(Public Key Infrastructure) 구조에 대한 설명은 아래 사이트 참고

개요

openssl 을 사용하여 공개키 쌍을 생성하고 인증서 서명 요청(CSR; Certificate Signing Request) 을 생성하여 SSL/TLS 인증서를 발급받는 방법.

키쌍 생성 기능이 내장된 웹 서버가 있으며 그런 서버는 openssl 을 사용하지 말고 자체 기능을 사용해야 함.


CSR(Certificate Signing Request)은?

공개키 기반(PKI)은 private key(개인키)와 public key(공개키)로 이루어져 있다. 인증서라고 하는 것은 내 공개키가 맞고 도메인 소유자가인증기관(CA)이 전자 서명하여 주는 것이다.

나와 보안 통신을 하려는 당사자는 내 인증서를 구해서 그 안에 있는 공개키를 이용하여 정보를 암호해 서 암호화보안 통신을 할 수 있다.

CSR 은 인증기관에 인증서 발급 요청을 하는 특별한 ASN.1 형식의 파일이며(PKCS#10 - RFC2986)  그 안에는 내 공개키 정보와 사용하는 알고리즘 정보등이 들어 있다. 개인키는 외부에 유출되면 안 되므로 저런 특별한 형식의 파일을 만들어서 인증기관에 전달하여 인증서를 발급 받는다.

SSL 인증서 발급시 CSR 생성은 Web Server 에서 이루어지는데 Web Server 마다 방식이 상이하여 사용자들이 CSR 생성등을 어려워하니 인증서 발급 대행 기관에서 개인키까지 생성해서 보내주고는 한다.

키쌍 생성

  1. SSL 호스트에서 사용할 RSA  key pair(public, private key) 생성

    2048bit 개인키 생성

    openssl genrsa -aes256 -out /etc/pki/tls/private/lesstif.com.key 2048
    CODE
  2. Remove Passphrase from key

    개인키를 보호하기 위해 Key-Derived Function 으로 개인키 자체가 암호화되어 있다. 인터넷 뱅킹등에 사용되는 개인용 인증서는 당연히 저렇게 보호되어야 하지만 SSL 에 사용하려는 키가 암호가 걸려있으면 httpd 구동때마다 pass phrase 를 입력해야 하므로 암호를 제거한다.

    개인키 pass phrase 제거

    cp  /etc/pki/tls/private/lesstif.com.key  /etc/pki/tls/private/lesstif.com.key.enc
    openssl rsa -in  /etc/pki/tls/private/lesstif.com.key.enc -out  /etc/pki/tls/private/lesstif.com.key
    CODE
  3. 개인키의 유출 방지를 위해 group 과 other의 permission 을 모두 제거한다.

    chmod 600  /etc/pki/tls/private/lesstif.com.key*
    CODE

     

CSR 생성

  1. openssl 명령으로 csr 생성

    openssl req -new -key /etc/pki/tls/private/lesstif.com.key -out /etc/pki/tls/certs/lesstif.com.csr
    CODE
  2. 개인키의 암호를 입력한다.

    Enter pass phrase for lesstif.com.key:
    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) []:
    Locality Name (eg, city) [Default City]:
    Organization Name (eg, company) [Default Company Ltd]:
    Organizational Unit Name (eg, section) []:
    Common Name (eg, your name or your server's hostname) []: lesstif.com

     

    Email Address []:

     

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

    Enter pass phrase for lesstif.com.key: 개인키의 pass phrase를 해제하지 않았을 경우 표시되며 키 생성시에 설정한 pass phrase를 입력한다.
    Common Name (eg, your name or your server's hostname) []: 가장 중요한 항목으로 common name 에 발급받을 도메인 이름(Ex: lesstif.com) 을 입력한다.

  3. 생성된 lesstif.com.csr 의 이상 유무를 확인해 본다.

    openssl req  -text -in /etc/pki/tls/certs/lesstif.com.csr
     
    Certificate Request:
        Data:
            Version: 0 (0x0)
            Subject: C=KR, L=Default City, O=Default Company Ltd, CN=*.lesstif.com
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    Public-Key: (2048 bit)
                    Modulus:
                        00:e6:75:07:7f:d6:87:05:16:18:86:1d:17:2b:04:
    CODE
  4. 이 파일을 SSL 인증서 발급 기관으로 보내면 인증서를 발급해 준다.

  5. 발급된 인증서를 웹 서버의 인증서 폴더에 업로드한다. 
  6. 제대로 발급되었는지 확인을 위해 openssl 명령어로 인증서의 정보를 출력해 보거나 웹 브라우저에서 열어 본다. 제일 중요한 체크 항목은 주체 대체 이름(Subject Alternative Name) 항목에 웹 사이트 주소가 들어 있어야 한다.

    $ openssl x509 -text -in /etc/pki/tls/certs/lesstif.com.crt
     
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 1592689731970922 (0x5a88af9b6276a)
        Signature Algorithm: sha256WithRSAEncryption
            Issuer: C=IL, O=StartCom Ltd., OU=Secure Digital Certificate Signing, CN=StartCom Class 1 Primary Intermediate Server CA
            Validity
                Not Before: May  8 13:29:54 2015 GMT
                Not After : May  7 17:24:16 2016 GMT
           X509v3 Subject Alternative Name: 
                    DNS:www.lesstif.com, DNS:lesstif.com
    CODE

apache httpd 에 SSL 적용

apache httpd 에 SSL/HTTPS 적용 및 VirtualHost 에 SNI(Server Name Indication) 문제 해결 참고

nginx 에 SSL 적용

server에 다음 내용 추가

server {
    listen 443;
    server_name  lesstif.com;
    charset utf-8;
    access_log  /var/log/nginx/lesstif.com-ssl.access.log  main;
    error_log  /var/log/nginx/lesstif.com-ssl.error.log  notice;   
    location ~ /\.ht {
        deny all;
    }
    #location = /favicon.ico { access_log off; log_not_found off; }
    #location = /robots.txt  { access_log off; log_not_found off; }

    ssl on;
    ssl_certificate     /etc/pki/tls/certs/lesstif.com.crt;
    ssl_certificate_key /etc/pki/tls/private/lesstif.com.key;
}
CODE
listen 443;
ssl on;
ssl_certificate     /etc/pki/tls/certs/lesstif.com.crt;
ssl_certificate_key /etc/pki/tls/private/lesstif.com.key;
CODE