다음 이전 차례

4. Certificate Server의 설치

Certificate Server의 구성은 OpenSSLApache가 필요하며, 개인의 신상정보가 Web을 이용하여 전송됨으로 Apache 서버에 mod_ssl을 설치하거나 Apache + SSL의 형태로 Apache서버를 설치하여 Browser와의 통신시 sniffing되지 않도록 하여야 할 것이다. 또한 자동화된 서비스를 위해서 Perl이나 php등이 필요하다. (Perl이나 PHP는 module로 설치해도 좋으며 CGI형태로 실행해도 상관이 없으나 보안을 위한 부분을 생각해보고 설치하는것이 좋을것 같다.) 인증을 요구하는 Client등의 관리를 위하여 MySQL등을 설치하는 것도 좋을것 같다. 그리고 mod_ssl의 INSTALL화일을 살펴보면 선택적으로 설치하는 화일이 있는데(mm같은것) 이것들도 필요하면 같이 설치할 수 있다. Perl은 5.6버젼을 필요로 한다고 되어있는것 같은데, 5.6을 굳이 설치할 필요는 없었던것 같다.

4.1 OpenSSL의 설치

OpenSSL을 설치하기 위해서는 Perl 5와 ANSI C컴파일러가 필요하다. 기본적인 설치 방법은 인터넷상의 다른 패키지들처럼 다음과 같이하여 설치할수 있다.

        $ ./config
        $ make
        $ make test
        $ make install

config에서 prefix를 주지 않았을 때에는 /usr/local/ssl디랙토리에 설치가 되니 다른 디랙토리에 설치를 하고자 한다면 다음과 같이 한다. $ ./config --prefix=/usr/local --openssldir=/usr/local/openssl 이렇게 하면 OpenSSL의 실행화일은 /usr/local/bin에 설치되고 Certificate Service를 위한 화일들은 /usr/local/openssl아래의 디랙토리에 생성된다. 또한 rsaref를 선택사항으로 줄수가 있는데 이것은 librsaref.a라는 라이브러리가 라이브러리 Search경로에 있어야 한다. (법적으로 문제가 되는부분이 아닌가 모르겠네요..어디서 읽은것 같아서..-.-; ftp search에서 rsaref20으로 검색하시면 찾을수 있습니다...그런데, 넣고 컴파일하면 에러가 나더라구요..)

make를 실행하면 OpenSSL라이브러리(libcrypto.a와 libssl.a)와 실행화일 (openssl)이 생성되고, 라이브러리는 make를 실행한 디랙토리에, OpenSSL실행화일은 apps디랙토리에 생성된다. make를 실행하는 도중 에러가 생기면, 에러메세지를 살펴보아야 한다. 대부분 OpenSSL의 문제가 아니라고 하며, 정말로 OpenSSL의 문제라고 판단된다면 make report명령을 이용하여 출력된 내용을 openssl-bugs@openssl.org에 송신한다.

다음은 make test를 실행하여 OpenSSL이 정상적으로 동작하는지 확인한다. 실패한 내용이 있다면, CFLAGS등을 수정하고 "make clean; make"명령을 이용하여 다시 컴파일한후 make test를 실행해 본다.

모든 시험이 정상적으로 성공한다면, make install명령어를 이용하여 설치디랙토리(/usr/local/ssl이나 /usr/local/bin, /usr/local/openssl등)에 실행화일과 도움말 화일, 환경설정화일등을 설치한다. 여기까지 별 문제 없이 실행되었다면, Certificate Server를 실행하기 위한 기본적인 준비는 완료된 것이다. 다음은 OpenSSL을 이용한 Certificate Server운용을 위한 키생성과 환경설정을 실시한다.

4.2 rootCA의 생성

Certificate Server를 운용하는 곳은 Tree구조의 형태로 이루어져 있다. 제일 처음에 나타나는 CA를 rootCA라고 하고 자기 자신이 생성한 인증요구서를 자기자신이 sign하여 개인이나, 기관에게 배포한다. rootCA로부터 인증을 받은 인증기관은 중계인증기관이라고 하며, 인증요구서를 rootCA로 부터 인증받아서 다른사람이나 기관의 인증요구서를 인증해주는 역활을 한다. 지금부터는 앞에서 생성된 OpenSSL의 실행화일들을 이용해서 자신만의 rootCA를 생성한다.

