4. 아파치 서버 설정하기

SSL을 지원하기 위해서 추가 API 모듈과 함께 아파치가 설정되어야 한다. 많은 SSL 소프트웨어 패키지를 이용할 수 있는데 이 문서는 ModSSL과 OpenSSL에 기초한다. 이 제품을 지원하는데 도움이 되는 무수히 많은 메일링 리스트와 뉴스그룹이 있는데 아파치 웹서버에 기초한 상용 SSL 소프트웨어 패키지에 대해서도 이 문서가 도움이 될 것이다.

명실해야 할 사항: 동일한 서버에 다중 가상 호스트를 만들 수 있는데 동일 IP 주소로 매우 많은 이름을 갖는 가상 호스트를 만들 수 있다. 그러나 동일한 IP 주소로 여러개의 보안 가상 호스트를 만들 수는 없으며 서로 다른 이름을 갖는 가상 호스트와 단 하나의 보안 가상 호스트를 만들 수 있다. 이렇게 많은 가상 호스트를 가질 수 있는 이유는 SSL이 애플리케이션 계층 아래서 작동하기 때문인데 애플리케이션 계층이 정의된 후 이름을 갖는 호스트가 정의된다.

구체적으로 동일한 소켓(IP 주소 + 포트)에 여러개의 보안 가상 호스트를 만들 수 없으며 보안 호스트는 포트 443을 사용할 것이다. 동일한 IP에서 다른 포트를 사용하기 위해, 따라서 다른 소켓을 만들기 위해 가상 호스트 설정을 변경할 수 있는데 이 접근 방법에는 많은 단점이 있다. 가장 명백한 단점은 디폴트 포트를 사용하지 않을 경우 보안 사이트에 액세스하기 위해 URL에 포트 넘버까지 포함시켜야 한다는 것이다.

예:

다른 단점은 포트를 더 도입할 경우 포트를 탐지하는 해커에 더욱 많은 침입 기회를 제공할 수 있다는 것이다. 마지막으로 어떤 다른 서비스에 의해 사용되는 포트를 선택할 경우 충돌 문제가 생길 수 있다.

4.1. 보안 가상 호스트 정의하기

가상 호스트 설정은 상당히 수월한데 보안 가상 호스트 설정의 기초를 자세히 살펴볼 것이다.

다음 예에서 .crt 와 .key 파일 확장자를 사용하는데 다양한 파일들과 구별하기 위한 개인적인 방식이다. 아파치에서는 선택한 모든 확장자를 사용할 수 있으며 확장자가 없어도 무방하다.

모든 보안 가상 호스트들은 대개 httpd.conf 파일의 끝부분에 위치한 <IfDefineSSL>와 </IfDefineSSL> 사이에 포함되어야 한다.

   <VirtualHost 172.18.116.42:443>
   DocumentRoot /etc/httpd/htdocs
   ServerName www.somewhere.com
   ServerAdmin someone@somewhere.com
   ErrorLog /etc/httpd/logs/error_log
   TransferLog /etc/httpd/logs/access_log
   SSLEngine on
   SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
   SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
   SSLCACertificateFile /etc/httpd/conf/ssl.crt/ca-bundle.crt
   <Files ~ "\.(cgi|shtml)$">
         SSLOptions +StdEnvVars
   </Files>
   <Directory "/etc/httpd/cgi-bin">
         SSLOptions +StdEnvVars
   </Directory>
   SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
   CustomLog /etc/httpd/logs/ssl_request_log \
             "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
   </VirtualHost>

SSL에 대한 가장 중요한 지시는 SSLEngine on, SSLCertiFficateFile, SSLCertificateKeyFile과 많은 경우에 있어 SSLCACertificateFile 지시이다.

SSL 엔진

"SSLEngine on" - 이 지시는 SSL을 구동하는 ModSSL의 명령이다.

SSLCertificateFile

SSLCertificateFile은 인증서 위치와 그 이름을 아파치에게 알려준다. 위 예에서 인증성 파일 이름은 "server.crt"로 ModSSL 설정시 추가되는 디폴트이다. 저자 개인적으로는 디폴트 이름 사용을 추천하지 않는데 얼마간의 낭패를 피하고 인증서 이름을 servername.crt(domainname.crt)로 하라. 또한 디폴트 /etc/httpd/conf/ssl.crt 또는 /usr/local/apache/conf/ssl.crt 가 아닌 다른 디렉토리를 사용할 수 있는데 경로 변경한 것을 꼭 기억해라.

SSLCertificateKeyFile

