Chaper.5 FAQ

FAQ 뉴스그룹 comp.infosystems.www.servers.unix mod_ssl 지원을 위한 메일링 리스트인 sw-mod-ssl@engelschall.com 올라왔던 질문들을 모은 것이다.

About the module

mod_ssl Apache-SSL 어떻게 다르며, mod_ssl 어디에서 출발한 것인가? [L]

mod_ssl Apache-SSL 비해 많은 변화가 있었으며, 자세한 내용은 mod_ssl 배포판의 CHANGES CHANGES.20 파일을 참조한다. 대부분은 내부적인 변경이나 소스 코드의 변경이며, 밖으로 보여지는 주요한 변화는 다음과 같다 :

mod_ssl Apache-SSL에서는 제공하지 않는 완전한 사용자 매뉴얼을 제공하며, 여기에는 모든 Configuration directives, 환경변수(environment variable) 그리고 외의 많은 것들에 대하여 기술하고 있다. 또한 mod_ssl Apache/SSL/SSLeay 대한 FAQ 제공하며, FAQ에서는 CA 설정하는 , 서버 증명서(Server Certificate) 생성하는 등등에 대한 자세한 설명을 제공한다.

Mod_ssl 사용자들이 backdoore security hole 등을 찾아보는데 도움이 있도록 소스 코드에 자세한 설명을 덧붙이고 있으며, 이것은 보안에 관련된 소프트웨어에 있어서 매우 중요하게 고려되어야 사항이다. Mod_ssl 패키지의 소스 코드는 Apache 코딩 스타일을 따르고 있으며, API 단계를 논리적으로 따른다.

Mod_ssl SSL 구현하기 위하여 Extended API 사용하며, Apache kernel SSL 암호화에 관련된 코드를 직접 패치하는 것이 아니라 EAPI 패치함으로써 커널과 mod_ssl 서로 독립적이 있도록 하였다. 이로 인하여 SSL 암호화에 관련된 코드는 단지 SSL 모듈 자체(src/modules/ssl/ 디렉토리)에만 존재하게 되며, Apache 커널에서 직접적으로 SSL 참조하지 않는다.

Mod_ssl Dynamic Shared Object(DSO) 기능을 지원하며, DSO 지원으로 run-time 시의 유연성(flexibility) 최대한 높일 있게 된다. , Apache 컴파일할 SSL Apache 실행파일(httpd) 넣을 것인가 넣지 않을 것인가를 결정할 필요가 없으며, 단지 필요하면 mod_so 제공하는 LoadModule directive 이용하여 mod_ssl 로딩하면 된다. 기능은 두가지 면에서 매우 유용하다: Vendor package maintainer에게 유연성 있는 패키지를 만들 있는 방법을 제공하며, Apache 사용자에게 있어서는 하나의 Apache만을 설치하고서 하나 이상의 Apache(SSL 사용하는 Apache SSL 사용하지 않는 Apache) 실행할 있게 해준다.

Mod_ssl Win32 플랫폼에서 동작하며, 이는 Apache SSLeay Wind32 플랫폼에서 동작함에 의해서 가능하다. mod_ssl 패키지들의 발전을 따르고 있으며, 귀찮은 플랫폼에서도 항상 요구되는 지원 사항들을 제공한다. Unix/DSO 경우와 같이 Win32에서도 mod_ssl mod_so LoadModule directive 의해 로딩될 있는 표준 DLL 통해 Apache 적용되어진다.

Apache-SSL 사용자로 하여금 직접 patch cp 같은 명령어를 사용하게 만들었던 것에 비하여 mod_ssl 자동화된 설정 환경을 제공함으로써 매우 쉽게 Apache 소스 트리에 적용되어진다. 이를 위하여 mod_ssl Apache 1.3 제공하는 Autoconf-style Interface(APACI) 지원한다. 또한 mod_ssl RSAref 사용할 있으며, SSLeay 어느 위치에 설치되었는가를 상관하지 않는다.

Apache-SSL mod_ssl 같은 Apache 소스 트리에 적용하기 위한 손쉬운 방법을 제공하지 않으며 어느정도의 수작업 편집과 patch 작업이 필요하다. Configuration 때와 Install Apache-SSL Apache 1.3 Autoconf-style Interface(APACI) 쉽게 통합되어질 없으며, 이미 설치되어 있는 SSLeay out-of-the-source-only SSLeay와의 차이점을 자동으로 인식하지 않는다. 또한 SSLVerifyClient 인수로 이름 대신에 0에서 2까지의 숫자를 사용하는데, 이유는 내부적으로 enum 사용되었고 또한 CustomLog %{version}c construct 대한 결과값으로 SSLeay 0.9에서는 SSL2, SSL3 등을 사용하는 것에 비하여 SSLeay 0.8에서는 2, 3 사용되었기 때문이다.

Mod_ssl Apache-SSL에서 제공하지 않았던 몇가지 기능을 덧붙였다:

Mod_ssl log level 따른 SSL 전용 로그 파일을 제공하며, error level 메시지는 자동으로 Apache 에러 로그 파일에 중복해서 기록한다. 또한 occuring system SSLeay 에러 메시지는 자동으로 mod_ssl 메시지에 덧붙여지며, 부가적으로 mod_ssl 매우 자세한 힌트와 함께 SSLeay 메시지를 기록한다. Mod_ssl 암호화된 개인키 파일들의 handling 있어서 매우 새로운 기능을 제공한다. 먼저, 개인키를 permanent memory pool 저장함으로써 Apache 완전히 죽이지 않고서도 서버를 재시동할 있게 되었다. 두번째는 pass-phrase dialog 훨씬 사용하기 편리하고 기능이 향상되었다: pass-phrase 입력받는 횟수를 줄이기 위해 pass-phrase reuse algorithm 사용하며, 틀린 pass-phrase 인식하여 재시도할 있게 하며, pass-phrase 일괄 입력하기 위하여 pass-phrase 제공하는 외부 프로그램을 사용할 있는 interface 제공한다. Mod_ssl 제공하는 SSLCACertificateReqFile directive 클라이언트가 서버 인증의 속도를 높이기 위해 서버로부터 CA Certificate 로딩하는데 사용되는 SSLv3 feature 위한 differect set of CA Certificates 설정하는데 사용된다. Apache 내에서 외부 프로그램을 제어하는 것이 그다지 믿을 만하게 동작하지 않기 때문에, Mod_ssl Apache-SSL에서 SSL 세션을 저장하기 위해 사용하는 gcache 기능을 더욱 강력한 DBM 기반의 솔류션으로 대체하였다. 부가적으로 cache 대한 inter-process access 동기화하기 위하여 mutex 사용한다. Mod_ssl SSLeay RSAref 함께 조합하여 사용할 있는 기능, RSAref 패키지를 이용하여 Apache에서의 SSL Extension 구현할 있는 기능을 제공한다. SSLRequire directive 임의의 boolean expression 조합을 접근 제어의 조건으로 사용할 있게 해준다. Apache Proxy Module(mod_proxy) 대한 HTTPS 기능을 지원한다. Mod_ssl Win32 Apache 대한 SSL Extension으로서는 처음으로 소스를 공개한 패키지이다.

mod_ssl 대한 자세한 내용은 mod_ssl 배포판에 포함되어 있는 CHANGES 파일과 CHANGES.20 파일을 참조하기 바란다.

그렇다면 지금부터 Apache-SSL 사용하지 말아야 하는가? [L]

그렇지 않다. 단지 mod_ssl 사용할 있음을 의미할 뿐이다. 알려져 있는 SSL 솔류션인 Apache-SSL 여전히 필요한 기능을 훌륭히 수행하며, Ben Laurie 아직도 패키지의 관리를 위해 많은 일들을 하고 있다. 단지 중요한 차이점은 Ben Laurie 목적과 Ralf S. Engelschall 목적이 다르다는 것이다. 만약 패키지의 차이점에 대하여 별로 필요성을 느끼지 않는다면 굳이 mod_ssl 업그레이드할 이유는 없다. 단지 Apache-SSL 사용하는 것이 편하게 느껴진다면 Apache-SSL 사용하는 것이고 그렇지 않다면 mod_ssl이나 나은 기능을 제공하는 다른 상용 SSL 솔류션을 사용하라는 것이다. 다시 말해서 어떤 솔류션이 다른 것들보다 낫다고 말할 수는 없으며, 어느 것을 사용하는가는 개인적인 요구사항에 달려있는 것이다.

On which Apache-SSL version is mod_ssl actually based? [L]

Mod_ssl 본래 1998 4 Apache-SSL 1.17 버전을 Apache 1.2.6에서 Apache 1.3b6 포팅하는 작업에서 만들어졌다. Ben Laurie 개발 사이클과 맞지 않음으로 인하여 mod_ssl 기존의 mod_ssl 새로운 Apache-SSL 1.18 조합하여 Apache 1.3.0 위한 버전으로 태어나게 되었다. 시점부터 mod_ssl 독자적인 개발을 하게 되었으며, Apache-SSL에서 개선되는 부분들은 이후 mod_ssl 받아들이는 방식으로 진행되어져 왔다. 다시 말하면, mod_ssl 가장 최신의 Apache-SSL 기반을 두고 있으며, Apache-SSL에서 개선되는 부분들을 항상 받아들이게 것이다.

Why is mod_ssl's version starting with 2.0.0? [L]

Mod_ssl 프로젝트가 Apache-SSL 프로젝트의 일환으로 계획되어진 것이었으며, 원래는 mod_ssl Apache-SSL 2.0.0 넣고자 하는 의도였으나, Ralf S. Engelschall Ben Laurie mod_ssl Apache-SSL 합치지 않겠다고 결정함으로써 mod_ssl 프로젝트는 mod_ssl이란 이름으로 새로운 패키지로서 발표되었다. 그러나 mod_ssl second generation 이란 의미를 표시하기 위해 첫번째 mod_ssl 버전은 2.0.0으로 결정되게 되었다.