(아래에서 설명하는 내용은 /path/to/openssldir/misc에 보시면 CA.pl과 CA.sh 가 있습니다. CA.xx를 적절히 수정하고 ./CA.xx -newca로 하여 rootCA를 생성하셔도 됩니다. Perl과 shell의 script임으로 크게 어려운것은 없을 겁니다...^^; "CATOP"변수를 적절히 수정하시면 됩니다. 또한 Client들의 Sign Request가 있을때에도 사용하실수 있으므로 자세히 살펴보시는것이 좋습니다.)

  1. 비밀키의 생성

    $ openssl genrsa -des3 -out ca.key 1024

    1024비트의 보안도를 가지는 RSA키를 생성한다. Certificate Server자체의 비밀키가 됨으로 받드시 다른사람이 볼수 없는곳에 보관하고 빽업을 받은후에 사용하는것이 좋다.

  2. 생성된 비밀키를 이용하여 Self Sign된 인증서 화일을 생성한다.

    $ openssl req -new -x509 -days 365 -key ca.key -out ca.crt

    위의 명령어를 이용하면 Certificate Server의 Distinguished Name을 물어온다. 질문에 대한 답을 정확하게 입력하고나면 rootCA의 Certificate Server의 인증서가 생성된다. 그리고 필요에 따라 days같은 항목은 수정해서 사용하도록 한다. (비밀번호 잊어먹지 않도록 주의하세요..T.T)

  3. openssl디랙토리의 openssl.cnf화일을 수정한다.

    openssl.cnf화일은 Certificate Service를 운용하기 위한 환경설정을 담고 있는 화일로 make install을 했을때에는 sample 자료가 들어있다. 이 화일은 편집하여 여러분의 Certificate Service를 할 수 있도록 수정 하여야 한다.

    1. CA_default 부분에 "dir"을 여러분이 사용할 디랙토리를 적는다.(보통은 "/path/to/openssldir/자기CA"의 형태)
    2. usr_cert부분의 nsCertType이 모두 #으로 막혀있으므로 필요한 내용을 골라서 풀어준다.(Netscape Client의 인증종류를 결정하는 부분인것 같다.)
    3. Ca_default의 dir에 필요한 디랙토리와 화일을 생성한다. 디랙토리는 certs, crl, newcerts, private이고 화일은 "01"의 내용을 담고있는 serial과 내용이 없는 index.txt이다. (CA.xx의 내용과 openssl.cnf를 참고하시면 됩니다.)
              $ mkdir /usr/local/openssl/MyCA
              $ mkdir /usr/local/openssl/MyCA/certs
              $ mkdir /usr/local/openssl/MyCA/crl
              $ mkdir /usr/local/openssl/MyCA/newcerts
              $ mkdir /usr/local/openssl/MyCA/private
              $ echo "01" > /usr/local/openssl/MyCA/serial
              $ touch /usr/local/openssl/MyCA/index.txt
      
    4. keyUsage부분의 #을 풀어준다.
    5. 필요하다면 nsComment를 원하는것으로 바꾼다.

  4. 생성된 비밀키와 공개키를 openssl.cnf에서 지정한 디랙토리에 복사한다.

    ca.key는 /path/to/openssldir/자기CA/private/cakey.pem으로 복사하고 ca.crt는 /path/to/openssldir/자기CA/cacert.pem정도로 복사하면 됩니다.

  5. 공개키는 application/x-x509-ca-cert의 MIME형태로 Client Browser에 전송할 수 있으며, Client에서는 "신뢰된 루트인증기관"으로 import할 수 있다.
여기까지 하셨으면, 불편하지만 수동(?)으로 Certificate Service를 할 수 있습니다. 다음은 조금이나마 편안하게 Service를 하기 위해서 Apache에서 몇가지 작업을 합니다.(나중에 Client와 연결해서 CSR을 생성할때 사용합니다.)

4.3 Apache + mod_ssl/OpenSSL + PHP4/MySQL의 설치

일반적인 Apache 와 php의 설치 방법에 큰 차이는 없으니, 여기에서는 순서만 기술하고 넘어 가도록 한다. 또한 이 내용은 mod_ssl의 INSTALL화일에 설명이 되어 있으므로 그것을 읽어보는 것이 정확할 것이다. mod_ssl은 버젼별로 Apache와 연결이 됨으로 자신이 설치하는 Apache버젼과 일치하는 mod_ssl을 설치하여야 한다. 이는 mod_ssl의 화일명을 보면 알 수가 있는데, "mod_ssl-자신버젼-아파치버젼"의 형태로 되어있다.

        $ tar xvfz apache_1.3.x.tar.gz
        $ tar xvfz mod_ssl-2.7.x-1.3.x.tar.gz
        $ tar xvfz php-4.0.x.tar.gz
        $ cd apache_1.3.x
        $ ./configure
        $ cd ../mod_ssl-2.7.x-1.3.x
        $ ./configure --with-apache=../apache_1.3.x
        $ cd ../apache_1.3.x
        $ .configure --prefix=/path/to/apache
        $ cd ../php-4.0.x
        $ CFLAGS='-O2 -I/path/to/openssl/include' \
          ./configure \
                --with-apache=../apache_1.3.x \
                --with-mysql \
                --enable-memory-limit=yes \
                --enable-debug=no
        $ make
        $ make install
        $ cd ../apache_1.3.x
        $ SSL_BASE=/path/to/openssl \
          ./configure \
                --prefix=/path/to/apache \
                --enable-module=ssl \
                --activate-module=src/modules/php4/libphp4.a \
                --enable-module=php4
        $ make
        $ make certificate
        $ make install