SSLCertificateKeyFile은 비밀키 이름가 그 위치를 아파치에게 알려주는데 여기서 정의된 디렉토리는 단지 루트에게만 읽기/쓰기 허가권이 주어져야 하며 다른 누구도 이 디렉토리에 액세스하지 못해야 한다.

SSLCACertificateFile

SSLCACertificateFile지시는 Intermediate(root) 인증서 위치를 아파치에게 말해주는데 사용하는 인증서에 따라 필요할 수도 있고 아닐 수도 있다. 이 인증서는 반드시 신뢰 고리(ring of trust)이다.

Intermdiate 인증서 - CA는 사용자와 동일한 방식으로 인증서를 얻는데 이것이 intermediate 인증서이다. 이는 기본적으로 intermediate 인증서 보유자가 그들이 말하는 CA이고 고객에게 인증서 발급이 인가된 기관임을 말한다. 웹브라우저는 각각의 릴리스와 함께 갱신된 신뢰받는 CA의 리스트를 갖고 있다. CA가 너무 신규 기관이라면 브라우저의 신뢰받는 CA 리스트에 없을 수 있다. 이를 대부분의 사람들이 자주 브라우저를 갱신하지 않는다는 사실과 결부시킨다면 CA가 자동적으로 신뢰받는 CA 라고 승인받을 때까지 수년이 걸릴 것이다. 이에 대한 해결 방안이 SSLCACertificateFile 지시를 사용하여 서버에 intermediate 인증서를 설치하는 것이다. 보통은 신뢰받는 CA가 intermediate 인증서를 발급하는데 그렇지 않다면 SSLCACertificateFile 지시를 사용할 필요가 있을 수 있다 (있을 법하지 않음에도 불구하고).

4.2. 인증서 예

서버 인증서 파일


   -----BEGIN CERTIFICATE-----
   MIIC8DCCAlmgAwIBAgIBEDANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
   FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
   VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
   biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
   MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTkwNTI1
   MDMwMDAwWhcNMDIwNjEwMDMwMDAwWjBTMQswCQYDVQQGEwJVUzEbMBkGA1UEChMS
   RXF1aWZheCBTZWN1cmUgSW5jMScwJQYDVQQDEx5FcXVpZmF4IFNlY3VyZSBFLUJ1
   c2luZXNzIENBLTIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYna8GjS9mG
   q4Cb8L0VwDBMZ+ztPI05urQb8F0t1Dp4I3gOFUs2WZJJv9Y1zCFwQbQbfJuBuXmZ
   QKIZJOw3jwPbfcvoTyqQhM0Yyb1YzgM2ghuv8Zz/+LYrjBo2yrmf86zvMhDVOD7z
   dhDzyTxCh5F6+K6Mcmmar+ncFMmIum2bAgMBAAGjYjBgMBIGA1UdEwEB/wQIMAYB
   Af8CAQAwSgYDVR0lBEMwQQYIKwYBBQUHAwEGCCsGAQUFBwMDBgorBgEEAYI3CgMD
   BglghkgBhvhCBAEGCCsGAQUFBwMIBgorBgEEAYI3CgMCMA0GCSqGSIb3DQEBBAUA
   A4GBALIfbC0RQ9g4Zxf/Y8IA2jWm8Tt+jvFWPt5wT3n5k0orRAvbmTROVPHGSLw7
   oMNeapH1eRG5yn+erwqYazcoFXJ6AsIC5WUjAnClsSrHBCAnEn6rDU080F38xIQ3
   j1FBvwMOxAq/JR5eZZcBHlSpJad88Twfd7E+0fQcqgk+nnjH
   -----END CERTIFICATE-----