How do I know which mod_ssl version is for which Apache version? [L]

그것은 간단하다. Mod_ssl <mod_ssl-version>-<apache-version>으로 구성된 버전 표기를 하며, 예를 들면 2.2.0-1.3.4 mod_ssl 버전이 2.2.0이며 Apache 버전 1.3.4 위한 것임을 의미한다. 또한 이는 mod_ssl 버전을 정확히 Apache 버전에만 적용할 있음을 의미한다.

Is mod_ssl Year 2000 compliant? [L]

Mod_ssl Y2K 문제를 해결하였다.

Mod_ssl 내부적으로 년도를 2자리로 표시하지 않으며, 시간의 표시를 현대의 대부분의 유닉스 시스템들이 사용하고 있는 시간 표시 방식인 ANSI C & POSIX numeric data type time_t 형식을 사용한다. 형식은 1970 1 1 00:00 UTC로부터 지금까지의 (second) 단위 시간을 가지고 있는 signed long 정수(보통 32bit) 시간을 표시한다. 수는 2000년이 아니라 20381월초에 overflow 발생한다. 또한 날짜와 시간의 표기(예를 들어 %{TIME_YEAR} ) 2자리 숫자로 표기하지 않고 4개의 숫자로 표기한다.

부가적으로, Apache 그룹의 2000 문제에 대한 발표에 따르면 Apache 서버는 2000 문제의 영향을 받지 않는다. 그러나 SSLeay OS ( Unix 혹은 Win32 platform) 2000 문제의 영향을 받지 않는가의 문제는 여기서 답변될 내용이 아니다.

What about mod_ssl and the Wassenaar Arrangement? [L]

Wassenaar Arrangement on Export Controls for Conventional Arms and Dual-Use Goods and Technologies 재래식 무기, dual-use good technology 대한 무역을 통제하기 위해 1995년에 설립된 국제기구(international regime)로서 기존에 있던 기구인 CoCom 대체한 기구이다. 다음의 33 가맹국이 있다: Argentina, Australia, Austria, Belgium, Bulgaria, Canada, Czech Republic, Denmark, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Japan, Luxembourg, Netherlands, New Zealand, Norway, Poland, Portugal, Republic of Korea, Romania, Russian Federation, Slovak Republic, Spain, Sweden, Switzerland, Turkey, Ukraine, United Kingdom and United States. 자세한 내용은 http://www.wassenaar.org 사이트를 참조한다.

간단히 말해서 Wassenaar Arrangement 목적은 국제적 혹은 지역적인 안보와 평안을 위협하는 군사적 능력(military capability) 제어하는데 있다. Wassenaar Arrangement 암호학 (Cryptography) 하나의 dual-use good으로서 제한하고 있으나 mass-market software free software 대해서는 수출 제한에서 면제하고 있다.

현재 Wassenaar GENERAL SOFTWARE NOTE(GSN) 대한 List of Dual Use Goods and Technologies And Munitions 따르면, public domain 속하는 소프트웨어는 제한하지 않는다고 되어 있다. 또한 DEFINITIONS OF TERMS USED IN THESE LISTS에는 다음과 같은 정의가 있다. in the public domain : This means "technology" or "software" which has been made available without restrictions upon its further dissemination. N.B. Copyright restrictions do not remove "technology" or "software" from being "in the public domain".

Wassenaar Agreement 따르면 mod_ssl SSLeay public domain 속하게 되며, 따라서, mod_ssl SSLeay Wassenaar Agreement 영향을 받지 않는다..

 

About Configuration

I want to run HTTP and HTTPS on the same machine. Is that possible? [L]

두가지 방법이 있다: 두개의 서버를 따로 실행하거나 하나의 서버에 두개의 서비스를 실행한다. 두개의 서버를 실행해야 특별한 이유가 없는 , 하나의 instance에서 SSL 필요로 하는 virtual host 대해서만 SSL 적용하는 방법을 사용하는 것이 간단하다. 만약 두개의 서버를 따로 실행하는 경우에는 두개의 서버가 각각 허용된 포트(보통 HTTP 80, HTTPS 443)에만 bind 시도하도록 되어 있는가를 확인해야 한다.

I know that HTTP is on port 80, but where is HTTPS? [L]

어느 포트에서든지 HTTPS 실행할 수는 있지만 표준 HTTPS 포트는 443번이며, 브라우져는 기본적으로 포트를 찾도록 되어 있다. 브라우져가 443번이 아닌 다른 포트를 찾도록 하기 위해서는 다음과 같은 URL 사용한다(포트가 666 경우):

https://secure.server.dom:666/

How can I speak HTTPS manually for testing purposes? [L]

보통 Apache HTTP 프로토콜을 간단하게 테스트할 다음을 이용한다.

$ telnet localhost 80

GET / HTTP/1.0

그러나 HTTPS 경우에는 SSL 프로토콜이 TCP HTTP 사이에 위치하기 때문에 HTTP 같이 쉽지 않다. 하지만 SSLeay 제공하는 s_client 프로그램을 이용하여 HTTPS 대해서도 HTTP 비슷한 테스트를 있다:

$ s_client -connect localhost:443 -state -debug

GET / HTTP/1.0

실질적인 HTTP 응답(response) 이전에 SSL handshake 대한 자세한 정보가 보여지게 된다. Apache 80번과 443 포트에서 제대로 동작하고 있는가를 체크하기 위해서는 다음과 같은 cURL tool 사용할 있다.

$ curl http://localhost/ (80 포트)

$ curl https://localhost/ (443 포트)

Why does my browser hang when I connect to my SSL-aware Apache server? [L]

https:// 형태의 URL 아닌 http:// 형태의 URL 사용하였을 있다. 경우 Apache 에러 로그파일에 SSL_Accept failed error: 140760EB: SSL routines: SSL23_GET_CLIENT_HELLO: unknown protocol 이라는 메시지가 나타나게 된다. 또한 이러한 현상은 SSL 지원하지 않는 서버에 https:// 접속을 시도하는 경우에도 나타난다. 이러한 경우에는 해당 가상 서버(virtual server) SSL 지원하고 있나를 확인해 본다.

How can I use relative hyperlinks to switch between HTTP and HTTPS? [L]

URL 변경하기 위해선 보통 Fully-qualified 하이퍼링크를 사용해야 하지만 mod_rewrite URL manipulation 기능을 이용하여 상대 경로(relative URL) 사용하면서도 동일한 효과를 얻을 있다:

RewriteEngine on

RewriteRule ^/(.*):SSL$ https://%{SERVER_NAME}/$1 [R,L]

RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L]

rewrite 규칙은 다음과 같은 형태의 하이퍼링크를 사용할 있게 해준다:

<a href="document.html:SSL">

 

About Certificates

What are RSA Private Keys, CSRs and Certificates? [L]

RSA 개인키는 암호화되어있는 메시지를 복호화 하는데 사용하는 디지털 파일이다. RSA 개인키는 그에 대응되는 공개키가 존재하며, 공개키는 증명서를 통하여 공개적으로 배포되어서 다른 사람들이 공개키를 가지고 메시지를 암호화하여 공개키의 주인에게 전송하게 된다. Certificate Signing Request(CSR) 증명서를 발급받기 위한 요청서로서 사람의 공개키와 이름을 포함한다. CSR CA에게 보내면 CA CSR 실재로 사용할 있는 증명서(real Certificate) 만들어 주게 되는데, 증명서에는 CSR 보낸 사람의 공개키, 이름, 증명서를 발급한 CA 이름이 들어 있으며, CA 의해서 서명 된다. CA 알고 있는 브라우져는 증명서의 서명을 확인할 있으며, 서명이 확인되면 증명서에 들어있는 RSA 공개키를 얻게 된다. 브라우져는 이렇게 얻은 공개키를 이용해서 공개키의 주인만이 복호화할 있는 메시지를 전송한다.

Seems like there is a difference on startup between the original Apache and an SSL-aware Apache? [L]

Mod_ssl 적용한 Apache 시동하는 것은 SSL 개인키가 pass phrase 필요로 하는 경우 pass phrase 요구하는 dialog 먼저 실행되는 것을 제외하고는 일반적인 Apache 시동하는 것과 거의 유사하다.

Pass phrase 수동으로 입력하는 것은 서버 시스템의 부팅 시에 Apache 시동하는 경우 문제가 있는데, How can I get rid of the pass-phrase dialog at Apache startup time? 설명된 단계를 따름으로써 이를 해결할 있다.

How can I create a dummy SSL server Certificate for testing purposes? [L]

서버 증명서가 반드시 알려져 있는 public CA 의해 서명될 필요는 없으며, 자신의 공개키가 포함된 증명서를 서명하는데 자신의 개인키를 사용할 있다. 이렇게 생성된 증명서를 자신의 서버에 설치하게 되면, 서버에 접속한 브라우져에는 증명서를 받아들일 것인가를 묻는 경고 메시지가 보여지게 되며, OK 버튼을 누르면 서버에 접속할 있다.

Apache 설치할 make install 명령으로 Apache install하기 전에 먼저 Apache 소스 트리의 가장 상위 디렉토리에서 make certificate 명령을 이용하여 self-signed SSL Certificate 생성할 있다. 증명서는 30일간 사용할 있으며, 또한 암호화되어지지 않는다(, Apache 시동할 pass phrase 묻지 않는다).

BUT REMEMBER: YOU REALLY HAVE TO CREATE A REAL CERTIFICATE FOR THE LONG RUN! HOW THIS IS DONE IS DESCRIBED IN THE NEXT ANSWER.

Ok, I've got my server installed and not want to create a real SSL server Certificate for it. How do I do it? [L]

