최초작성 : 2006-12-02
수정 : 2007-04-15
아파치에 ssl을 적용하는 절차를 요약한다.
아파치 서버에서 SSL 통신을 가능하기 위해서는 OpenSSL 과 mod_ssl 이 필요하다.
우선, 이 작업을 위해서는
ssl을 지원하는 업체에 신청해야 한다.
http://www.anycert.co.kr 접속 -> geotrust Quick SSL신청 (가장저렴)
1. 메일이 온다.
2. 메일내용보기
|
|
|
|
안녕하세요.
애니서트 디지털인증팀입니다.
원활한 인증서 발급을 위해 다음 절차를 진행해주십시오.
진행하실 작업은 두 가지 입니다.
1. CSR 생성 (CSR 생성 가이드 상단부 참조)
2. 개인키 백업 (CSR 생성 가이드 하단부 참조)
<CSR 생성 가이드>
http://www.anycert.co.kr/support/4_1ssl_install_csr02_10.html
생성된 CSR파일은 any@anycert.co.kr으로 보내주십시오.
주의! 생성하신 .key 파일은 반드시 백업하시기 바랍니다.
기타 기술 정보는 로그인을 통해서 이용하실 수 있습니다.
애니서트에서는 고객님들의 편의를 위해 홈페이지상에 'Q&A 게시판’ 을 운영하고 있습니다. 또한, 이메일을 통한 기술지원도 가능하며, 홈페이지 메인화면에 있는 080 무료전화(070-7075-0209)를 이용하셔도 좋습니다.
설치 중 문의하실 부분이 있으시면 언제든지 말씀하여 주시기 바랍니다.
감사합니다. | | |
-------------------------
3. 이제 서버작업시작하자
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />참고 사이트는
www.openssl.org
www.apache.org
www.modssl.org
찾아가서 아래 tar.gz파일을 내려받는다.
우선 아파치는 설치되었다고 가정한다. APM설치된 상태
아파치는 다시 컴파일하면, 새로 적용된다.
PHP 역시 새로 컴파일하면 새로 적용되며 아파치의 libphp4.so 파일만 갈아치운다. 참조할것
1. OpenSSL의 설치
$ pwd
/root/ssl/
$ gzip -cd openssl-0.9.8d.tar.gz | tar xvf -
$ ./config --prefix=/usr/local/openssl
$ make
$ make install
config에서 prefix를 주지 않았을 때에는 /usr/local/ssl 디렉토리에 설치가 된다.
설치시, rpm은 지우지말고 소스로 그냥 설치한다.
2. mod_ssl 설치
/root/ssh/에 tar.gz파일 있다고 가정
아파치소스를 이곳폴더아래에 다운로드해서 압축을 풀어두자.
즉, ../apache_1.3.37 가 적용되도록 상대경로주의
$ gzip -cd mod_ssl-2.8.1-1.3.19.tar.gz | tar xvf –
화일의 다운로드와 압축풀기가 끝나면 mod-ssl부터 설정을 한다.
mod-ssl 설정
$ cd mod_ssl-2.8.1-1.3.19
$ vi i.sh
SSL_BASE=/usr/local/openssl
export SSL_BASE
LDFLAGS=-L/usr/local/openssl/lib
export LDFLAGS
CPPFLAGS=-I/usr/local/openssl/include
export CPPFLAGS
./configure \
--with-apache=../apache_1.3.37 \
--with-ssl=/usr/local/openssl
상기내용 저장한다.
$ ./i.sh
참고 : 아파치소스는 새로 받아서 폴더경로만 맞추면 됨 설치하고 지워버리면됨.
3. Apache Server 컴파일
OpenSSL, Mod_SSL 설정이 끝났으면, 모든 기능을 아파치서버와 컴파일한다.
$ cd ../apache_1.3.x
$ export CFLAGS="${CFLAGS} -DEAPI -DHARD_SERVER_LIMIT=1024 -DDEFAULT_SERVER_LIMIT=1024"
./configure \
--prefix=/usr/local/apache \
--enable-rule=SHARED_CORE \
--enable-shared=max \
--enable-module=so \
--enable-module=rewrite \
--enable-module=ssl \
--enable-shared=ssl
$ make
$ make install
주의) 만약에 설치완료후 -DEAPI 관련 Warning: 경고가 올라온다면, 위에
CFLAGS="${CFLAGS} -DEAPI -DHARD.... 로 삽입하여 설치하면, 경고가 없어짐
mod_rewrite.c 등도 설치할때 /usr/local/apache/bin/apxs -iac -DEAPI mod_rewrite.c
형태로 옵션을 붙여주며 추가할것. php의 설치는
php 소스속에 Makefile 을 열어서 CFLAGS = ... 으로 나가는 부분에 -DEAPI 옵션을 추가하고
아래문서 configure....->make->make install 하면 libphp4.so 를 다시 만들어 에러제거함
한마디로 말하면, 에러없애고 싶으면 아파치와 모듈 그리고 php를
-DEAPI 옵션을 주어서 덮어서 다시 컴파일해줌
주의사항들
1. apache 가 설치된 /usr/local/apache 를 백업하거나 이동할 것
2. 설치후에 /usr/local/apache/conf/httpd.conf 가 완전히 변경된다. (ssl에
맞게 변경됨) 그러므로, 원본과 대조하여 수정할 것
3. 추가모듈은 새로 올린다.
4. httpd.conf 를 모두 수정한다. 단, ssl관련virtual setting은 아직 하지말것 기존
것을 그대로 사용한다.
인증서를 설치한 후에
$ apachectl startssl 명령을 이용하여 아파치를 구동
주의 ) 위 과정을 설치하고 나서
cp /usr/local/apache/bin/apachectl /etc/rc.d/init.d/httpd
vi /etc/rc.d/init.d/httpd
제일 하단에 아래 3줄을 삽입하고 저장하자.
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 90 90
# description: A very fast and reliable WebServer engine.
chkconfig --level 3 httpd on
이렇게 반드시 해 주어야 함. 스크립트에 startssl 이 새로 올라간다.
<< 인증서는 어떻게 올리나? >>
이제 인증서를 제대로 신청하고 올려보자.
|
개인키(비밀키) 생성
webhost2006.csr을 만들어서 anycert로 보내어 인증받는것이다.
한번 만들어보자. |
|
- $SSL_KEY_STORE 변수는 ssl 개인키를 보관하는 디렉토리를 가르킵니다.
예를 들어서 /root/ssl 이란 폴더라고 하면 cd /root/ssl 로 가서 작업합니다.
| ▣ |
<PRE>[root@web1 root]# cd /root/ssl
[root@web1 ssl]# openssl genrsa -des3 -out webhost2006.key 1024Generating RSA private key, 1024 bit long modulus.............++++++...++++++e is 65537 (0x10001)Enter pass phrase for webhost2006.key: ******Verifying - Enter pass phrase for ssl2005.key: ******[root@web1 ssl]#</PRE> |
|
패스워드를 설정하라는 메시지가 나오면 원하는 패스워드를 입력합니다.
이 패스워드는 나중에 인증서를 설치할 때 필요하므로 반드시 기억해두셔야 합니다.
입력을 마치면 1024비트 RSA 키가 생성되어 ssl2005.key라는 이름으로 저장됩니다. webhost2006.key는
다른 적당한 이름으로 바꾸어도 무방합니다.
|
|
4. 개인키 확인 - 위의 작업과 계속 연관된 작업을 진행합니다.
| ▣ |
| <PRE>[root@web1 ssl]# openssl rsa -noout -text -in webhost2006.keyEnter pass phrase for ssl.key: ******Private-Key: (1024 bit)modulus: 00:da:bf:f3:39:d7:c6:1f:bd:6f:a7:b8:aa:67:f2:...coefficient: 6b:26:51:9e:fb:77:cf:7e:d4:2a:a6:d2:7f:21:fa: 42:e4:7c:54:2e:5e:e9:fb:03:a6:25:d0:6a:fc:e9: e1:1b:45:82:61:c0:35:a9:50:25:0a:75:2a:f8:cc: 87:10:30:9d:bd:36:8e:4b:f6:55:0d:08:30:e8:55: e4:00:3b:ec[root@web1 ssl]#</PRE> |
패스워드를 입력하라는 메시지가 나오면 개인키에 설정한 패스워드를 입력합니다.
그러면 위와 같이 생성된 개인키를 확인할 수 있습니다. |
|
CSR 생성
인증서를 신청하기 위한 정보를 입력합니다.
<주의사항>과 <입력예>를 반드시 읽어주시고 이에 따라서 정보를 입력하시기 바랍니다.
<주의사항>
① Organization(영문회사명)에는 < > ~ ! @ # $ % ^ * / \ ( ) ? 등의 특수 문자를 넣을 수 없습니다. 사업자 등록증에 기재된 회사명과 일치하는 영문회사명을 넣어 주시기 바랍니다. (예: 사업자 등록증에 '닷네임 코리아'이면 dotname korea 으로 넣어주셔야 합니다. dotname만 넣으시면 않됩니다.)
또한, 인증서를 설치할 Common Name(인증 받을 도메인 주소)에 해당하는 도메인의 등록정보를 반드시 참조하셔서 해당 등록정보에 기재된 회사명을 참고 하실 수 있겠습니다.
영문 회사명은 소유하고 계신 도메인이 com/net/org인 경우에는 Network Solutions에서, kr인 경우에는 KRNIC에서 확인할 수 있습니다.
② Common Name(인증 받을 도메인 주소)에는 IP 주소, 포트번호, 경로명, http:// 등을 포함할 수 없습니다.
③ 정보입력 과정에서 마지막에 나오는 Extra Attributes, 즉 A challenge password와 An optional company name은 입력하지 마시고 Enter키만 눌러주셔야 합니다. 두 항목에 내용을 입력하실 경우 잘못된 CSR이 생성될 수 있습니다.
<입력 예>
Country Name (국가코드) : KR
State or Province Name (시/도) : Seoul
Locality Name (구/군) : Seocho
Organization Name (회사명) : WEBHOST Corp.,Ltd.
Organizational Unit Name (부서명) : Digital Certificate Team
Common Name (인증 받을 도메인 주소) : login.webhost.co.kr
Email Address : da*****@naver.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password :
An optional company name : anycert
|
주의사항 ) 만일, ssl인증을 login.webhost.co.kr 만 할 것이면 www.webhost.co.kr로
신청하지 말것.
일반적으로 login.도메인으로 많이 합니다. 로그인부분만 ssl적용하기 위함
- 위의 작업과 계속 연관된 작업을 진행합니다.
| ▣ |
<PRE>[root@web1 ssl]# openssl req -new -key webhost2006.key -out webhost2006.csrEnter pass phrase for ssl.key: ******...Country Name (국가코드) : KR
State or Province Name (시/도) : Seoul
Locality Name (구/군) : Seocho
Organization Name (회사명) : WEBHOST Corp.,Ltd.
Organizational Unit Name (부서명) : Digital Certificate Team
Common Name (인증 받을 도메인 주소) : login.webhost.co.kr
Email Address : da*****@naver.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password :
An optional company name : anycert
[root@web1 ssl]#</PRE> |
|
|
CSR 확인 - 위의 작업과 계속 연관된 작업을 진행합니다.
| ▣ |
| <PRE>[root@web1 ssl]# openssl req -noout -text -in webhost2006.csrCertificate Request: Data: Version: 0 (0x0) Subject: C=kr, ST=Seoul, L=Seocho, O=WEBHOST Corp.,Ltd., OU=Digital Certificate Team, CN=login.webhost.co.kr...[root@web1 ssl]#</PRE> |
생성된 CSR 파일을 확인해 볼 수 있습니다.
|
|
7. 개인키 백업 - 위의 작업과 계속 연관된 작업을 진행합니다.
| ▣ |
| <PRE>[root@web1 ssl]# cp webhost2006.key /root/webhost2006.key[root@web1 ssl]# sftp xxx.xx.xx.xx> put ssl2005.key</PRE> |
안전한 곳에 개인키를 백업 복사를 해 놓습니다.
※ 개인키(ssl.key)파일과 패스워드는 결코 잃어버리시면 안 됩니다.
안전한 장소에 백업해두시기 바랍니다. (매우 중요함. 잃어버리면 다시 돈내야함 ㅠㅠ) |
|
8. 애니서트에 CSR 접수 생성된 CSR파일을 출력해보면 다음과 같은 base64 형식의 문서를 볼 수 있습니다.
- 위의 작업과 계속 연관된 작업을 진행합니다.
| ▣ |
| <PRE>[root@web1 ssl]# cat webhost2006.csr-----BEGIN NEW CERTIFICATE REQUEST-----MIISDOIUlkmlsRRlkSllskjauASKJlalOSISLKjwBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRQwEgYDVQQKEwtPcHBvcnR1bml0aTEYMBYGA1UECxMPT25saW5lIFNlcnZpY2VzMRowGAYDVQQDExF3d3cuZm9yd2FyZC5jby56YTBaMA0GCSqGSIb3DQEBAQUAAAklmLKSuljSOIjsfBWu5WLHD/G4BJ+PobiC9d7S6pDvAjuyC+dPAnL0d91tXdm2j190D1kgDoSp5ZyGSgwJh2V7diuuPlHDAgEDoAAwDQYJKoZIhvcNAQEEBQADQQBf8LSLKknlsklSSLlworrr334ZmXD1AvUjuDPCWzFupReiq7UR8Z0wJUUsllkfq/IuuIlz6oCq6htdH7/tvKhh-----END NEW CERTIFICATE REQUEST-----[root@web1 ssl]#</PRE> |
이 CSR 문서를 반드시 첫줄(-----BEGIN CERTIFICATE REQUEST-----)과 끝줄(-----END CERTIFICATE REQUEST-----)이 포함되도록 복사하여 메모장에 붙여넣기 합니다.
이 CSR을 애니서트 메일로 첨부해 주시기 바랍니다. |
혹시 방화벽설정되었다면 443포트를 열어둔다.
후아~~ 이제 인증키를 만들어서 anycert로 보냈습니다. 약 7일정도 지나면, 메일로 인증서가 옵니다.
<< 인증서 받고나서 해야할 일>>
이제 기다리면, 인증키값이 나오고 그후에 아파치에서 버출얼세팅해서 사용.
버추얼부분 (httpd.conf 최하단 부분) 셋팅방법
<IfDefine SSL>
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
</IfDefine>
<IfModule mod_ssl.c>
SSLPassPhraseDialog builtin
SSLSessionCache dbm:/usr/local/apache/logs/ssl_scache
SSLSessionCacheTimeout 300
SSLMutex file:/usr/local/apache/logs/ssl_mutex
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
SSLLog /usr/local/apache/logs/ssl_engine_log
SSLLogLevel info
</IfModule>
이렇게 우선 선언한 후에
<VirtualHost 222.234.3.19:443>
DocumentRoot /home/webhost
ServerName www.webhost.co.kr
ServerAdmin root@localhost
SSLEngine on
SSLCipherSuite ALL:!ADH:!*************8GH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /usr/local/apache/conf/ssl.crt/webhost2006.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/webhost2006.key
SSLCACertificateFile /usr/local/apache/conf/ssl.crt/QuickTrustSSL_Bundle.crt
<Files ~ "\.(cgi|shtml|phtml|php3|php|html?)$">
SSLOptions +StdEnvVars
</Files>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog /usr/local/apache/logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
</IfDefine>
당사의 경우를 예로들어서 설명했습니다.
보시면, 앞에서 만들었던 webhost2006.key webhost2006.csr 을 conf/ssl.crt/ 와
conf/ssl.key 폴더속에 복사해 줘야 합니다.
그리고 애니서트에서 온 QuickTrustSSL_Bundle.crt 를 역시 ssl.crt 폴더속에 복사
그리고 위처럼 셋팅을 하면
https://www.webhost.co.kr 을 하면, ssl이 동작합니다.
http://www.webhost.co.kr 은 80포트로 접속되고
https://www.webhost.co.kr 은 443포트로 접속됩니다. 그러므로 443포트도 방화벽걸었으면 열것
대부분 https://login.webhost.co.kr 로 신청해서 사용합니다.
이유는 검색하시면 나옵니다.
주의할 점 ) https://login.webhost.co.kr 로 동작시킬때 이 폴더의 파일과 이미지는 http://와 완전히
다르므로 별도의 홈페이지처럼 다시 구성한 후에 처리해야 함.
로그인처리기법 ) 로그인정보입력하고 보안접속체크하면, https://login.webhost.co.kr에서
DB검색해서 세션을 처리한 후 다시 http://www.webhost.co.kr 로 돌려보내면 끝
 |