인증서 파일 내용


   Certificate:
      Data:
        Version: 3 (0x2)
        Serial Number: 1516 (0x5ec)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=US, O=Equifax Secure Inc, CN=Equifax Secure E-Business CA
        Validity
          Not Before: Jul 12 15:21:01 2000 GMT
          Not After : Jun  2 22:42:34 2001 GMT
        Subject: C=us, ST=ga, L=atlanta, O=Equifax, OU=Rick, CN=172.18.116.44/Email=richard.sigle@equifax.com
        Subject Public Key Info:
          Public Key Algorithm: rsaEncryption
          RSA Public Key: (1024 bit)
              Modulus (1024 bit):
                00:c8:eb:93:26:97:ca:00:ce:4c:e4:f3:fd:43:31:
                cd:53:ed:b4:8a:ad:93:84:dc:7a:48:39:b5:28:57:
                03:7f:a9:ac:3e:58:6a:7a:e3:52:3e:1e:52:58:a2:
                6f:23:ad:bb:84:d8:88:ed:6d:a5:da:08:6b:c8:6c:
                a5:4c:34:67:d8:46:1c:ca:20:50:b0:e8:54:7f:ca:
                5e:ef:09:ff:6e:8d:a6:2b:02:f5:54:0f:c2:d0:45:
                12:ad:66:e7:8b:dd:68:be:64:a4:9b:69:bd:a4:1a:
                5e:ef:09:ff:6e:8d:a6:2b:02:f5:54:0f:c2:d0:45:
                12:ad:66:e7:8b:dd:68:be:64:a4:9b:69:bd:a4:1a:
                5a:2f:3b:6e:73:84:d8:d6:17:bd:12:39:34:fa:3d:
                d8:a9:e8:59:3c:c2:61:c5:b3
              Exponent: 65537 (0x10001)
        X509v3 extensions:
          X509v3 Key Usage: critical
             Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
          Netscape Cert Type:
             SSL Server
          X509v3 Authority Key Identifier:
             keyid:5B:E0:A8:75:1C:78:02:47:71:AB:CE:27:32:E7:24:88:42:28:48:56
      Signature Algorithm: md5WithRSAEncryption
        87:53:74:e9:e1:a6:10:56:8c:fa:63:0e:7b:72:ff:76:4b:79:
        0e:49:2a:58:ed:71:7a:bf:77:61:fa:e8:74:04:37:8c:d3:6a:
        9a:3d:80:76:7a:c3:64:30:e7:1b:40:25:4e:2a:81:8b:e5:ac:
        76:a4:38:67:cc:3f:93:43:e1:1d:c3:8d:ba:ed:cc:d7:aa:a4:
        ab:d3:84:77:7c:8f:26:f6:dd:ba:3b:6a:99:81:e1:9e:7e:0f:
        ca:a6:ff:c0:c3:59:6e:dc:a6:03:23:bf:8f:24:ff:15:ad:ac:
        0d:85:fc:38:bf:d1:24:2d:1a:d3:72:55:12:95:5f:65:f0:60:
        df:b1

비밀키 파일


   -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info:
   DES-EDE3-CBC,124F61450D85A480
   
   ELz64SV+tFSRybsHjY9NH7CP7yDHXP6xcd9FY6MVgQykTkq2h0n7j+tmpfUPbStT
   6jCgm/dTYM9mpkQ3jYZBALiVD5JNJ9t1dWisxQXY/nsak8LSTN7LhUtZSfk5xSmV
   Zsl4gwQS20UdBzFiJ+4qDajP/pzocSdSuQvxIHq7UzNwJsW8UYxR3I1qrDgyNXKS
   db41BWH4QdNtE0p+pi9VndDzXktqZGHEvtrQTV+39DV/dwOdnGBpYBETljMO5X6t
   D42xcVs0Doa1vZ6PiMCkwFNPXsPlKHZtHwEL4I3CQdiH4E0oYh3klBzlXBY4YldN
   A+s4xU44FpXp5xwt9nnVPUKHPo+NpdaRK7dAcRNO3GN3+ek1ggzvEjjuWKes3RQh
   PlHPuF7VWo4KeaTfTIwJWfGxz4nvwlVByPJ6Z73Mn0VcDXCkVm6+h3PLlYL0FMqM
   baUyQPpw6bhfW71FO/IIQxz3R1EqkxW7OHv74uuYl8kjHXf3S6qRZEGUG/zOGLGr
   mI5s2qnU69HlBObFkc6WQq0QxMq4PiUi7HhCLMkH8+wBsNNMnb75+7lQKkEhdOeE
   iUMKe5kgQqfd9w8jsBH5nu+J/nCfvPdp0isQW+P3/Rrh6YMwdKnlVfNZWdGiTzpQ
   ngThAGq5lit4uf4zdTIYYrs+T9I5ltjj0KgCUD4VL5/7OfnR3gcphpbHXQf0E2cz
   Qwq7q7ppKwCf/x92pHi8oVevlV5Dx9NQbGhEOA5pooqD6S2xZBbPLzkUKWDEO2il
   oBZ5L1jClR5jjdF2U61w7aRrL0t6luDU/aRv/fcoYes=
   -----END RSA PRIVATE KEY-----