Real SSL Server Certificate 생성하기 위한 과정은 다음과 같다:

1. SSLeay 시스템에 설치하고 PATH 환경변수에 SSLeay 경로를 설정한다.

2. 다음의 명령으로 Apache 서버에 대한 RSA 개인키를 생성한다( 개인키는 3DES 암호화되어 PEM 포맷으로 변환되어진다):

$ ssleay genrsa -des3 -out server.key 1024

생성하는 과정에서 PEM Pass Phrase 입력하게 되는데, pass phrase 잃어버리지 않도록 기록해 두어야 하며, 결과로 얻어지는 server.key파일은 이후의 복구를 위하여 안전한 곳에 백업해 둔다. 다음의 명령어로 RSA 개인키의 자세한 내용을 있다:

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

다음의 명령으로 decrypted PEM 버전의 RSA 개인키를 생성할 수도 있다(권장되지 않는다):

$ ssleay rsa -in server.key -out server.key.unsecure

3. RSA 개인키에 대한 Certificate Signing Request (CSR) 생성한다(PEM 포맷으로 생성된다):

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

다음의 명령으로 CSR 자세한 내용을 있다.

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

4. 생성된 CSR CA에게 보내어 CA 서명을 받음으로써 Apache 실재로 사용할 있는 증명서를 받는다. CSR 서명할 CA 선택에는 두가지의 옵션이 있다:

첫번째는 Verisign이나 Thawte 같은 상용 CA에게 CSR 서명을 받는 것으로서, 이경우에는 보통 해당 CA 홈페이지에서 CSR 입력한 요금을 지불하고 서명된 증명서를 받아서 server.crt 파일에 저장하면 된다. 상용 CA들의 자세한 정보는 다음의 사이트들을 참조한다:

Verisign http://digitalid.verisign.com/server/apacheNotice.htm

Thawte Consulting http://www.thawte.com/certs/server/request.html

CertiSign Certificadora Digital Ltda. http://www.certisign.com.br

IKS GmbH http://www.iks-jena.de/produkte/ca/

Uptime Commerce Ltd. http://www.uptimecommerce.com

BelSign NV/SA http://www.belsign.be

두번째 방법은 self-signed CA 사용하는 것이며, 경우 CSR 자신이 만든 CA 서명하게 된다. 다음 질문에서 자신의 CA CSR 서명하는 방법에 대하여 설명할 것이다.

다음의 명령으로 발급된 증명서의 자세한 내용을 있다:

$ ssleay x509 -noout -text -in server.crt

5. 위의 과정을 통하여 얻은 두개의 파일 server.key server.crt 위치를 httpd.conf 파일에서 각각 다음과 같이 지정해 준다:

SSLCertificateFile /path/to/this/server.crt

SSLCertificateKeyFile /path/to/this/server.key

server.csr 파일은 이상 필요하지 않다.

How can I create and use my own Certificate Authority (CA)? [L]

SSLeay 제공하는 CA.sh 스크립트를 가지고 Self-signed CA 생성하고 사용할 있으며, 스크립트를 이용하는 방법은 다음과 같다:

1. 다음의 명령으로 자신의 CA 대한 RSA 개인키를 생성한다( 개인키는 3DES 암호화되어 PEM 포맷으로 변환되어진다):

$ ssleay genrsa -des3 -out ca.key 1024

생성하는 과정에서 PEM Pass Phrase 입력하게 되는데, pass phrase 잃어버리지 않도록 기록해 두어야 하며, 결과로 얻어지는 server.key파일은 이후의 복구를 위하여 안전한 곳에 백업해 둔다. 다음의 명령어로 RSA 개인키의 자세한 내용을 있다:

$ ssleay rsa -noout -text -in ca.key

다음의 명령으로 decrypted PEM 버전의 RSA 개인키를 생성할 수도 있다(권장되지 않는다):

$ ssleay rsa -in ca.key -out ca.key.unsecure

2. CA RSA 키에 대한 self-signed CA 증명서(X.509 structure) 생성한다(PEM 포맷으로 생성된다):

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

다음의 명령으로 생성된 증명서의 자세한 내용을 있다:

$ ssleay x509 -noout -text -in ca.crt

3. 서명 작업을 위한 스크립트를 준비한다. ssleay ca라는 명령어는 몇몇 까다로운 요구사항을 필요로 하며, 또한 SSLeay 기본 설정에서는 사용자가 직접 ssleay ca 명령을 실행하는 것을 허용하지 않기 때문에 서명을 위한 스크립트가 필요하다. Mod_ssl sign.sh라는 이름의 서명을 위한 스크립트를 제공하며(pkg.contrib 디렉토리에 위치) 스크립트를 사용하기를 권장한다.

4. 다음의 명령으로 Apache 서버의 SSL 증명서를 생성하기 위한 CSR 서명한다:

$ ./sign.sh server.csr

CSR 서명함으로써 server.crt 파일을 얻게 되며, server.crt Apache 증명서로 사용하게 된다.

How can I change the pass-phrase on my private key file? [L]

다음의 명령어를 이용하여 개인키를 이전 pass-phrase 가지고 읽은 새로운 pass-phrase 다시 덮어쓴다:

$ ssleay rsa -des3 -in server.key -out server.key.new

$ mv server.key.new server.key

과정에서 두번의 PEM pass-phrase 요구하게 되는데, 첫번째에는 이전의 pass-phrase 입력하고 두번째는 새로운 pass-phrase 입력한다.

How can I get rid of the pass-phrase dialog at Apache startup time? [L]

Server.key 파일에 저장되어 있는 RSA 개인키는 보안 상의 이유로 암호화되어져 저장되어져 있기 때문에 Apache 시작하거나 재시동할 때마다 pass-phrase 입력 받기 위한 dialog 실행되게 된다. 만약 서버가 충분히 안전하다고 확신할 있는 경우 dialog 없앨 있다. 과정은 다음과 같다.

1. RSA 개인키로부터 암호화를 제거한다(원본 파일은 남겨둔다):

$ cp server.key server.key.org

$ ssleay rsa -in server.key.org -out server.key

2. server.key 파일을 루트만이 읽을 있도록 해준다.:

$ chmod 400 server.key

과정을 거쳐 server.key 암호화되지 않은 키를 가지게 되며, key 파일을 Apache 설치해 경우 이상 pass-phrase 요구하지 않게 된다. 그러나 이것은 보안상 상당한 위험을 가진다. 따라서 항상 파일의 접근 권한을 루트나 서버 사용자만이 파일에 접근할 있도록 설정해야 한다.

How do I verify that a private key matches its Certificate? [L]

개인키는 일련의 숫자들을 가지는데, 수들 2개는 공개키에 포함되며, 나머지는 개인키의 일부분이 된다. 공개키에 사용된 bit들은 증명서에 포함되며 숫자들은 CSR로부터 얻을 있다. 증명서의 공개키가 개인키의 public portin 일치하는가를 확인하기 위해서 증명서 파일과 개인키 파일을 다음의 명령으로 비교한다:

$ ssleay x509 -noout -text -in server.crt

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

키와 증명서 안의 modulus public exponent 부분이 서로 일치해야 한다. 그러나 public exponent 보통 65537이며 modulus 비교하는 것이 힘들기 때문에 다음과 같은 명령을 사용할 있다:

$ ssleay x509 -noout -modulus -in server.crt | ssleay md5

$ ssleay rsa -noout -modulus -in server.key | ssleay md5

명령은 매우 짧은 숫자들을 보여주며, 숫자들을 비교하면 된다. 만약 공개키와 개인키가 다르다면 숫자들이 다를 것이다. 특정 CSR 어느 키나 증명서에 대한 것인가를 알고자 때는 다음과 같은 명령을 사용한다:

$ ssleay req -noout -modulus -in server.csr | ssleay md5

Why does my 2048-bit private key not work? [L]

SSL 브라우져들과의 호환성을 위하여 기본 길이로 512 bit 1024 bit 사용한다. 1024 bit 이상의 길이는 일부 버전의 Netscape Navigator MSIE, 그리고 RSA사의 BSAFE 암호화 ToolKit 사용하는 일부 브라우져들과 호환되지 않기 때문에 1024 bit 길이를 가지는 키를 사용하는 것이 권장된다.

Why is client authentication broken after upgrading from SSLeay version 0.8 to 0.9? [L]

SSLCACertificatePath directive 지정한 경로에서 CA 증명서를 찾을 SSLeay hash symlink 통해서 증명서를 찾게 되며, hash 값은 ssleay x509 ?noout ?hash 명령으로 생성된다. 그런데 SSLeay 0.8에서 0.9 오면서 증명서에 대한 hash 계산하는데 사용되는 알고리즘이 변경되었다. 따라서 SSLeay 업그레이드한 먼저 모든 예전 hash symlink 삭제하고 새로운 hash symlink 생성해야 한다.

 

About SSL Protocol

Why has my webserver a higher load now that I run SSL there? [L]

SSL 강력한 암호화를 사용하며, 또한 HTTPS 통하여 어떤 페이지를 요청하는 경우 심지어 페이지 내의 이미지들까지 암호화된 채로 전송되기 때문에 HTTPS 전송량이 많은 경우 일반적인 Apache 서버에 비해 많은 서버 로드가 증가한다.

What SSL Ciphers are supported by mod_ssl? [L]

설치된 SSLeay 지원하는 거의 대부분의 SSL cipher 지원하며, 특히 최소한 다음과 같은 cipher들을 지원한다:

RC4 with MD5

RC4 with MD5 (export version restricted to 40-bit key)

RC2 with MD5

RC2 with MD5 (export version restricted to 40-bit key)

IDEA with MD5

DES with MD5

Triple-DES with MD5

다음의 명령으로 실제로 지원하는 cipher들의 목록을 있다:

$ ssleay ciphers -v

Why can't I use SSL with name-based/non-IP-based virtual hosts? [L]

문제는 닭과 달걀의 문제와 같다. SSL 프로토콜 레이어는 HTTP 프로토콜 레이어의 아래에 위치하여 HTTP encapsulate한다. SSL 연결(HTTPS) 이루어질 Apache/mod_ssl 클라이언트와 SSL 프로토콜 파라미터들을 협상해야 하며, 이를 위해 mod_ssl 가상서버(virtual server) 설정(예를 들어 cipher suite server certificate ) 참조해야 한다. 그러나 올바른 virtual server 찾기 위해 Apache Host HTTP heaer field 알아야 하며, 이를 위해 HTTP request header 읽혀져야 한다. 과정은 SSL handshake 끝나기 전에는 수행되지 않는데 과정이 수행되어야 얻어지는 정보를 이미 SSL handshake 단계가 요구하였기 때문에 이러한 문제가 발생하게 된다.

When I use Basic Authentication over HTTPS the lock icon in Netscape browsers still show the unlocked state when the dialog pops up. Does this mean the username/password is still transmitted unencrypted? [L]

아니다, username passwd 이미 암호화되어 전송되어진 것이다. Netscape 브라우져의 자물쇠 아이콘은 SSL/TLS 레이어와 정확히 동기화되지 않으며, 해당 페이지의 첫번째 데이터가 전송되는 시점에서야 잠김 표시로 전환되는 것이다. Basic Authentication HTTP 레이어의 기능이며 HTTP 레이어는 SSL/TLS 레이어 위에 위치한다. 따라서 HTTPS 프로토콜에서 어떠한 HTTP 데이터의 통신이 이루어지기 위해서는 반드시 이전에 SSL/TLS 레이어가 handshake 단계를 수행하고 암호화된 통신으로 전환되어야만 한다. 따라서 인증 단계에서 자물쇠 아이콘이 잠김 상태가 아니더라도 username passwd 이미 암호화된 상태로 전송되게 된다.

Posted by Golmong
:


Chapter 4 Compatibility

장에서는 다른 SSL 솔류션들과의 backward compatibility 대하여 기술한다. Mod_ssl만이 Apache에서 SSL 구현한 유일한 솔류션은 아니며, 실질적으로 4개의 솔류션이 존재한다: Ben Laurie 구현한 freeware Apache-SSL(mod_ssl 기반이 ), RedHat 상용 서버인 Secure Web Server(mod_ssl 기반을 ), Covalent 상용 소프트웨어인 Raven SSL Module(Apache-SSL 기반을 ), 마지막으로 C2Net 상용 제품인 Stronghold(Sioux라는 다른 개발 branch 기반을 ) 있다.

mod_ssl 다른 4가지 솔류션의 기능을 대부분 지원할 있으며, 대부분의 경우에 있어서 쉽게 backward compatibility 제공할 있다. 실질적으로 주안점을 두고 있는 compatibility 영역은 다음의 세가지이다:

configuration directive, environment variable, custom log function.

Configuration Directives

다른 SSL 솔류션의 configuration directive들에 대한 backward compatibility 위하여 mod_ssl on-the-fly mapping 사용한다: directives which have a direct counterpart in mod_ssl are mapped silently while other directives lead to a warning message in the logfiles. 현재 구현되어 있는 directive mapping Table 1 있다. 현재 완전한 backward compatibility 단지 Apache-SSL 1.x mod_ssl 2.0.x 간에만 이루어져 있으며, Sioux 1.x Stronghold 2.x mod_ssl 아직 제공하지 않는 몇가지 기능상의 차이로 인하여 부분적으로만 mapping 가능하다.

Old Directive

mod_ssl Directive

Comment

Apache-SSL 1.x & mod_ssl 2.0.x compatibility:

SSLEnable

SSLEngine on

compactified

SSLDisable

SSLEngine off

compactified

SSLLogFile file

SSLLog file

compactified

SSLRequiredCiphers spec

SSLCipherSuite spec

renamed

SSLRequireCipher c1 ...

SSLRequire %{SSL_CIPHER} in

{"c1", ...}

generalized

SSLBanCipher c1 ...

SSLRequire not (%{SSL_CIPHER} in {"c1", ...})

generalized

SSLFakeBasicAuth

SSLOptions +FakeBasicAuth

merged

SSLCacheServerPath dir

-

functionality removed

SSLCacheServerPort integer

-

functionality removed

Apache-SSL 1.x compatibility:

SSLExportClientCertificates

SSLOptions +ExportCertData

Merged

SSLCacheServerRunDir dir

-

Functionality not supported

Sioux 1.x compatibility:

SSL_CertFile file

SSLCertificateFile file

renamed

SSL_KeyFile file

SSLCertificateKeyFile file

renamed

SSL_CipherSuite arg

SSLCipherList arg

renamed

SSL_X509VerifyDir arg

SSLCACertificatePath arg

renamed

SSL_Log file

SSLLogFile file

renamed

SSL_Connect flag

SSLEngine flag

renamed

SSL_ClientAuth arg

SSLVerifyClient arg

renamed

SSL_X509VerifyDepth arg

SSLVerifyDepth arg

renamed

SSL_FetchKeyPhraseFrom arg

-

not directly mappable;

use SSLPassPhraseDialog

SSL_SessionDir dir

-

not directly mappable;

use SSLSessionCache

SSL_Require expr

-

not directly mappable;

use SSLRequire

SSL_CertFileType arg

-

functionality not supported

SSL_KeyFileType arg

-

functionality not supported

SSL_X509VerifyPolicy arg

functionality not supported

SSL_LogX509Attributes arg

functionality not supported

Stronghold 2.x compatibility:

SSLFlag flag

SSLEngine flag

renamed

SSLSessionLockFile file

SSLMutex file

renamed

SSLCipherList spec

SSLCipherSuite spec

renamed

RequireSSL

SSLRequireSSL

renamed

SSLErrorFile file

-

functionality not supported

SSLProtocol spec

-

functionality not supported

SSLRoot dir

-

functionality not supported

SSL_CertificateLogDir dir

-

functionality not supported

AuthCertDir dir

-

functionality not supported

SSL_Group name

-

functionality not supported

SSLProxyMachineCertPath dir

-

Functionality not supported

SSLProxyMachineCertFile file

-

Functionality not supported

SSLProxyCACertificatePath dir

-

Functionality not supported

SSLProxyCACertificateFile file

-

functionality not supported

SSLProxyVerifyDepth number

-

functionality not supported

SSLProxyCipherList spec

-

functionality not supported

[ Table 1 : Configuration Directive Mapping ]
 

Environment Variables

서버를 설정할 “SSLOptions +CompatEnvVars” directive 설정하게 되면 부가적인 mod_ssl 환경 변수들이 생성된다. 현재 구현되어 있는 환경 변수들은 Table 2 같다.

Old Variable

mod_ssl Variable

Comment

SSL_PROTOCOL_VERSION

SSL_PROTOCOL

renamed

SSLEAY_VERSION

SSL_VERSION_LIBRARY

renamed

HTTPS_SECRETKEYSIZE

SSL_CIPHER_USEKEYSIZE

renamed

HTTPS_KEYSIZE

SSL_CIPHER_ALGKEYSIZE

renamed

HTTPS_CIPHER

SSL_CIPHER

renamed

HTTPS_EXPORT

SSL_CIPHER_EXPORT

renamed

SSL_SERVER_KEY_SIZE

SSL_CIPHER_ALGKEYSIZE

renamed

SSL_SERVER_CERTIFICATE

SSL_SERVER_CERT

renamed

SSL_SERVER_CERT_START

SSL_SERVER_V_START

renamed

SSL_SERVER_CERT_END

SSL_SERVER_V_END

renamed

SSL_SERVER_CN

SSL_SERVER_S_DN_CN

renamed

SSL_SERVER_EMAIL

SSL_SERVER_S_DN_Email

renamed

SSL_SERVER_O

SSL_SERVER_S_DN_O

renamed

SSL_SERVER_OU

SSL_SERVER_S_DN_OU

renamed

SSL_SERVER_C

SSL_SERVER_S_DN_C

renamed

SSL_SERVER_SP

SSL_SERVER_S_DN_SP

renamed

SSL_SERVER_L

SSL_SERVER_S_DN_L

renamed

SSL_SERVER_ICN

SSL_SERVER_I_DN_CN

renamed

SSL_SERVER_IEMAIL

SSL_SERVER_I_DN_Email

renamed

SSL_SERVER_IO

SSL_SERVER_I_DN_O

renamed

SSL_SERVER_IOU

SSL_SERVER_I_DN_OU

renamed

SSL_SERVER_IC

SSL_SERVER_I_DN_C

renamed

SSL_SERVER_ISP

SSL_SERVER_I_DN_SP

renamed

SSL_SERVER_IL

SSL_SERVER_I_DN_L

renamed

SSL_CLIENT_CERTIFICATE

SSL_CLIENT_CERT

renamed

SSL_CLIENT_CERT_START

SSL_CLIENT_V_START

renamed

SSL_CLIENT_CERT_END

SSL_CLIENT_V_END

renamed

SSL_CLIENT_CN

SSL_CLIENT_S_DN_CN

renamed

SSL_CLIENT_EMAIL

SSL_CLIENT_S_DN_Email

renamed

SSL_CLIENT_O

SSL_CLIENT_S_DN_O

renamed

SSL_CLIENT_OU

SSL_CLIENT_S_DN_OU

renamed

SSL_CLIENT_C

SSL_CLIENT_S_DN_C

renamed

SSL_CLIENT_SP

SSL_CLIENT_S_DN_SP

renamed

SSL_CLIENT_L

SSL_CLIENT_S_DN_L