|
* 소스 코드 |
<script language="JavaScript">
< !--
function checkLoginForm1() {
var f = document.forms["LoginForm1"];
//아이디 입력 검사
if( f.memberID.value=="" ){
alert("아이디를 입력하세요");
f.memberID.focus();
return false;
}
//비밀번호 입력 검사
if( f.memberPW.value=="" ){
alert("비밀번호를 입력하세요");
f.memberPW.focus();
return false;
}
//액션
f.action = "http://login.your-domain.com/login1.html";
return true;
}
//-->
< /script>
< form name="LoginForm1" method="POST" onSubmit="return checkLoginForm1();">
< table>
<tr>
<td>아이디</td>
<td><input type="text" name="memberID"></td>
<td> </td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="memberPW"></td>
<td><input type="submit" name="Submit" value=" 로그인 "></td>
</tr>
< /table>
< /form>
| |
|
|
* 소스 코드 |
<script language="JavaScript">
<!--
function checkLoginForm2() {
var f = document.forms["LoginForm2"];
//아이디 입력 검사
if( f.memberID.value=="" ){
alert("아이디를 입력하세요");
f.memberID.focus();
return false;
}
//비밀번호 입력 검사
if( f.memberPW.value=="" ){
alert("비밀번호를 입력하세요");
f.memberPW.focus();
return false;
}
//액션
if ( f.SSL_Login.checked ) { //보안접속 체크 판별
//보안접속을 체크했을 때의 액션
f.action = "https://login.your-domain.com/login1.html";
} else {
//보안접속을 체크하지 않았을 때의 액션
f.action = "http://login.your-domain.com/login1.html";
}
return true;
}
//-->
</script>
<form name="LoginForm2" method="POST" onSubmit="return checkLoginForm2();">
<table>
<tr>
<td>아이디</td>
<td><input type="text" name="memberID"></td>
<td><input type="checkbox" name="SSL_Login" value=1 checked> 보안접속</td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="memberPW"></td>
<td><input type="submit" name="Submit" value=" 로그인 "></td>
</tr>
</table>
</form> |
※ SSL을 이용한 암호화된 폼 전송을 하려면, action URL에서
'http' 대신 'https'를 적어 주면 됩니다. | | |
문서보기 :
http://www.anycert.co.kr/support/securelogin_guide.html
댓글을 달아 주세요