비밀키 내용


   read RSA key
   Enter PEM pass phrase:
   Private-Key: (1024 bit)
   modulus:
       00:c8:eb:93:26:97:ca:00:ce:4c:e4:f3:fd:43:31:
       cd:53:ed:b4:8a:ad:93:84:dc:7a:48:39:b5:28:57:
       03:7f:a9:ac:3e:58:6a:7a:e3:52:3e:1e:52:58:a2:
       6f:23:ad:bb:84:d8:88:ed:6d:a5:da:08:6b:c8:6c:
       a5:4c:34:67:d8:46:1c:ca:20:50:b0:e8:54:7f:ca:
       5e:ef:09:ff:6e:8d:a6:2b:02:f5:54:0f:c2:d0:45:
       12:ad:66:e7:8b:dd:68:be:64:a4:9b:69:bd:a4:1a:
       5a:2f:3b:6e:73:84:d8:d6:17:bd:12:39:34:fa:3d:
       d8:a9:e8:59:3c:c2:61:c5:b3
   publicExponent: 65537 (0x10001)
   privateExponent:
       00:b6:57:7d:3b:58:24:1e:a9:1b:85:e9:9c:9e:5f:
       d3:3d:69:0c:21:93:37:bf:2b:2c:da:e1:6c:74:48:
       cb:c7:0f:60:5f:50:74:8a:44:45:be:54:5c:5d:4e:
       45:58:f6:f1:a8:b5:af:46:f2:ec:c2:bc:43:bd:28:
       44:b7:ad:13:d3:ca:de:59:24:e8:fa:f8:e5:5f:45:
       38:2c:a0:a3:de:98:13:d8:80:38:e1:47:53:4c:ea:
       e4:66:c3:82:93:89:c3:90:83:44:e1:13:4f:74:76:
       e2:c0:89:97:77:5f:33:d8:7d:27:21:52:55:c2:d7:
       dc:01:f9:bc:21:8d:a3:f5:c1
   prime1:
       00:e3:2d:6b:5e:05:6b:e1:46:e6:ab:ae:f3:8b:d0:
       5f:94:5c:6f:f5:47:46:1d:4e:66:d3:7e:98:18:e0:
       2c:0d:08:ca:b7:29:72:af:53:62:30:ec:be:26:1f:
       cc:5a:ed:65:62:65:70:1e:18:19:61:e3:77:00:a7:
       3a:9e:4e:12:93
   prime2:
       00:e2:69:56:78:e8:39:ff:17:db:cc:39:d7:7f:70:
       41:dc:c5:59:43:16:c1:84:4c:ae:e7:5d:8a:c5:4b:
       da:88:8e:03:99:7c:88:f2:8a:13:31:57:44:e0:b5:
       c8:0a:60:b0:05:de:f6:9e:f2:00:ec:37:21:8d:3b:
       dc:8e:c9:d4:61
   exponent1:
       1a:ad:6a:be:4f:c4:ab:5f:b8:16:d1:24:a8:76:7f:
       c2:dc:58:09:65:a5:46:2b:be:c7:77:46:45:25:8e:
       06:b9:d1:94:50:b9:b6:fd:03:ba:db:12:39:47:e2:
       a7:8a:d9:2d:04:dc:75:ac:3e:ce:cf:f7:59:8c:49:
       c5:ed:45:21
   exponent2:
       2d:4e:fd:32:06:ef:0c:40:7f:08:d8:8e:6a:7f:51:
       7e:d7:b3:6c:3c:92:8f:62:35:22:31:d3:02:76:92:
       8d:ff:35:73:32:bb:c9:25:9e:7f:a2:42:33:61:cd:
       5d:5e:49:fb:72:ca:11:b6:c6:3e:7f:2d:e4:b0:95:
       0b:b2:12:21
   coefficient:
       50:52:09:22:cb:fb:b2:b8:58:85:ab:1d:82:b9:6e:
       d0:f6:dc:e8:ce:a6:5d:a1:ff:c8:4d:3b:2b:1c:19:
       64:f0:c4:4a:bc:b2:1d:2b:2d:09:59:83:a3:9a:89:
       f8:db:2c:2c:8a:bd:fd:a3:16:51:76:aa:ce:ea:85:
       6b:1c:9f:f7
 

4.3. 웹 서버 재구동하기

웹서버를 재구동할 스크립트는 /usr/local/sbin, /usr/bin (httpd 스크립트인 경우) 또는 /usr/local/apache/bin (apachectl 스크립트인 경우) 디렉토리에 위치할 수 있는데 SSL 기능과 함께 서버를 구동하고 있지 않다면 서버를 중지시킨후 구동해야 한다. 서버 구동, 재구동 및 정지를 위한 자신만의 개별화된 스크립트를 작성할 수 있는데 SSL 엔진을 시동시킨다면 무방하다.

명령은 다음과 같다:


   httpd stop
   httpd startssl
   httpd restart

또는


   apachectl stop
   apachectl startssl
   apachectl restart