renamed

SSL_CLIENT_ICN

SSL_CLIENT_I_DN_CN

renamed

SSL_CLIENT_IEMAIL

SSL_CLIENT_I_DN_Email

renamed

SSL_CLIENT_IO

SSL_CLIENT_I_DN_O

renamed

SSL_CLIENT_IOU

SSL_CLIENT_I_DN_OU

renamed

SSL_CLIENT_IC

SSL_CLIENT_I_DN_C

renamed

SSL_CLIENT_ISP

SSL_CLIENT_I_DN_SP

renamed

SSL_CLIENT_IL

SSL_CLIENT_I_DN_L

renamed

SSL_SERVER_KEY_EXP

-

Not supported by mod_ssl

SSL_SERVER_KEY_ALGORITHM

-

Not supported by mod_ssl

SSL_SERVER_SIGNATURE_ALGORITHM

-

Not supported by mod_ssl

SSL_SERVER_SESSIONDIR

-

Not supported by mod_ssl

SSL_SERVER_CERTIFICATELOGDIR

-

Not supported by mod_ssl

SSL_SERVER_CERTFILE

-

Not supported by mod_ssl

SSL_SERVER_KEYFILE

-

Not supported by mod_ssl

SSL_SERVER_KEYFILETYPE

-

Not supported by mod_ssl

SSL_CLIENT_KEY_EXP

-

Not supported by mod_ssl

SSL_CLIENT_KEY_ALGORITHM

-

Not supported by mod_ssl

SSL_CLIENT_KEY_SIZE

-

Not supported by mod_ssl

SSL_CLIENT_SIGNATURE_ALGORITHM

-

Not supported by mod_ssl

[ Table 2 : Environment Variable Derivation ]

Custom Log Functions

Mod_ssl Apache 적용되어지거나 혹은 DSO 이용하여 모듈이 loading되면 Custom Log Format 위한 부가적인 함수들이 존재한다. “%{varname}x” eXtension format function 어떤 모듈이 제공하는 변수를 확장(expend)하는데 사용되며, 부가적인 Cryptography “%{name}c” cryptography format function Backward compatibility 위해 제공되며, 현재 구현된 함수 호출(function call) Table 3 같다.

Function Call

Description

%...{version}c

SSL protocol version

%...{cipher}c

SSL cipher

%...{subjectdn}c

Client Certificate Subject Distinguished Name

%...{issuerdn}c

Client Certificate Issuer Distinguished Name

%...{errcode}c

Certificate Verification Error (numerical)

%...{errstr}c

Certificate Verification Error (string)

[ Table 3 : Custom Log Cryptography Function ]

Posted by Golmong
:


Chapter. 3 Reference

장에서는 mod_ssl에서 사용되는 모든 설정 지시자(configuration directive) 함께 mod_ssl 제공하는 user visible feature들에 대하여 설명하며, 이를 통해 mod_ssl 어떤 특정한 기능이 실제로 어떻게 설정되는가 혹은 활성화되는가를 설명한다. directive Apache 문서에서 표준 Apache directive 설명하는 방식과 유사한 방식으로 기술되어지는데, 여기에는 directive syntax, default, context 등의 요소들이 기술된다.

Mod_ssl에서 사용하는 directive 크게 세가지 분류(class) 나눠진다. 먼저 Global Directive(context server config directive) server config 파일에서 <VirtualHost> 같은 sectioning command 밖에서만 사용될 있다. 번째는 Per-Server Directive(context server config, virtualhost directive)로서 server config 파일에서 <VirtualHost> 섹션의 밖이나 안에서 모두 사용될 있으며, <VirtualHost> 섹션의 밖에서 사용될 때는 메인(Default) 서버에 대한 설정이 된다. 번째는 Per-Directory Directive(context server config, virtual host, directory, .htaccess directive)로서 server config 파일과 per-directory .htaccess 파일의 어느 곳에서든 사용될 있다. 세가지 class들은 서로의 부분 집합이 되는데, per-directory directive per-server global context에서 사용될 있으며, 또한 per-server class directive global context에서 사용될 수도 있다.

다른 Apache SSL 숄류션들에 대한 backward compatibility 위해 mod_ssl 제공하는 부가적인 directive들과 환경 변수들은 Compatibility Chapter 기술되어져 있다.

 

Configuration Directives

SSLPassPhraseDialog

Name

SSLPassPhraseDialog

Description

Type of pass phrase dialog for encrypted private keys

Syntax

SSLPassPhraseDialog type

Default

SSLPassPhraseDialog builtin

Context

server config

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.1

Apache 시동될 SSL 적용된 virtual host 대한 Certificate Private Key 읽어온다. 보안을 위해서 Private Key들은 암호화되어 있으며, 따라서 mod_ssld 관리자에게 암호화된 Private Key 복호화하기 위해서 Pass Phrase 요구한다. Pass Phare 요구하는 방식은 다음의 두가지 방식이 있다.

  • Builtin

Apache 구동할 관리자가 직접 암호화된 Private Key 대한 Pass Phrase 입력할 있는 interactive terminal dialog 보여주며, default 설정이다. SSL 적용할 virtual host 하나 이상 지정될 있기 때문에 dialog 수를 줄이기 위해서 다음과 같은 reuse-scheme 사용된다: 어떤 Private Key 복호화할 때까지 입력되었던 모든 Pass Phrase 시도해서 맞는 Pass Phrase 있으면 Private Key 대한 dialog 실행하지 않으며, 그렇지 않은 경우에만 새로운 Pass Phrase 요구하는 dialog 실행하고 입력받은 Pass Phrase 이후의 Private Key 위해서 기억되게 된다. N개의 암호화된 Private Key 파일에 대하여 N개의 서로 다른 Pass Phrase 사용할 경우 모든 N개의 Pass Phrase 입력하게 되며, 반면에 모든 N개의 Private Key 파일에 대하여 동일한 Pass Phrase 사용하였다면 단지 한번의 Pass Phrase 입력 dialog만이 실행되게 된다.

  • exec:/path/to/program

Apache 시동 시에 호출할 암호화된 Private Key 대한 external program 설정한다. 외부 프로그램은 servername:portnumber 인수로 입력받아서 해당되는 Pass Phrase stdout으로 출력하며, 시스템이 attacker 의하여 침해(compromise)되지 않았음을 확인하기 위해 먼저 security check 실행하게 되며, check 성공했을 때만 Pass Phrase 제공하게 된다.

Security check 하는 방식이나 Pass Phrase 결정하는 방식은 mod_ssl 결정하는 것이 아니며, mod_ssl 단지 interface(Pass Phrase stdout으로 제공하는 실행가능한 프로그램)만을 정의한다.

방식에서도 Reuse 알고리즘이 사용되며, 따라서 동일한 Pass Phrase 대해서는 external program 한번만 호출된다.

Example:

SSLPassPhraseDialog exec:/usr/local/apache/sbin/pp-filter

 

SSLMutex

Name

SSLMutex

Description

Semaphore for internal mutual exclusion of operations

Syntax

SSLMutex type

Default

SSLMutex none

Context

Server config

Override

Not applicable

Status

Extension

Module

Mod_ssl

Compatibility

Mod_ssl 2.1

directive fork되어진 Apache 서버 프로세스 간의 동기화되어 실행되어야 오퍼레이션들의 상호배제(mutual exclusion) 사용되는 SSL 엔진 세마포어(semaphore) 설정한다. 단지 하나의 global mutex만이 유효하기 때문에 directive global server context에서만 사용할 있다.

가능한 Mutext type 다음과 같다:

  • none

Mutext 사용하지 않으며, 기본 설정(default)이다. 그러나 현재 Mutex SSL Session Cache 대한 write access 동기화(Synchronizing)하는데 주로 사용되기 때문에 Session Cache 변경이 드물게 일어나는 경우에만 설정을 사용한다. 따라서 directive default 설정하는 것은 바람직하지 않으며, real Mutex 설정하는 것이 좋다.

  • file:/path/to/mutex

설정은 portable and always provided Mutex variant 지정하며, 물리적인 파일이 Mutext 사용된다. /path/to/mutex 로컬 디스크 파일시스템을 사용해야 하며, NFS AFS 파일시스템에 위치하는 파일을 사용해서는 않된다.

Notice: 내부적으로, Apache 부모 프로세스(parent process) Process ID(PID) PID 유일하게 만들기 위해 자동으로 /path/to/mutext 덧붙여(appended)짐으로써 PID 충돌을 막아준다.

  • sem

설정은 가장 훌륭한(elegant) 방법이지만 가장 non-portable Mutex variant이며, SysV IPC Semaphore (under Unix) Windows Mutex (under Win32) 사용된다. 경우 해당 platform(OS) 설정을 지원하여야만 한다.

Example:

SSLMutex file:/usr/local/apache/logs/ssl_mutex

SSLRandomSeed

Name

SSLRandomSeed

Description

Pseudo Random Number Generator (PRNG) seeding source

Syntax

SSLRandomSeed context source [bytes]

Default

None

Context

Server config

Override

Not applicable

Status

Extension

Module

Mod_ssl

Compatibility

Mod_ssl 2.2

directive 시동할 (context startup 경우) 혹은 새로운 SSL 연결(connection) 이루어질 (context connect 경우) SSLeay Pseudo Random Number Generator (PRNG) seeding 위한 하나 혹은 이상의 seed source 설정한다. PRNG global facility이므로 directive global server context에서만 사용될 있다.

가능한 source variant 다음과 같다:

  • builtin