컴파일 과정중 주의할 점은 마지막의 Apache의 환경설정을 할때에 SSL_BASE는 OpenSSL을 설치할때에 prefix에 주어진 디랙토리를 주어야 한다. (openssldir이 아니다.)

상기의 컴파일 과정을 거쳐서 생성된 Apache서버는 apachectl start명령을 이용하여 실행을 하게 되면 일반 Apache서버와 동일한 기능을 하게 되고 apachectl startssl 명령을 이용하면 mod_ssl을 이용한 https프로토콜을 사용할수 있게 된다. Client에서 사용법은 url에 "https://server/path/"라고 적게되며, 이때 Server와 Client간의 암호화 방법에 대한 협상이 이루어 지게 되고 이후에 Server와 Client간의 자료는 암호화 되어 전송이 됨으로, sniffer를 이용한 방법으로는 자료를 훔쳐볼수 없게 된다. 자세한것은 kldp.org에서 mod_ssl을 검색어로 찾아보길 바란다.

4.4 Apache Server의 키 생성과 인증

Apache + mod_ssl을 설치하면 기본적으로 30일간 사용할수 있는 Certificate가 /path/to/apache/conf/ssl.crt 디랙토리에 설치되어 있다. 이것을 여러분의 CA에서 인증한다면 여러분이 원하는 기간동안 사용할수 있는 Certificate가 생성된다.(1년이든 10년이든...^^;) (아래의 과정을 진행하다 보면 기존에 설치된 OpenSSL과 충돌하는 경우가 있습니다. 이때에는 기존에 설치된 OpenSSL을 제거 하시거나, "-config /path/to/openssldir/openssl.cnf"를 추가로 입력해서 사용하십시요.) 설치과정중 make certificate TYPE=custom으로 실행하는 경우에는 openssl에서 생성시킨 rootCA의 key와 certificate화일을 다시 설치해야 한다. 이때 생성된 rootCA에는 object sign(S/W에 사인하는것(?))이 빠져 있으므로 rootCA를 운영하는 데에는 부적합 할 수도 있다.

  1. openssl명령어를 이용하여 Web Server의 RSA키를 생성한다.

    $ openssl genrsa -des3 -out server.key 1024

    이때 생성되는 키는 Web Server를 운용하기위한 비밀키가 됨으로 반드시 백업을 받아놓고 사용하는 것이 좋다. 생성된 키는 다음 명령을 이용하여 내용을 확인할수 있다.

    $ openssl rsa -noout -text -in server.key

  2. 생성된 RSA키를 이용하여 Certificate Signing Request(CSR)을 생성한다.

    $ openssl req -new -days 365 -key server.key -out server.csr

    위의 명령어를 수행하는 도중 CommonName을 물어볼때에 Server의 FQDN(Fully Qualified Domain Name --> host.domain.com의 형태)로 적어야 한다. 생성된 화일은 다음 명령으로 내용을 확인 할 수 있다.

    $ openssl req -noout -text -in server.csr

  3. 생성된 CSR화일은 유료서비스를 하는 VeriSign이나 Thawte등의 rootCA로 보내면 server.crt화일을 받을수 있다. OpenSSL을 이용할 때에는 위에서 Self Sign할 때처럼 "openssl ca"명령을 이용한다. 이때 반드시 /path/to/openssldir/openssl.cnf의 내용중 nsCertType을 Server로 해놓아야 한다.( nsCertType = Server) (요거 빼먹으면 Netscape에서 https로 접속 할 수가 없어요.. -.-)

    $ openssl ca -in server.csr -out server.crt

    (CA.pl이나 CA.sh를 적절히 수정하였다면 "CA.xx -sign"을 이용해도 됩니다. 그리고 기존의 OpenSSL과 충돌하지 않는지 확인하시고 사용하십시요.)

  4. 생성된 server.crt와 server.key화일을 적절한 위치에 복사하고 빽업한다.

    Apache의 conf/httpd.conf에 보면, SSLCertificateFile 항목이 지시하는곳이 server.crt화일을 나타내는 곳이고 SSLCertificateKeyFile 항목이 server.key화일을 지시한다.


다음 이전 차례