RedHat Linux >> Server Administration for Redhat Linux
|
||||||||||||||||||||||||||||
[목차] | ||||||||||||||||||||||||||||
제5장 Apache Web 서버
8. SSL(Secure Socket Layer)을 이용한 웹서버 보안
닷컴(.com), 인터넷을 이용한 비즈니스는 기존 오프라인의 비즈니스에 새로운 패러다임을 제시하며 현재 기업의 많은 부분들을 바꿔가고 있다. 많은 기업들은 빠른 속도로 인터넷이라는 새로운 환경으로 이동해 가고 있는 가운데, "이러한 과정이 과연 실행에 옮겨 져야하는 것일까?"하는 의문을 가지는 사람들이 있을 것이다. 아니, 지금 이렇게 생각하고 있다면 이미 새로운 환경에 늦었을 지도 모른다. 과거의 시간을 되짚어 보면, 비록 몇 년 전만 해도 인터넷이라는 새로운 환경이 지금과 같이 상거래의 개념을 바꿔놓으리라고는 생각하지 못했다. 그저 인터넷이라는 연결고리를 통해 상호간에 정보의 교환 및 공유만을 생각했을 것이다. 그당시의 유명한 대학의 엔지니어 교수는 이렇게 언급했다. "인터넷은 상업적인 가능성을 가지고 있지 않다."하지만 지금은 어떤가? 많은 웹 기업들이 등장한 지금 이시점은 또다른 새로운 경쟁이 되고 있다. 비즈니스 세계는 고객에 의존하고 있으며, 주의를 끌기 위해 많은 시간과 돈을 투자하는 것들이 고객이 원하는 제품을 찾아 밖으로 나오도록 하기 위한 것이다. 많은 기업들이 인터넷에 의존하는 비율은 점점 높아지고 있고, 클라이언트와의 신뢰를 위해서는 고객의 안전한 데이터 전송 즉, 인터넷에서의 보안이 얼마나 중요한지 말해주고 있다.
1. Secure Socket Layer(SSL)이란? 인터넷에서 보안을 강화하기 위해 넷스케이프사에서는 웹 브라우저와 서버(아파치웹서버) 사이의 통신을 위한 보안 프로토콜을 개발했다. 이는 현재까지 웹 상에서 통용되고 있는 보안 프로토콜 중 가장 널리 사용되어 지고 있는 보안 아키텍처 중 하나이며, 다음과 같은 기능을 제공한다.
현재 IETF(Internet Engineering Task Force)는 SSL을 기반으로 Transport Layer Security(TLS) 표준을 만들었으며, 이것이 TLS 프로토콜1.0이다. 아파치 SSL또한 TLS을 지원하고 있다. SSL프로토콜은 신뢰성을 기반으로 하는 TCP/IP와 상위의 애플리케이션 레이어 사이에 위치하고 있다.(그림1)
<그림1> SSL의 동작 (그림1)의 SSL은 TCP/IP와 상위레벨 애플리케이션 사이에서 동작한다. 이프로토콜은 서버와 클라이언트 각기 다른 인증, 세션키의 성립 등에 대해 다양한 암호화 알고리즘 또는 암호(ciphers)를 지원한다. 이것은 곧 '확장성'을 의미하는 것으로서 미래에 나올 수 있는 새로운 암호키나 대단위 암호화 방법 등에 적용할 수 있는 프레임 워크(framework)를 지원하게 된다. SSL이 이루어진 접속에서는 클라이언트와 서버간의 모든 정보가 클라이언트의 브라우저에 의해 암호화돼 전송되고, 내용을 받게되는 소프트웨어에 의해 해독이 이루어지므로 기밀서을 제공해 준다. 이러한 기밀성은 중요한 데이터 전송에 있어서는 중요한 부분이며, 더블어 중간에 데이터의 내용이 변경되어지는 여부 또한 알 수 있다. SSL은 'SSL Record Protocol'과 'SSL Handshake Protocol'로 이루어져 있다. 'SSL Record Protocol'은 데이터 전송에 사용될 포맷에 대한 정의이며 'handshake protocol'은 SSL 레코드 프로토콜을 이용해 처음 SSL접속이 이뤄졌을 때 클라이언트와 서버사이에 여러 관련 메시지들을 주고 받게 된다. SSL 프로토콜은 후에 설명할 공개키와 대칭키 암호화 방법을 혼합해 사용하고 있다. 대칭키는 공개키보다 훨씬 빠르나, 공개키는 좀더 나은 인증 방법을 제공해 준다. SSL세션이 이루러지기 전에 'SSL Handshake'를 통해 메시지를 교환하는데 이러한 것들은 서버가 공개키 방법을 이용해 클라이언트 인증을 허용하게 되고 클라이언트와 서버는 세션 동안에 대칭키를 이용해 빠른 속도로 암호, 해독 등을 수행하게 된다. 이것을 단계별로 설명한다면 다음과 같다.
<그림2> SSL의 단계별 과정 2. 암호에 대한 기본적인 지식 SSL은 보안 프로토콜로서 대칭키, 비대칭키 등의 암호화 기술이 사용된다. 최소한 이러한 방법에 대해서 알아두고 SSL을 적용해 본다면, SSL의 이해에 도움이 될 것이다. 암호란 일반적인 데이터 내용을 변형해 누군가 가로챈다 해도 어떠한 내용인지 알 수가 없도록 변경해 데이터의 내용을 외부로부터 지키는 것이다. 이와 반대로 암호화된 데이터를 읽을 수 있도록 원형의 상태로 복구하는 것을 해독이라 한다. 이러한 암호화 알고리즘은 'cipher'라 불리며, 수학적인 기능들을 사용하고 있다. 여기서는 많이 사용하는 방법중의 하나인 대칭키와 공개키에 대해 잠깐 알아보고 넘어가도록 하겠다. 대칭키(Symmetric-key)란 하나의 키(key)를 통해 암호화 해독을 수행하는 것이다. 암호와 해독에 있어서 상당히 빠르므로 빠른 시간을 필요로 하는 곳에서는 효율적으로 사용될 수 있으며, 암호과정은 <그림3>과 같다. DES(Data Encryption Standard)는 이 대칭키를 이용하고 있는 방법중의 하나로 널리 사용되고 있다.
<그림3> Symmetric-key encryption 그러나 대칭키는 키를 안전하게 분배하는 부분이 고려돼 있지 않다. 대칭키 암호 구성은 송신자오 ㅏ수신자가 같은 암호키를 가지고 있어야 하므로, 비록 데이터가 암호화돼 안전하게 전송됐다 하더라도 이때 사용되어진 키를 안전하게 전달하는 것이 큰 과제로 남게 된다. 이런 키분배의 문제를 해결하기 위해 나온 방법 중의 하나가 공개키(public key)다. 공개키 암호문은 비대칭키를 사용한 것으로 하나의 키를 암호에 사용하면 다른 하나의 키는 해독에 사용하는 것으로 다음과 같이 나뉘어진다.
공개키는 외부에 공개되는 키이지만 개인키는 외부에 노출 되지 않도록 안전하게 보관돼야 한다. 참고로 공개키를 사용해 수학적으로 개인키를 알아내는 것은 거의 불가능하다. 누군가 외부에 공개된 공개키(public key)를 이용해 암호화를 하면 그것을 해독할 수는 없으며, 오로지 그정보를 해독할 수 있는 사람은 그 공개키의 소유자 개인키에 의해서만 해독할 수 있다. 이렇게 공개키 암호화를 이요하면 안전하게 메시지를 교환하기 위해 사전에 협의와 같은 것이 필요 없다는 장점을 가지고 있다. 대칭키의 단점인 송신자와 수신자가 같은 키를 가지고 있어야 하는 요소가 제거된 것이다. 모든 정보는 공개키를 이용해 암호화하게 되고 개인키는 오로지 자기 자신만이 알고 있으면 된다. 공개키 암호시스템을 사용한 것들은 RSA, DSA 같은 것들이 있다. 공개키의 과정을 그린 것은 <그림4>와 같다.
<그림4> Public-key encryption 암호 알고리즘에서는 키의 값에 의해서 얼마나 안전한가가 달라진다. 키 자체는 일반적으로 매우 큰 값을 가지고 있다. 키의 값이 크면 클수록 안전하게 되지만, 상대적으로 속도 저하는 감수해야 한다. 여기서 알아본 대칭키와 공개키의 사이즈는 대조적이다. 대칭키의 80비트 키 사이즈는 공개키의 1024비트와 동등하며, 128비트 키사이즈는 공개키의 3000비트와 같은 강도를 가지고 있다. 다시말해 큰값의 키인가, 얼마나 안전한가는 사용하는 암호 알고리즘에 따라 달라지는 것이다. 또한 큰값의 키를 사용하게 되면 해독하기 위해서 많은 시간이 소요되게 되어 오랫동한 안전하게 되겠지만, 성능도 고려해야 한다. 그렇기 때문에 올바른 사이즈의 키를 선택해야 할 것이다. 하지만 미래에 더 빠른 속도의 컴퓨터가 나온다면 안전하지는 못하게 될 것이다. 56비트의 대칭키가 안전하다고 믿었던 시기가 있어지만 지금은 그렇지 못하기 때문이다. 공개키 암호화의 큰 장점 중의 하나는 전자서명(Digital Signatures)의 방법을 제공해 줄 수 있다는 점이다. 전자 서명은 수신자가 받은 정보가 올바른 사용자에 의한 것인지 증명할 수 있다. 그러므로 공개키 전자서명은 인증 이외에 추가적으로 데이터 무결성에 대한 것까지 제공하게 된다. 또한 전자서명은 부인 방지 기능을 가지고 있다. 이것은 송신자가 정보를 보내지 않았다고 부인할 수 없도록 방지하는 것이다. 전자서명은 일반적으로 우리가 사용하는 서명과도 같은 것으로 전잦거으로 표현한 것이지다. 사람의 손으로 쓴 서명은 쉽게 조작이 가능하지만, 전자서명은 위조하는 것이 거의 불가능하다. 여기서 이와 같은 암호화 방법으로 사용하게 된다면 데이터의 양이 많을 경우 처리하는데 있어서 느리다는 문제점을 가지게 된다. 왜냐하면 원래 데이터의 2배 이상 사이즈로 커지는 문제를 가지고 있으므로 이에 대한 해결책으로 'one-way hash functions'기능을 사용한다. 이것을 사용하게 되면 입력되는 데이터가 아무리 많다고 해도 출력되는 내용의 사이즈는 160비트와 같이 제한된다. 만약 이 'hash'된 정보가 한비트라도 바뀌게 되면 완전히 다른 결과물이 나오기 때문에 효율적으로 사용할 수 있다. MD5, SHA(Secure Hash Algorithm)등이 있다.
<그림5> Digital Signature를 이용한 데이터의 무결성 검증 지금까지 간단하게 알아본 이 내용들은 SSL을 설치 및 사용하기 위해서 이해가 요구되는 내용들로, 이것들을 기반으로 차례차례 배워 나아가 보도록 하겠다.
3. 어떻게 SSL을 적용할 것인다.? SSL을 아파치 웹서버에 적용하기 위해서는 기본적으로 배포되는 아파치 이외에 추가적인 작업이 필요하게 된다. 크게 다음과 같은 두가지 방법이 이용되고 있다.
두가지 모두 비상업적이거나 또는 사업적으로 자유롭게 이용할 수 있다. 128비트 암호화를 지원하고, 소스코드의 공개, 확장된 API사용 등의 특징을 지니고 있다. SSL을 사용하기 위해 이러한 것들이 필요하게 되는데 많은 사용자들이 Apache-SSL이 mod_ssl과 같은 것으로 혼돈하고 있다. 그러나 분명한 것은 mod_ssl이 Apache-SSL을 대체한 것이 아니라 아파치에서 SSL을 지원하기 위한 또 다른 방법일 뿐이라는 것이다. mod_ssl은 좀더 확장된 많은 기능 등을 제공하고 있다. Apache-SSL 또한 지속적인 개발 및 관리돼 왔다. 단지 Apache-SSL은 개발의 초점을 많은 기능들의 확장보다는 신뢰성, 보안, 성능 등에 중심을 두고었다고 할 수 있다. 여기서는 많이 사용되고 있는 mod_ssl을 기준으로 설치 및 설정 방법에 대해서 알아보고자 한다. 'mod_ssl'프로젝트의 목표는 Apache 1.3을 기반으로 Secure Socket Layer(SSL v2/v3)와 Transport Layer Security(TLS v1)프로토콜을 통해 높은 수준의 보안을 제공해 주는 것이다. 이것은 'SSLeay'를 기반으로 오픈소스인 SSL/TLS툴킷 'OpenSSL'을 이용한 것이다. 이미 언급했듯이 mod_ssl은 BSD 스타일의 라이선스를 가지고 있어 상업적인 목적의 사용에도 자유롭게 사용할 수 있다. mod_ssl의 주요 특징으로는 다음과 같다.
4. 단계별 mod_ssl 설치 mod_ssl을 설치하기 위해서는 다른 모듈들과 달리 복잡한 과정 및 여러 소프트웨어들의 설치를 해야한다. 하지만 여러분이라면 어렵지 않게 설치할 수 있을 것이라 생각한다. 각 소프트웨어 들의 설치에 앞서서 다음과 같이 필요한 패키지들은 무엇이 있는지 알아보도록하자.
상기의 패키지들은 FTP자료실에서 다운로드 할 수 있다. 앞으로 설명할 설치방법은 여러분이 웹서버에 어떠한 방법으로 설치하느냐 하는 것에 따라 달라질 수 있기 때문에 이글은 어느 한쪽에 치우지지 않고 어떻게 SSL을 지원하는 아파치 웹서버를 설치할 수 있는 가에 대해 단계마다 설명할 것이다. 우선 각 패키지들을 다운 받은후 openssl의 설치부터 시작해 보도록 하겠다. [root@www linux-src]# ls apache_1.3.22.tar.gz mod_ssl-2.8.5-1.3.22.tar.gz openssl-0.9.6.tar.gz mm-1.1.3.tar.gz openssl-0.9.6 [root@www linux-src]# cp *.gz /usr/local/src [root@www linux-src]# cd /usr/local/src [root@www src]# tar xvfz openssl-0.9.6.tar.gz
[root@www src]# rpm -qa|grep openssl openssl-python-0.9.6-3 openssl-perl-0.9.6-3 openssl-devel-0.9.6-3 openssl-0.9.6-3 openssl095a-0.9.5a-1 [root@www src]# rpm -e openssl-python [root@www src]# rpm -e openssl-perl [root@www src]# rpm -e openssl-devel [root@www src]# rpm -e openssl095a [root@www src]# rpm -e openssl error: removing these packages would break dependencies: openssl is needed by mod_ssl-2.8.4-2wl openssl >= 0.9.3a is needed by perl-Net_SSLeay-1.05-4wl openssl >= 0.9.5a is needed by stunnel-3.13-3 openssl >= 0.9.5a is needed by openssh-2.9p2-1 openssl = 0.9.6 is needed by openssh-2.9p2-1 openssl >= 0.9.5a is needed by openssh-2.9p2-1 생략
[root@www src]# rpm -e --nodeps openssl
소스파일은 기본적으로 컴파일이 필요하기 때문에 컴파일하기 위해 필요한 관련 설정을 'config'스크립트를 통해 'Makefile'을 생성한다. [root@www src]# cd openssl-0.9.6 [root@www openssl-0.9.6]# ./config --prefix=/usr/local --openssldir=/usr/local/ssl -fPIC shared no-threads 'config'에서는 다양한 옵션 지정이 가능하다. 여기서 사용한 'no-threads'는 OpenSSL의 성능을 높이기 위해 스레드를 사용하지 않는다고 지정했다. 아파치 1.3은 이미 알고 있는 것과 같이 아파치 2.0에서 지원할 스레드방식을 지원하지 않기 때문에, 기본적으로 지원하는 스레드를 사용하지 않기 위해서 이옵션을 지정했다. '--openssldir'은 옵션의 이름에서도 알 수 있듯이 OpenSSL 파일들의 디렉토리를 지정하는 것이다. mod_ssl을 Dynamic Shared Object(DS)로 생성하기 위해서는 OpenSSL의 생성시 '-fPIC'옵션으로 Position Independent Code(PIC)를 사용하도록 지정해야 한다. 여기서 주의할 점은, 대소문자에 유의해 '-fPIC'를 사용해야 하며 '-fpic'가 아니라는 점이다. 이렇게 사용해야 하는 이유는, 몇몇 플랫폼에서 OpenSSL이 DSO로 작동할 경우 문제를 가지고 있기 때문이다. Linux, FReeBSD와 같은 x86플랫폼에서는 특별한 문제가 없으나, 솔라리스2.6을 SPARC에서 사용하는 경우 같이 특정 플랫폼에서는 실행시에 코어를 발생하는 경우가 있다. 이러한 경우에는, OpenSSL을 '-fPIC'(GCC를 사용하는 경우) 또는 '-KPIC'(SVR4 컴파일러) 옵션을 주어 컴파일을 해야 한다. 컴파일을 수행하고, 추가적으로 아래와 같이 'test'라고 인수를 주어 설치하기에 앞서 테스트를 수행해 볼 수가 있다. [root@www openssl-0.9.6]# make [root@www openssl-0.9.6]# make test [root@www openssl-0.9.6]# make install
'make install'을 통해 지정된 경로에 설치하게 된다. OpenSSL의 설치는 mod_ssl의 사용을 위해 설치를 끝마치고, 다음에서 설명할 'MM'은 Apache/EAPI에서 공유메모리를 지원하고자 하는 경우에 생성하는 것으로, 추가적인 것이이기 때문에 이 기능을 필요로 하지 않는다면 다음 단계의 과정으로 넘어가면 된다. [root@www src]# tar xvfz mm-1.1.3.tar.gz [root@www src]# cd mm-1.1.3 [root@www mm-1.1.3]# ./configure --prefix=/usr/local/mm [root@www mm-1.1.3]# make [root@www mm-1.1.3]# make install
혹시 아파치가 설치되지 않았다면, 설치한다. 다음은 DSO형식으로 설치하는 방법이다. 당연히 기존에 설치된 것은 지워야겠지요
[root@www src]# tar xvfz apache_1.3.22.tar.gz [root@www src]# cd apache_1.3.22 [root@www apache_1.3.22]# [root@www apache_1.3.22]# rpm -qa|grep apache apache-manual-1.3.20-2wl apacheconf-0.8-3 apache-devel-1.3.20-2wl apache-1.3.20-2wl [root@www apache_1.3.22]# [root@www apache_1.3.22]# rpm -e apache-manual error: cannot remove /var/www/html/manual/mod - directory not empty error: cannot remove /var/www/html/manual - directory not empty [root@www apache_1.3.22]# rpm -e apache-devel [root@www apache_1.3.22]# rpm -e apacheconf [root@www apache_1.3.22]# rpm -e apache error: removing these packages would break dependencies: apache is needed by paranmail-0.97-2wl apache = 1.3.20-2wl is needed by mod_ssl-2.8.4-2wl webserver is needed by mod_dav-1.0.2-4 webserver is needed by mod_perl-1.24_01-2 webserver is needed by webalizer-2.01_06-8 webserver is needed by auth_ldap-1.4.7-2 webserver is needed by nut-cgi-0.44.1-5 [root@www apache_1.3.22]# [root@www apache_1.3.22]# rpm -e paranmail [root@www apache_1.3.22]# rpm -e mod_dav [root@www apache_1.3.22]# rpm -e mod_perl [root@www apache_1.3.22]# rpm -e webalizer [root@www apache_1.3.22]# rpm -e auth_ldap [root@www apache_1.3.22]# rpm -e nut-cgi [root@www apache_1.3.22]# [root@www apache_1.3.22]# ./configure --prefix=/usr/local/httpd --enable-shared=max --enable-module=all --disable-module=auth_db [root@www apache_1.3.22]# make [root@www apache_1.3.22]# make install
mod_ssl을 설치하기 위한 기본적인 패키지 설치가 완료됐다면 본격적인 mod_ssl의 생성에 대해 들어가 보도록 하겠다. 우선 여러분들의 시스템에 아파치 웹서버가 설치돼 있지 않다면 mod_ssl의 'configure'스크립트를 이용해 쉽게 설정이 가능하다. 이것은 mod_ssl의 컴파일에 앞서 여러 옵션을 통해 지정하게 되는데, 아파치와 관련한 여러 APACI설정 옵션을 지정할 수 있다. [root@www src]# tar xvfz mod_ssl-2.8.5-1.3.22.tar.gz [root@www src]# cd mod_ssl-2.8.5-1.3.22 [root@www mod_ssl-2.8.5-1.3.22]# ./configure --with-apache=/usr/local/src/apache_1.3.22 --with-ssl=/usr/local/ --prefix=/usr/local/httpd --enable-shared=ssl --with-mm=/usr/local/mm 설정했으면 위에서 지정한 아파치 경로로 이동해 'make'로 컴파일을 수행하면 된다. 이와 같은 방법은 아파치 소스에서 따로 'configure'해 줄 필요없이 바로 컴파일만을 수행해 주면 된다는 점이다. 만약 직접적으로 아파치에서 추가적인 옵션을 지정하려한다면 위와 같은 과정을 통해 아파치 소스체서 'configure' 실행시 '--enable-module=ssl'을 지정하면 된다. [root@www mod_ssl-2.8.5-1.3.22]# cd /usr/local/src/apache_1.3.22 [root@www apache_1.3.22]# SSL_BASE=/usr/local/ EAPI_MM=/usr/local/mm ./configure --enable-module=ssl --prefix=/usr/local/httpd(생략가능) [root@www apache_1.3.22]# make [root@www apache_1.3.22]# make install 위와 같이 수행하면 여러분들의 입맛에 맞는 추가적인 옵션이 들어갈 수 있다. 여기서 'SSL_BASE'와 'EAPI_MM'변수를 사용했는데 각각 OpenSSL이 설치된 경로와 MM의 경로다. 설정하는데 있어 문제가 있는 경우에는 각 변수를 지정해 사용할 각각의 패키지 경로가 어디있는지 지정하면 된다. 지금까지 방법은 DSO 방식으로 생성할 경우이며, 정적인 모듈을 생성하는 것이며, 'configure --enable-module=ssl' 옵션을 지정하면 된다. '--enable-shared=ssl'옵션은 DSO 방식으로 'libssl.so' 파일을 생성한다. 이외에, APXS를 통해 DSO 모듈을 쉽게 생성해 낼 수 있는 방법이 있다. [root@www src]# cd mod_ssl-2.8.5-1.3.22 [root@www mod_ssl-2.8.5-1.3.22]# ./configure --with-apxs=/usr/local/httpd/bin/apxs --with-ssl=/usr/local/ --with-mm=/usr/local/mm [root@www mod_ssl-2.8.5-1.3.22]# make [root@www mod_ssl-2.8.5-1.3.22]# make install
위와 같은 방법은 기존에 DSO 방식을 지원하도록 설치된 아파치에서 APXS를 이용해 'libssl.so'파일을 생성하고 아파치가 설치된 곳의 'libexec'디렉토리 안에 파일을 복사해 넣는 과정을 나타낸 것이다. 계속해서 다음의 명령을 통해 테스트용 인증서를 생성하게 된다. [root@www apache_1.3.22]# make certificate 이미 개인키와 인증서가 있는 경우에는 'make certificate'를 수행할 필요가 없다. '--with-crt'와 '--with-key'로 인증서와 키를 지정해 주면 된다. [root@www mod_ssl-2.8.5-1.3.22]#./configure --with-apache=/usr/local/src/apache_1.3.22 --with-ssl=/usr/local/ --prefix=/usr/local/httpd --enable-shared=ssl --with-mm=/usr/local/mm --with-crt=/usr/local/httpd/conf/ssl.crt/server.crt --with-key=/usr/local/httpd/conf/ssl.key/server.key 위와 같이 추가적으로 옵션을 지정하면 된다. 설치시에 'make certificate' 또는 '--with-crt', '--with-key'를 지정하지 않는 경우에는 수동으로 'httpd.conf'파일에서 인증서와 키의 경로를 지정하면 된다. 현재 인터넷과 같은 개방형 인프라에서 사용자 데이터의 보안 및 신원 인증을 위한 방법으로는 공개키암호화알고리즘이 있다. 이 공개키 알고리즘을 이용하는 경우 사용자는 올바른 사용자의 키를 가지고 암호화가 이루어져야만 한다. 그러나 공개키 서버 등을 통하거나 또는 다른 방법을 통해 공개키의 교환은 자유롭게 이루어지고 있다. 이름에서 주는 의미가 그렇듯이 공개키 자체는 외부에 공개되어지는 키(key)다. 바로 이 점이 문제이며, 여기에 'man-in-the-middle' 공격이 존재해 잠재적으로는 위험성을 안고 있다. 이런 종류의 공격은 누군가가 특정한 사용자의 이름과 아이디로 수신자인 것처럼위장해 키를 게시할 경우, 송신자는 잘못된 키로 암호화해 전송하게 되고 이과정에서 그키를 게시한 사용자에 의해 정보가 노출될 수 있다. 디지털 인증서는 이러한 공개키가 믿을 수 있는 인증기관을 통해 인증됐다는 것을 증명해 주는 것이다. 인증서는 증명서의 형식으로 여러분들의 주민등록증, 운저면허증과도 같다. 이런 것들은 여러분들을 증명해 줄 수 있는 중요한 정보가 들어가 있고, 누군가에 의해 여러분들은 증명된 것이다. 디지털 인증서의 기능은 바로 실제적인 인증서와도 같은 역할을 하며, 공개키와 기타 증명하기 위한 여러 정보들을 가지고 있다. 다음과 같이 세가지로 이루어져 있다.
위와 같은 정보와 같이 디지털 인증서의 목적은 누군가 또는 어떤 기관에 의해 그 사용자를 증명해 주는 것이다. 메시지의 송신자와 수신자 모두가 신뢰할 수 있는 제3의 인증기관을 바탕으로 그 인증기관에서 발행하는 인증서를 상호교환 및 확인을 통해 상대방의 신원인증 등을 하게 되는데, 이렇게 공개키를 증명해주는 기관을 인증기관(Certification Authority,CA)이라고 한다. 인증서에는 몇가지가 있으며, 그 중에서도 여러분들이 필요로 하게 되는 것은 "SSL 서버 인증서"다. 인증서에는 임의의 정보가 무질서하게 들어가 있는 것이 아니라, 어느 일정한 포맷이 있다. 많이 사용하는 포맷 방식으로는 X.509가 있다. X.509의 형식은 ITU(International Telecommunication Union)에서 제정한 형식을 따르고 있어 이론적으로는 한 애플리케이션에서 만든 것들은 다른 애플리케이션에서 호환해 사용 가능하다. 하지만 실제적으로는 기업마다 확장된 X.509인증서를 사용하고 있는 경우가 있어 완벽한 호환은 기대할 수 없다. X.509인증서에는 여러 표준의 필드를 포함하고 있고, 이 필드들은 다음과 같다.
이와 같이 인증서를 생성하기 전에 알아본 내용에 따라 다음에서 알아볼 과정에 참고하기 바라며, 'make certificate'를 수행하면 다음과 같은 화면을 볼 수 있다.
make[1]: Entering directory `/usr/local/src/apache_1.3.22/src' SSL Certificate Generation Utility (mkcert.sh) Copyright (c) 1998-2000 Ralf S. Engelschall, All Rights Reserved.
Generating test certificate signed by Snake Oil CA [TEST] WARNING: Do not use this for real-life/production systems ______________________________________________________________________
STEP 0: Decide the signature algorithm used for certificate The generated X.509 CA certificate can contain either RSA or DSA based ingredients. Select the one you want to use. Signature Algorithm ((R)SA or (D)SA) [R]:엔터 서명에 사용할 알고리즘 RSA 또는 DSA(Digital Signature Algorithm)을 선택한다. 여기서는 RSA인 [R]을 선택해 보도록 하겠다. ______________________________________________________________________
STEP 1: Generating RSA private key (1024 bit) [server.key] 48482 semi-random bytes loaded Generating RSA private key, 1024 bit long modulus ..........++++++ .......................++++++ e is 65537 (0x10001) 개인키를 생성하며 'server.key'파일에 저장한다. 다음은 개인키에 이어 생성하게 될 X.509인증서다. 예제를 참고해 여러분들이 사용할 정보를 알맞게 기재하면 된다. 여기서 주의할 점은, "Common Name"에는 도메인 이름 뿐만 아니라 호스트네임까지 포함한 FQDN(Fully-qualified-domain-name)형식으로 입력해야 한다. 여기서는 "www.leelab.co.kr"으로 사용했으며, 만약 실제 서버에 접속시 인증서에 사용한 "www.leelab.co.kr"을 사용해 접속해야지, 이외의 도메인 네임 또는 아이피로 접속하게 되면, <화면1>과 같은 화면을 보게 된다.
<화면1> 요청한 정보와 인증서의 내용이 다를 경우 나타나는 창 ______________________________________________________________________
STEP 2: Generating X.509 certificate signing request [server.csr] Using configuration from .mkcert.cfg 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. ----- 1. Country Name (2 letter code) [XY]:KR 2. State or Province Name (full name) [Snake Desert]:엔터 3. Locality Name (eg, city) [Snake Town]:Kunsan 4. Organization Name (eg, company) [Snake Oil, Ltd]:LeeLAB 5. Organizational Unit Name (eg, section) [Webserver Team]:Open Lecture Project Team 6. Common Name (eg, FQDN) [www.snakeoil.dom]:www.leelab.co.kr 7. Email Address (eg, name@FQDN) [www@snakeoil.dom]:root@www.leelab.co.kr 8. Certificate Validity (days) [365]:엔터 세 번째 과정을 통해 아파치 웹서버에서 테스트로 제공하는 "Snake Oil"사의 CA를 통해 인증서를 생성한다. X.509의 버전을 3으로 선택한다.
______________________________________________________________________
STEP 3: Generating X.509 certificate signed by Snake Oil CA [server.crt] Certificate Version (1 or 3) [3]: Signature ok subject=/C=KR/ST=/L=kunsan/O=LeeLAB/OU=Open Lecture Project Team/CN=www.leelab. co.kr/Email=root@www.leelab.co.kr Getting CA Private Key Verify: matching certificate & key modulus read RSA key Verify: matching certificate signature ../conf/ssl.crt/server.crt: /C=XY/ST=Snake Desert/L=Snake Town/O=Snake Oil, Ltd/ OU=Certificate Authority/CN=Snake Oil CA/Email=ca@snakeoil.dom error 10 at 1 depth lookup:Certificate has expired OK ______________________________________________________________________
마지막 네 번째 과정을 통해 개인키에 대한 'pass phrase'를 지정한다. 개인키를 보호하기 위한 과정으로 [Y]를 선택한후 패스워드가 필요하게 되므로 잊어 버리지 않도록 한다.
STEP 4: Enrypting RSA private key with a pass phrase for security [server.key] The contents of the server.key file (the generated private key) has to be kept secret. So we strongly recommend you to encrypt the server.key file with a Triple-DES cipher and a Pass Phrase. Encrypt the private key now? [Y/n]:엔터 read RSA key writing RSA key Enter PEM pass phrase:암호입력 Verifying password - Enter PEM pass phrase:같은 암호입력 Fine, you're using an encrypted RSA private key. ______________________________________________________________________
RESULT: Server Certification Files
o conf/ssl.key/server.key The PEM-encoded RSA private key file which you configure with the 'SSLCertificateKeyFile' directive (automatically done when you install via APACI). KEEP THIS FILE PRIVATE!
o conf/ssl.crt/server.crt The PEM-encoded X.509 certificate file which you configure with the 'SSLCertificateFile' directive (automatically done when you install via APACI).
o conf/ssl.csr/server.csr The PEM-encoded X.509 certificate signing request file which you can send to an official Certificate Authority (CA) in order to request a real server certificate (signed by this CA instead of our demonstration-only Snake Oil CA) which later can replace the conf/ssl.crt/server.crt file.
WARNING: Do not use this for real-life/production systems
make[1]: Leaving directory `/usr/local/src/apache_1.3.22/src' [root@www apache_1.3.22]#
위의 몇가지 과정을 통해 생성된 파일들든 다음 표와 같은 위치에 저장된다.
여기서 인증된 기관에 직접 요청을 해 인증서를 받는 부분에 대해 언급하고자 한다. 베리사인에서는 2주 동안 사용해 볼 수 있는 테스트용 인증서를 발급해 주고 있으며, FreeSSL이라는 곳에서는 인증서를 처음에 무료로 발급해 주고 있다. 재발급시에는 물론 약간의 비용을 지불하게 되고, 브라우저가 인식할 수 있는 것도 70%이상이므로 테스트하는 역할로 충분하다. 1년동안 무료로 사용할 수 있으며, 128비트를 지원하고 있다. 인터넷 익스플로러 5.01 이상이면 사용하는데 문제가 없을 것이다. 자세한 것은 홈페이지(www.freessl.com)을 참고하기 바라며, 인증서를 신청하는 폼은 다음<화면2>와 같다. <화면2> FreeSSL에서 인증서 요청을 하기 위한 폼
<화면2>에서와 같이 신청자에 대한 정보를 입력하고 위에서 만든 CSR을 폼에 복사해 넣는다. '-----BEGIN CERTIFCATE REQUEST-----' 시작하고 '-----END CERTIFCATE REQUEST-----' 끝나는 내용까지 다. 그 다음 신청한 인증서에 대한 증명을 해줄 수 있는 이메일 주소를 요청할 것이다. FreeSSL은 여러 이메일을 주소를 나열해 줄 것이고 여러분들은 하나를 선택한 후, 이메일 도착 시 그곳에 지정된 내용에 따라 '확인' 작업을 해주면 FreeSSL에 의해 서명된 인증서가 여러분의 이메일로 도착한다. 베리사인과 같은 인증기관에서는 인증서를 발급해 주기 위해 그 회사의 사업자 등록증과 같은 여러정보를 요청한 후 절차를 거친후에 인증서를 발급해 주게 된다. 작업을 마치게 되면 <화면3>을 보게 되며 'I Approve'를 선택후 인증서가 도착하기를 기다리면 된다. 도착한 인증서는 server.crt 또는 domainname.crt와 같은 형식으로 저장한다.(-----BEGIN CERTIFCATE-----로 시작해 -----END CERTIFCATE-----로 끝나는 부분까지).
<화면3> 인증서의 승인을 요청하하는 페이지 아파치에서 제공해주는 'make certificate'를 통해 개인키 및 인증서를 자동 생성했다. 다음과 같은 방법을 통하면 직접 생성할 수 있다.
[root@www src]# openssl md5 * > rand.dat [root@www src]# openssl genrsa -rand rand.dat -des3 -out server.key 926 semi-random bytes loaded Generating RSA private key, 512 bit long modulus .++++++++++++ ........++++++++++++ e is 65537 (0x10001) Enter PEM pass phrase:암호입력 Verifying password - Enter PEM pass phrase:암호입력 [root@www src]# ls rand.dat server.key [root@www src]# 개인키의 생성후 CSR을 만들기 위해서는 다음과 같이 한다. [root@www src]# openssl req -new -key server.key -out server.csr Using configuration from /usr/local/ssl/openssl.cnf Enter PEM pass phrase: 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) [AU]:KR State or Province Name (full name) [Some-State]: Locality Name (eg, city) []:kunsan Organization Name (eg, company) [Internet Widgits Pty Ltd]:LeeLAB Organizational Unit Name (eg, section) []:Open Lecture Project Team Common Name (eg, YOUR name) []:jklee Email Address []:jklee@iseong.or.kr
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:jklee@leelab.co.kr An optional company name []: [root@www src]# 생성되어진 CSR을 자세히 보기 위한 명령어는 다음과 같다. [root@www src]# openssl req -noout -text -in server.csr Using configuration from /usr/local/ssl/openssl.cnf Certificate Request: Data: Version: 0 (0x0) Subject: C=KR, ST=, L=kunsan, O=LeeLAB, OU=Open Lecture Project Team, CN=iseong/Em ail=jklee@www.leelab.co.kr Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (512 bit) Modulus (512 bit): 00:be:39:83:77:ec:76:dc:33:ee:02:57:00:51:ca: e9:bf:c6:88:bd:84:d2:ad:7b:ca:6b:07:fc:67:94: 09:f7:02:c1:12:2d:34:ce:5c:0c:9c:82:ec:4c:84: c6:8c:73:89:6f:b6:5f:ea:fe:f6:d6:58:de:39:00: 6f:f8:76:d4:4f Exponent: 65537 (0x10001) Attributes: challengePassword :jklee@www.leelab.co.kr Signature Algorithm: md5WithRSAEncryption 5e:9a:42:fb:f3:88:fe:13:7b:4e:48:97:48:12:7a:22:1b:89: 2b:db:6c:ef:45:48:2d:5c:81:1b:82:94:54:9a:73:42:fc:72: 18:9d:bb:53:2b:f2:29:61:11:c1:1d:a1:f6:f0:1d:3b:da:1f: 9a:b4:bc:20:ef:6a:ea:11:e7:4a [root@www src]#
인증서를 받은 다음 'httpd.conf'에서 개인키와 인증서를 지정해야 한다. 위에서 이미 언급한 'SSLCertificateFile'과 'SSLCertificateKeyFile'지시어를 이용하게 된다. SSLCertificateFile /usr/local/httpd/conf/ssl.crt/server.crt SSLCertificateKdyFile /usr/local/httpd/conf/ssl.key/server.key 다음 'apachectl'을 통해 웹서버를 시작하게 되면 SSL을 이용한 웹서버가 작동한다. [root@www src]# /usr/local/httpd/bin/apachectl startssl Apache/1.3.22 mod_ssl/2.8.5 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases.
Server www.leelab.co.kr:443 (RSA) Enter pass phrase:암호입력
Ok: Pass Phrase Dialog successful. /usr/local/httpd/bin/apachectl startssl: httpd started [root@www src]#
SSL은 기본적으로 443번 포트를 사용한다. 443번을 사용하는 경우에는 https://www.leelab.co.kr과같이 사용하면 된다. SSL이 작동하는 브라우저에서는 다음과 같은 유사한 화면을 볼 수 있다. (화면4) <화면4> 인터넷 익스플러러에서의 SSL이 작동하는 모습
|
||||||||||||||||||||||||||||
[목차] |