언제든지 사용 가능한 builtin seeding source로서 경우 실행 (runtime) 최소한의 CPU cycle 소비하며, 아무런 결점(drawback)없이 사용될 있다. PRNG seeding 위해 사용될 있는 source로는 현재 시간, 현재의 process ID, Apache inter-process scoreboard struture로부터 임의로 선택된 1KB extract 등이 있다. 방법의 단점은 실질적으로 그다지 강력하지 못한 소스이며, 시동시(scoreboard 아직 사용가능하지 않은)에는 소스의 유동성(entropy) 바이트 밖에 되지 않는다는 것이다. 따라서 항상(최소한 startup 시에는) 부가적인 seeding source 지정하는 것이 좋다.

  • file:/path/to/source

PRNG seeding 위해 /path/to/source 지정한 외부 파일을 사용한다. Bytes 명시된 경우에는 지정된 byte 수만큼의 파일의 첫번째부터의 바이트가 entropy 생성하는데 사용되며, Bytes 명시되지 않은 경우에는 파일 전체가 entropy 형성한다. 설정은 특히 startup time seeding 사용되며, /dev/random 이나 /dev/urandom device 사용한다(FreeBSD 계열이나 Linux 같은 최근의 대부분의 Unix 시스템에 device들이 들어있다).

  • exec:/path/to/program

PRNG seeding 위한 소스로서 /path/to/program 지정된 실행가능한 외부 프로그램을 사용한다. Bytes 명시하는 경우에는 프로그램의 stdout contents에서 bytes 지정한 수만큼의 byte entropy 형성하는데 사용하며, bytes 명시되지 않은 경우에는 프로그램의 stdout으로 생성된 전체 데이터가 entropy 이루게 된다. 설정은 단지 startup time에만 사용하며, 매우 강력한 seeding 필요로 하는 경우에 사용된다. 설정을 connection context 사용하는 것은 서버의 속도를 매우 저하시키기 때문에 보통 connection context 외부 프로그램을 사용하는 것은 피해야 한다.

Example:

SSLRandomSeed startup builtin

SSLRandomSeed startup file:/dev/random

SSLRandomSeed startup file:/dev/urandom 1024

SSLRandomSeed startup exec:/usr/local/bin/truerand 16

SSLRandomSeed connect builtin

SSLRandomSeed connect file:/dev/random

SSLRandomSeed connect file:/dev/urandom 1024

 

SSLSessionCache

Name

SSLSessionCache

Description

Type of the global/inter-process SSL Session Cache

Syntax

SSLSessionCache type

Default

SSLSessionCache none

Context

server config

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.1

directive global/inter-process SSL Session Cache storage type 지정하며, cache 병렬적인 요청 프로세스(parallel request processing) 속도를 개선해주는 역할을 한다. 동일한 서버 프로세스(HTTP keep-alive 통한) 대한 요청에 대해서 SSLeay SSL session information 로컬에 저장을 한다. 그러나 modern client 이미지나 다른 데이터들을 parallel request 통하여 요청하기 때문에(보통 4개까지의 parallel request), 이러한 요청들은 서로 다른 pre-forked process 의해 처리된다. Inter-process cache 필요없는 session handshake 피할 있게 해준다.

다음과 같은 2가지의 storage type 지원된다:

  • none

Global/inter-process Session Cache 사용하지 않으며, 기본 설정(default)이다. 기능 상의 문제는 없으나, 현저한 속도 저하가 생긴다.

  • dbm:/path/to/datafile

서버 프로세스들에 대한 local SSLeay memory cache 동기화(synchronizing)하기 위해 로컬 디스크에 있는 DBM hashfile 사용한다. 클라이언트의 요청에 대한 현저한 속도 향상이 생기며, 따라서 설정을 사용하는 것이 권장된다.

Example:

SSLSessionCache dbm:/usr/local/apache/logs/ssl_gcache_data

 

SSLSessionCacheTimeout

Name

SSLSessionCacheTimeout

Description

Number of seconds before an SSL session expires in the Session Cache

Syntax

SSLSessionCacheTimeout seconds

Default

SSLSessionCacheTimeout 300

Context

server config, virtual host

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

directive global/inter-process SSL Session Cache SSLeay internal memory cache 저장된 정보들에 대한 timeout 초단위로 지정한다. 설정 값은 최저 15초이며 실제로 실행될 서버에서는 보통 300 이상을 지정한다.

Example:

SSLSessionCacheTimeout 600

 

SSLEngine

Name

SSLEngine

Description

SSL Engine Operation Switch

Syntax

SSLEngine on|off

Default

SSLEngine off

Context

Server config, virtual host

Override

Not applicable

Status

Extension

Module

Mod_ssl

Compatibility

Mod_ssl 2.1

directive SSL/TLS 프로토콜 엔진의 사용여부를 지정하며, 보통 <VirtualHost> 섹션 안에 사용되어 해당 virutal host SSL/TLS 사용할 것인가를 지정한다. 기본 설정은 주서버와 모든 virtual host 대하여 SSL/TLS 프로토콜을 사용하지 않는 것이다.

Example:

<VirtualHost _default_:443>

SSLEngine on

...

</VirtualHost>

 

SSLCipherSuite

Name

SSLCipherSuite

Description

Cipher Suite available for negotiation in SSL handshake

Syntax

SSLCipherSuite cipher-spec

Default

SSLCipherSuite

ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

Context

server config, virtual host, directory, .htaccess

Override

AuthConfig

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.1

directive SSL handshake phrase 단계에서 클라이언트와 협상(negotiation) 있는 Cipher Suite 설정하며, 이를 위해 콜론(: )으로 구분되는 SSLeay cipher specification들로 이루어진 스트링을 directive 값으로 지정한다. directive per-server per-directory context 모두에서 사용될 있다. Per-server context 경우 directive connection 이루어질 표준 SSL handshake 적용되며, per-directory context 경우에는 HTTP request read 되었지만 HTTP response 보내지기 전에 재설정된 Cipher Suite 가지고 SSL renegotiation하게 된다.

Cipher-spec 지정되는 SSL cipher specification 4개의 주속성(major attribute) 가지의 부가적인 작은 속성(extra minor ones)들로 이루어진다:

  • Key Exchange Algorithm : RSA or Diffie-Hellman variants.

  • Authentication Algorithm : RSA, Diffie-Hellman, DSS or none.

  • Cipher/Encryption Algorithm : DES, Triple-DES, RC4, RC2, IDEA or none.

  • MAC Digest Algorithm : MD5, SHA or SHA1.

SSL cipher 또한 export cipher 되거나 혹은 SSLv2 SSLv3/TLSv1 cipher(여기서 TLSv1 SSLv3 동일하다) 중에 하나가 있다. 사용할 cipher 명시하는 방법으로는 모든 cipher 사용하거나, 한번에 한가지 cipher 사용하거나, 혹은 alias 지정하여 cipher 선호도와 사용 순서를 지정할 있다(Table 1 참조).

 

Tag

Description

Key Exchange Algorithm:

KRSA

RSA key exchange

KDHr

Diffie-Hellman key exchange with RSA key

KDHd

Diffie-Hellman key exchange with DSA key

KEDH

Ephemeral (temp.key) Diffie-Hellman key exchange (no cert)

Authentication Algorithm:

ANULL

No authentication

ARSA

RSA authentication

ADSS

DSS authentication

ADH

Diffie-Hellman authentication

Cipher Encoding Algorithm:

ENULL

No encoding

DES

DES encoding

3DES

Triple-DES encoding

RC4

RC4 encoding

RC2

RC2 encoding

IDEA

IDEA encoding

MAC Digest Algorithm:

MD5

MD5 hash function

SHA1

SHA1 hash function

SHA

SHA hash function

Aliases:

SSLv2

all SSL version 2.0 ciphers

SSLv3

all SSL version 3.0 ciphers

EXP

all export ciphers

LOW

all low strength ciphers (no export, single DES)

MEDIUM

all ciphers with 128 bit encryption

HIGH

all ciphers using Triple-DES

RSA

all ciphers using RSA key exchange

DH

all ciphers using Diffie-Hellman key exchange

EDH

all ciphers using Ephemeral Diffie-Hellman key exchange

ADH

all ciphers using Anonymous Diffie-Hellman key exchange

DSS

all ciphers using DSS authentication

NULL

all ciphers using no encryption

Table 1: SSLeay Cipher Specification Tags

사용하고자 하는 cipher 순서를 지정하기 위해서 여러 개의 tag들을 함께 지정할 있으며, 이를 위해 어떤 특정한 cipher들의 그룹을 의미하는 alias(SSLv2, SSLv3, EXP, LOW, MEDIUM, HIGH)들을 사용할 있다. tag들을 가지 접두사(prefix) 연결하여 cipher-spec 이룰 수도 있으며, 가능한 접두사(prefix) 다음과 같다:

  • none: 리스트에 cipher 포함시킨다

  • + : cipher 리스트에 포함시키며 또한 리스트의 현재 위치로 가져다 놓는다

  • - : 리스트로부터 cipher 제거한다(이후에 다시 포함시킬 있다)

  • ! : 리스트로부터 cipher 완전히 제거한다(이후에 다시 포함시킬 없다)

ssleay ciphers ?v 명령어로 모든 cipher-spec string 있다. 기본(default) cipher-spec string ALL:!ADH:RC4+RSA:+HIGN:+MEDIUM:+LOW:+SSLv2:+EXP이며 의미는 다음과 같다.

  1. Authenticate하지 않는 모든 cipher들을 고려(consideration)에서 제거한다. SSL 경우 단지 Anonymous Diffie-Hellman cipher만이 제거된다

  2. RC4 RSA 사용하는 cipher 포함시킨다.

  3. High security cipher, medium security cipher, 그리고 low security cipher 각각 포함시킨다.

  4. 마지막으로 모든 SSLv2 cipher export cipher들을 리스트의 마지막에 포함시키다.

$ ssleay ciphers -v 'ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP'

NULL-SHA SSLv3 Kx=RSA Au=RSA Enc=None Mac=SHA1

