[linux] Self Signed Certificate SSL

OpenSSL 에서 self signed certificate 생성 및 apache httpd 에 SSL 적용

웹서비스에 https 를 적용할 경우 SSL 인증서 발급 기관에서 유료로 해당 도메인에 대해 발급 받으면 되지만 테스트 서버거나 예산등의 이유로 발급 받지 못할 경우가 있다.

이럴때 OpenSSL 을 이용하여 Self signed certificate 를 생성 & apache httpd 에 연계하는 법을 정리해 본다

Self Signed Certificate 생성

Self Signed Certificate(SSC) 란 무엇일까?

digital certificate는 발급기관(CA) 이 있게 마련이다. Web Browser 마다 VeriSign 이나 comodo 같은 유명 CA 들의 인증서를 신뢰하는 CA로 미리 등록해 놓으므로 저런 기관에서 발급된 SSL 인증서를 사용해야 browser 에서는 웹서비스를 신뢰할수 있는데

SSC 는 인증서를 만들고 개인키로 직접 인증서에 서명한 것이다. 당연히 browser는 모르는 기관이 발급한 인증서이므로 보안 경고를 발생시킬 것이나 테스트 사용에는 지장이 없다.

CSR(Certificate Signing Request)?

공개키 기반(PKI) private key(개인키) public key(공개키)로 이루어져 있다. 인증서라고 하는 것은 내 공개키가 맞다고 인증기관(CA)이 전자서명하여 주는 것이며 나와 보안 통신을 하려는 당사자는 내 인증서를 구해서 그 안에 있는 공개키를 이용하여 보안 통신을 할 수 있다.

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

(사용자들이 CSR 생성등을 어려워하니 인증서 발급 대행 기관에서 개인키까지 생성해서 보내주고는 한다.)

OpenSSL 

      1. RSA 기반의 private key 생성
        cd /etc/pki/tls/private
        openssl genrsa -des3 -out myhost.key 1024
      2. CSR(Certificate Signing Request) 생성
        custom_openssl.conf

[ req ]

default_bits            = 2048

default_md              = sha1

default_keyfile         = privkey.pem

distinguished_name      = req_distinguished_name

[req_distinguished_name ]

countryName                     = Country Name (2 letter code)

countryName_default             = KR

countryName_min                 = 2

countryName_max                 = 2

# 회사명 입력

organizationName              = Organization Name (eg, company)

organizationName_default      = University of Wisconsin — Madison

# 부서 입력

organizationalUnitName          = Organizational Unit Name (eg, section)

organizationalUnitName_default  = Condor Project

# SSL 서비스할 domain 명 입력

commonName                      = Common Name (eg, your name or your server’s hostname)

commonName_default             = myhost.co.kr

commonName_max                  = 64

openssl req -new -key myhost.key -out myhost.csr -config custom_openssl.conf

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

        cp myhost.key myhost.key.enc
        openssl rsa -in myhost.key.enc -out myhost.key

보안 경고

개인키의 유출 방지를 위해 group 과 other의 permission 을 모두 제거한다.

chmod 600 myhost.key

      1. self-signed certificate 생성시 입력할 custom_openssl.conf 생성
      2. self-signed 인증서 생성
        openssl x509 -req -days 365 -in myhost.csr -signkey myhost.key -out ../certs/myhost.crt
      3. 제대로 생성되었는지 확인을 위해 인증서의 정보를 출력해 본다.
        openssl x509 -text -in ../certs/myhost.crt 
      4.  msts

apache httpd 에 SSL 적용

      1.  vi /etc/httpd/conf.d/ssl.conf 
      2. 다음 내용 추가
        NameVirtualHost *:443 
      3. SSL 을 적용할 VirtualHost 를 설정한다.

<VirtualHost *:443>

ServerName myhost

SSLEngine on

SSLCertificateFile /etc/pki/tls/certs/myhost.crt

SSLCertificateKeyFile /etc/pki/tls/private/myhost.key

SetEnvIf User-Agent “.*MSIE.*” nokeepalive ssl-unclean-shutdown

CustomLog logs/ssl_request_log \

   “%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”

</VirtualHost>

      1. service httpd restart
      2. Web browser에서 https 로 연결해서 제대로 보이는지 확인한다.

    • Browser가 Host Header 를 보내야하나 SSL의 경우 Host Header를 보내기전 서버 인증서가 오므로
      SSL 에 대해서 Multiple VirtualHost 가 불가함.
    • 위 문제를 해결하기 위해서는 SNI(Server Name Indication – RFC 4366) 을 지원하는 SSL Library
      (OpenSSL 0.9.8j 이상, Java 7 JSSE 이상)와 
      Web Server(apache 경우 2.2.12 이상),
      Web Browser(IE7 이상, FF2 이상 등)를 사용해야 함.
    • Windows XP 는 SNI 를 지원하지 않으므로 IE 버전과 상관없이 에러 발생(관련 링크).

원본 위치 <http://lesstif.tistory.com/entry/OpenSSL-%EC%97%90%EC%84%9C-self-signed-certificate-%EC%83%9D%EC%84%B1-%EB%B0%8F-apache-httpd-%EC%97%90-SSL-%EC%A0%81%EC%9A%A9>

글쓴이