NULL-MD5 SSLv3 Kx=RSA Au=RSA Enc=None Mac=MD5

EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1

... ... ... ... ...

EXP-RC4-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export

EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export

EXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export

Table 2 SSL에서 사용되는 RSA DH cipher 대한 전체 리스트이다.

Example:

SSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW

Cipher-Tag

Protocol

Key Ex.

Auth.

Enc.

MAC

Type

RSA Ciphers:

DES-CBC3-SHA

SSLv3

RSA

RSA

3DES(168)

SHA1

DES-CBC3-MD5

SSLv2

RSA

RSA

3DES(168)

MD5

IDEA-CBC-SHA

SSLv3

RSA

RSA

IDEA(128)

SHA1

RC4-SHA

SSLv3

RSA

RSA

RC4(128)

SHA1

RC4-MD5

SSLv3

RSA

RSA

RC4(128)

MD5

IDEA-CBC-MD5

SSLv2

RSA

RSA

IDEA(128)

MD5

RC2-CBC-MD5

SSLv2

RSA

RSA

RC2(128)

MD5

RC4-MD5

SSLv2

RSA

RSA

RC4(128)

MD5

DES-CBC-SHA

SSLv3

RSA

RSA

DES(56)

SHA1

RC4-64-MD5

SSLv2

RSA

RSA

RC4(64)

MD5

DES-CBC-MD5

SSLv2

RSA

RSA

DES(56)

MD5

EXP-DES-CBC-SHA

SSLv3

RSA(512)

RSA

DES(40)

SHA1

export

EXP-RC2-CBC-MD5

SSLv3

RSA(512)

RSA

RC2(40)

MD5

export

EXP-RC4-MD5

SSLv3

RSA(512)

RSA

RC4(40)

MD5

export

EXP-RC2-CBC-MD5

SSLv2

RSA(512)

RSA

RC2(40)

MD5

export

EXP-RC4-MD5

SSLv2

RSA(512)

RSA

RC4(40)

MD5

export

NULL-SHA

SSLv3

RSA

RSA

None

SHA1

NULL-MD5

SSLv3

RSA

RSA

None

MD5

Diffie-Hellman Ciphers:

ADH-DES-CBC3-SHA

SSLv3

DH

None

3DES(168)

SHA1

ADH-DES-CBC-SHA

SSLv3

DH

None

DES(56)

SHA1

ADH-RC4-MD5

SSLv3

DH

None

RC4(128)

MD5

EDH-RSA-DES-CBC3-SHA

SSLv3

DH

RSA

3DES(168)

SHA1

EDH-DSS-DES-CBC3-SHA

SSLv3

DH

DSS

3DES(168)

SHA1

EDH-RSA-DES-CBC-SHA

SSLv3

DH

RSA

DES(56)

SHA1

EDH-DSS-DES-CBC-SHA

SSLv3

DH

DSS

DES(56)

SHA1

EXP-EDH-RSA-DES-CBC-SHA

SSLv3

DH(512)

RSA

DES(40)

SHA1

Export

EXP-EDH-DSS-DES-CBC-SHA

SSLv3

DH(512)

DSS

DES(40)

SHA1

Export

EXP-ADH-DES-CBC-SHA

SSLv3

DH(512)

None

DES(40)

SHA1

Export

EXP-ADH-RC4-MD5

SSLv3

DH(512)

None

RC4(40)

MD5

export

Table 2: Particular SSL Ciphers

 

SSLCertificateFile

Name

SSLCertificateFile

Description

Server PEM-encoded X.509 Certificate file

Syntax

SSLCertificateFile filename

Default

None

Context

server config, virtual host

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

서버에 대한 PEM-encoding되어진 증명서(Certificate) 파일을 지정하며, 부가적으로(optionally) 증명서에 대응하는 RSA 개인키를 지정한다(같은 파일에 개인키가 포함되어 있는 경우). 만약 증명서에 포함되어 있는 개인키가 암호화되어져 있는 경우 startup 시에 Pass Phrase 입력받는 dialog 실행된다.

Example:

SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt

 

SSLCertificateKeyFile

Name

SSLCertificateKeyFile

Description

Server PEM-encoded RSA Private Key file

Syntax

SSLCertificateKeyFile filename

Default

None

Context

server config, virtual host

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

서버에 대한 PEM-encoding되어진 개인키를 지정한다. 개인키가 SSLCertificateFile directive에서 지정한 증명서에 포함되어져 있지 않은 경우 따로 개인키를 저장하고 있는 파일을 지정하기 위해 부가적인 directive 사용하게 된다. 만약 SSLCertificateFile directive 사용되고 증명서 파일에 개인키도 포함되어 있는 경우에는 directive 사용할 필요가 없다. 그러나 증명서에 개인키를 포함하는 것은 실질적인 면에서 권장되지 않으며, 증명서와 개인키를 따로 분리해서 저장하는 것이 좋다. 만약 지정된 개인키가 암호화되어져 있다면 startup 시에 역시 Pass Phrase 물어보는 dialog 실행되게 된다.

Example:

SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key

 

SSLCACertificatePath

Name

SSLCACertificatePath

Description

Directory of PEM-encoded CA Certificates for Client Auth.

Syntax

SSLCACertificatePath directory

Default

None

Context

server config, virtual host

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

Certificate Authority(CA) 증명서가 위치한 디렉토리를 지정하며, CA 증명서는 Client Authentication 클라이언트의 증명서를 확인(verify)하기 위해 사용된다.

디렉토리에 있는 파일들은 PEM-encoding되어져야 하며, hash filename 통하여 접근되어진다. 따라서 증명서 파일을 위치에 두어야 하는 것은 아니다. 경우 hash-value.N이라는 이름을 가지는 심볼릭 링크를 생성해야 하며, 항상 디렉토리가 적절한 심볼릭 링크를 가지고 있는가를 확인해야 한다. 이를 위해서는 mod_ssl 포함되어 있는 Makefile 사용한다.

Example:

SSLCACertificatePath /usr/local/apache/conf/ssl.crt/

 

SSLCACertificateFile

Name

SSLCACertificateFile

Description

File of concatenated PEM-encoded CA Certificates for Client Auth.

Syntax

SSLCACertificateFile filename

Default

None

Context

server config, virtual host

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

directive 설정하고자 하는 모든 CA들의 증명서들을 모아둘 있는 all-in-one 파일을 지정하며, 증명서들은 Client Authentication 사용된다. 실제로 파일은 PEM-encoding되어 있는 여러 개의 증명서 파일들을 선호도(preference) 따라 연달아 덧붙여둔 것이다.

Example:

SSLCACertificateFile /usr/local/apache/conf/ssl.crt/ca-bundle-client.crt

 

SSLVerifyClient

Name

SSLVerifyClient

Description

Type of Client Certificate verification

Syntax

SSLVerifyClient level

Default

SSLVerifyClient none

Context

server config, virtual host, directory, .htaccess

Override

AuthConfig

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

Client Authentication 과정에서 수행할 증명서확인수준(Certificate Verification Level) 지정한다. directive per-server per-directory context 모두에서 사용되어질 있다. per-server context 사용되는 경우 connection 이루어질 표준 SSL handshake에서 사용되는 client authentication 적용되며, per-directory context에서 사용되는 경우 HTTP request read되어졌지만 HTTP response 보내지기 전에 재설정된(reconfigured) client verification level 가지고 재협상(renegotiation)하게 된다.

지정할 있는 level 다음과 같다:

  • none : no client Certificate is required at all

  • optional : the client may present a valid Certificate

  • require : the client has to present a valid Certificate

  • optional_no_ca : the client may present a valid Certificate but has not to be (successfully) verifyable.

4가지 level 모두가 모든 브라우져에서 동작하지는 않으며, optional_no_ca level 경우 실질적으로 인증의 개념과는 맞지 않기 때문에(SSL 테스트를 위한 목적으로나 사용될 있다) 실제로는 none require level만이 의미가 있다.

Example:

SSLVerifyClient require

 

SSLVerifyDepth

Name

SSLVerifyDepth

Description

Maximum depth of CA Certificates in Client Certificate verification

Syntax

SSLVerifyDepth number

Default

SSLVerifyDepth 1

Context

server config, virtual host, directory, .htaccess

Override

AuthConfig

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

directive 클라이언트가 유효한 증명서를 가지고 있지 않다고 결정하기 전에 얼마나 깊게 클라이언트를 verify 것인가를 지정한다. directive per-server per-directory context 모두에서 사용되어질 있다. per-server context 사용되는 경우 connection 이루어질 표준 SSL handshake에서 사용되는 client authentication 프로세스에 적용되며, per-directory context에서 사용되는 경우 HTTP request read되어졌지만 HTTP response 보내지기 전에 재설정된(reconfigured) client verification level 가지고 SSL 재협상(renegotiation) 하게 된다.

실질적으로 Depth 증명서에 서명한 바로 상위의 발행자(intermediate certificate issuer) 최대 개수, 클라이언트의 증명서에 서명한 CA 상위 CA들을 찾아갈 최대한 개의 CA 찾아갈 것인가를 의미한다. Depth 0으로 설정하는 것은 self-signed client certificate만을 허용한다는 의미이며, default depth 1 self-signed client certificate이거나 서버가 직접 알고 있는 CA(SSLCACertificatePaht 있는 CA certificate) 서명한 client certificate만을 허용한다는 의미이다.

Example:

SSLVerifyDepth 10

 

SSLLog

Name

SSLLog

Description

Where to write the dedicated SSL engine logfile

Syntax

SSLLog filename

Default

None

Context

Server config, virtual host

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.1

SSL 프로토콜 엔진의 로그만을 기록할(dedicated) 로그 파일의 이름을 지정한다. 에러에 대한 메시지는 일반적인 Apache 에러로그 파일(ErrorLog directive 지정된 파일)에도 기록된다. 로그파일은 symlink attack 사용될 없는 (root만이 write 있는 ) 두어야 한다. 파일 이름이 슬래쉬(/) 시작하지 않으면 Server Root 대한 상대 경로로 인식되며, 파일 이름이 bar(|) 시작하는 경우에는 로그를 받아들이는 실행가능한 프로그램에 대한 경로로 인식된다. directive 하나의 virtual host config에서 한번만이 사용될 있다.

Example:

SSLLog /usr/local/apache/logs/ssl_engine_log

 

SSLLogLevel

Name

SSLLogLevel

Description

Logging level for the dedicated SSL engine logfile

Syntax

SSLLogLevel level

Default

SSLLogLevel none

Context

server config, virtual host

Override

Not applicable

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.1

directive SSL 프로토콜 엔진의 로그파일에 기록할 얼마나 자세하게 기록할 것인가를 지정한다. 지정할 있는 level 다음과 같다(아래로 갈수록 고수준의 level이며, 고수준의 level 저수준의 level 포함한다):

  • none

SSL 전용 로그파일에는 아무것도 남기지 않으며, 단지 에러에 관련된 메시지만이 Apache 에러 로그파일에 기록된다.

  • error

processing 멈추는 것과 같은 치명적인 상황에 대한 에러 메시지만을 기록하며, 메시지들은 Apache 에러 로그파일에도 기록된다.

  • warn

치명적이지 않은 문제에 대한 warning message까지 기록한다.

  • info

중요한 processing step 대한 informational message까지 기록한다.

  • trace

Minor processing step 대한 informational message까지 기록한다.

  • debug

Development low-level I/O information 위한 debugging message까지 기록한다.

Example:

SSLLogLevel warn

 

SSLOptions

Name

SSLOptions

Description

Configure various SSL engine run-time options

Syntax

SSLOptions [+-]option ...

Default

None

Context

server config, virtual host, directory, .htaccess

Override

Options

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.1

 

directive per-directory 수준에서의 다양한 run-time 옵션들을 조정한다. 여러 개의 SSLOption들이 하나의 directory 적용되는 경우 가장 specific 하나가 선택되어지며, 옵션들은 merge되지 않는다. 그러나 만약 SSLOptions directive 모든 옵션들이 plus(+) minus(-) 기호로 연결되어 있는 경우에는 모든 옵션들이 merge되어진다. +기호로 연결된 옵션들은 현재의 옵션에 포함되어지며, - 기호로 연결된 옵션들은 현재의 옵션으로부터 제외되어진다.

The available options are:

  • CompatEnvVars

다른 Apache SSL solution과의 backwardcompatibility 위한 부가적인 CGI/SSI 환경 변수들이 생성된다. 실제로 생성되어질 변수들에 대한 자세한 설명은 Compatibility 부분을 참조한다.

  • ExportCertData

두개의 부가적인 CGI/SSI 환경 변수, SSL_CLIENT_CERT SSL_SERVER_CERT 생성한다. 두개의 변수는 각각 현재의 HTTPS 연결(connection) 대한 클라이언트와 서버의 PEM-encoded X.509 Certificate 포함하게 되며, 고수준의 Certificate checking 위하여 CGI 스크립트에 의해 사용되어질 있다.

  • FakeBasicAuth

옵션이 사용되면 클라이언트 X.509 Certificate Subject DN(Distinguished Name) HPPT Basic Authentication username으로 변환되어지며, 이것은 표준 Apache 인증(authentication) 접근 제어(access control) 사용될 있음을 의미한다. user name Client X.509 Certificate Subject(이것은 SSLeay ssleay x509 ?noout ?subject ?in certificate.crt 명령을 실행할 얻어진다) 되며, 패스워드는 사용자로부터 얻어지는 것이 아니며 모든 user name 대한 패스워드는 password 단어를 암호화한 결과인 xxj31ZMTZzkVA 된다.

Example:

SSLOptions +FakeBasicAuth -CompatEnvVars

 

SSLRequireSSL

Name

SSLRequireSSL

Description

Deny access when SSL is not used for the HTTP request

Syntax

SSLRequireSSL

Default

None

Context

directory, .htaccess

Override

AuthConfig

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.0

directive 명시되면 현재의 연결이 SSL 위에서 이루어진 HTTP(, HTTPS) 아닌 경우 접근을 허용하지 않는다. directive SSL 적용할 virtual host 보호되어야 필요가 있는 디렉토리에 대한 설정 등에 매우 유용하며, directive 있으면 SSL 사용하지 않은 모든 요청(request)들은 거부되어진다.

Example:

SSLRequireSSL

 

SSLRequire

Name

SSLRequire

Description

Allow access only when an arbitrarily complex boolean expression is true

Syntax

SSLRequire expression

Default

None

Context

directory, .htaccess

Override

AuthConfig

Status

Extension

Module

mod_ssl

Compatibility

mod_ssl 2.1

directive 접근이 허용되기 위해 충족되어야 요구사항(access requirement) 지정하며, 요구 사항은 임의의 boolean expression들의 조합이 있다.

Boolean expression 다음의 문법(BNF grammar notation 따른 문법) 따라야 한다:

expr ::= "true" | "false"

| "!" expr

| expr "&&" expr

| expr "||" expr

| "(" expr ")"

| comp

comp ::= word "==" word | word "eq" word

| word "!=" word | word "ne" word

| word "<" word | word "lt" word

| word "<=" word | word "le" word

| word ">" word | word "gt" word

| word ">=" word | word "ge" word

| word "in" "{" wordlist "}"

| word "=~" regex

| word "!~" regex

wordlist ::= word

| wordlist "," word

word ::= digit

| cstring

| variable

| function

digit ::= [0-9]+

cstring ::= "..."

variable ::= "%{" varname "}"

function ::= funcname "(" funcargs ")"

여기서 varname Table 3 있는 어떠한 변수도 사용될 있으며, funcname에는 다음의 함수들이 가능하다:

  • file(filename)

함수는 filename 가리키는 하나의 문자열 인수를 받아서 파일의 content 확장된다. 함수는 파일의 content regular expression 대치시키는데 사용된다.

Expression 먼저 내부적으로 machine representation으로 parsing되며, 두번째 단계로서 evaluate되어진다. Global Per-Server context에서는 expression startup time parsing runtime에서만 machine representation 실행되어진다. Per-Directory context 경우에는 이와 다른데, 경우에는 expression 모든 request마다 parsing되고 곧바로 실행되어진다.

Example:

SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)-/ \

and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \

and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \

and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \

and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \

or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/

Table 3: Available Variables for SSLRequire

 

Additional Features

Environment Variables

Mod_ssl 다양한 SSL 정보를 부가적인 환경 변수들을 통해 제공하며, mod_ssl 생성하는 변수들은 Table 4 정리되어 있다. Backward compatibility 위해서 정보들은 다른 이름으로 제공될 수도 있으며, compatibility 변수들에 대한 자세한 내용은 Compatibility 부분을 참조한다.

Variable Name:

Value Type

Description:

HTTPS

flag

HTTPS is being used.

SSL_PROTOCOL

string

The SSL protocol version (SSLv2, SSLv3, TLSv1)

SSL_CIPHER

string

The cipher specification name

SSL_CIPHER_USEKEYSIZE

number

Number of cipher bits (actually used)

SSL_CIPHER_ALGKEYSIZE

number

Number of cipher bits (possible)

SSL_VERSION_INTERFACE

string

The mod_ssl program version

SSL_VERSION_LIBRARY

string

string The SSLeay program version

SSL_CLIENT_M_VERSION

string

string The version of the client certificate

SSL_CLIENT_M_SERIAL

string

The serial of the client certificate

SSL_CLIENT_S_DN

string

Subject DN in client's certificate

SSL_CLIENT_S_DN_x509

string

Component of client's Subject DN

SSL_CLIENT_I_DN

string

Issuer DN of client's certificate

SSL_CLIENT_I_DN_x509

string

Component of client's Issuer DN

SSL_CLIENT_V_START

string

Validity of client's certificate (start time)

SSL_CLIENT_V_END

string

Validity of client's certificate (end time)

SSL_CLIENT_A_SIG

string

Algorithm used for the signature of client's certificate

SSL_CLIENT_A_KEY

string

Algorithm used for the public key of client's certificate

SSL_SERVER_M_VERSION

string

The version of the server certificate

SSL_SERVER_M_SERIAL

string

The serial of the server certificate

SSL_SERVER_S_DN

string

Subject DN in server's certificate

SSL_SERVER_S_DN_x509

string

Component of server's Subject DN

SSL_SERVER_I_DN

string

Issuer DN of server's certificate

SSL_SERVER_I_DN_x509

string

Component of server's Issuer DN

SSL_SERVER_V_START

string

Validity of server's certificate (start time)

SSL_SERVER_V_END

string

Validity of server's certificate (end time)

SSL_SERVER_A_SIG

string

Algorithm used for the signature of server's certificate

SSL_SERVER_A_KEY

string

Algorithm used for the public key of server's certificate

[ where x509 is a component of a X.509 DN: C, SP, L, O, OU, CN, Email ]

Table 4: SSI/CGI Environment Variables

 

Custom Log Formats

Mod_ssl Apache 적용되어지면 Custom Log Format 위한 부가적인 함수들이 존재하게 된다. 예를 들면 %{varname}x eXtension format function 어떤 모듈이 제공하는 변수(특히 Table 4 나열된 mod_ssl 제공하는 변수) 확장(extend)하는데 사용된다. 또한 Backward compatibility 위해 %{name}c cryptography format function 제공되며, 함수에 대한 정보는 Compatibility 부분을 참조한다.

Example:

CustomLog logs/ssl_request_log \

"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

Posted by Golmong
: