98..Etc/GlassFish2008. 11. 12. 17:04
반응형

대부분의 엔터프라이즈 애플리케이션은 안전한 환경에서 실행할 필요가 있습니다. TLS(Transport Layer Security)/SSL(Secure Sockets Layer)은 포인트 투 포인트 보안 전송 메커니즘으로, 클라이언트 및 서버 간에 교환되는 메시지를 인증하고 메시지의 무결성 및 기밀성(confidentiality) 보장을 위해 사용할 수 있습니다. TLS/SSL(이 팁에서는 간단히 "SSL")은 대부분의 엔터프라이즈 애플리케이션 환경의 보안 요구사항을 충족하며 널리 채택되고 있습니다.

그러나 SSL에 의해 보호된 메시지 교환을 위해서는 서버가 SSL 서버로서 작동할 수 있어야 합니다. 이 팁에서는 GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키는 방법을 제시합니다.

각 단계별 설명으로 나아가기 전에, 키와 인증서와 같은 SSL의 기본 개념 몇 가지를 이해해야 하며 프로파일이라는 GlassFish v2의 개념도 이해할 필요가 있습니다.

키와 인증서

SSL에서 두 가지 중요한 개념은 키와 인증서입니다. 키는 클라이언트와 서버 사이의 트랜잭션에서 개인 정보 보호(privacy)와 신뢰(trust)를 구축하는 데 사용됩니다. SSL은 공개 키 암호화를 사용하며 이는 키 페어(key pairs)를 기반으로 합니다. 키 페어에는 하나의 공개 키와 하나의 개인 키가 포함됩니다. 데이터가 하나의 키로 암호화된 경우, 그것은 오직 그 페어의 나머지 한 키로만 해독될 수 있습니다.

인증을 위해서는 인증서가 사용됩니다. SSL을 사용하기 위해서는 서버에 연결할 수 있는 각 클라이언트의 IP 주소에 대해 각기 연관된 인증서가 있어야 합니다. 인증서는 서버 사이트의 소유자를 식별하며 관련 정보를 제공합니다. 인증서는 소유자에 의해 디지털로 암호화한 서명이 포함됩니다. 인증이 증요한 사이트의 경우, 인증서는 잘 알려진 신뢰성 있는 인증 기관으로부터 구입할 수 있습니다. 그러나 인증이 크게 중요하지 않은 사이트의 경우에는 자가 서명 인증서(self-signed certificate)를 사용할 수도 있습니다.

GlassFish v2 프로파일

GlassFish v2는 다양한 용도의 프로파일을 지원합니다. 각 프로파일은 애플리케이션 서버에 대한 구성 매개변수를 미리 설정하여 특정 유형의 용도로 최적화합니다. 세 가지 프로파일에는 개발자(developer), 클러스터(cluster) 및 엔터프라이즈(enterprise)가 있습니다.

개발자 프로파일은 개발 환경에서 사용하기 위해 GlassFish v2를 최적화합니다. 이는 구성 매개변수가 빠른 구동(fast startup)과 같은 목표는 지원하지만 로깅 또는 세션 복제와 같은 기능은 지원하지 않는다는 의미입니다. 클러스터 프로파일은 클러스터 생성 및 세션 복제를 가능하게 하는 구성 매개변수를 설정합니다. 클러스터는 GlassFish v2 인스턴스의 그룹으로 단일 논리 개체로서 관리하고 모니터할 수 있습니다. 엔터프라이즈 프로파일은 프로덕션 환경으로 GlassFish v2를 최적화합니다. 또한 로깅 및 기타 보안 관련 기능을 지원합니다.

GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키기

GlassFish v2를 SSL 서버로 작동시키는 단계는 애플리케이션 서버를 위해 사용된 프로파일에 따라 결정됩니다. 먼저 개발자 프로파일이 사용되는 경우의 프로세스를 살펴본 다음 엔터프라이즈 프로파일이 사용될 때의 프로세스를 검토합니다.

개발자 프로파일이 사용되는 경우

GlassFish v2 프로파일이 특정 유형의 용도를 위해 구성 매개변수를 미리 설정한다는 점을 상기하십시오. 이들 매개변수 중 하나가 Security Store인데 이것은 인증서와 키와 같은 보안 및 신용 관련 정보가 어떻게 저장되는지를 나타냅니다. 개발자 프로파일의 경우 Security Store 값은 JKS로 설정됩니다. 이 경우 서버에 대한 인증서와 키는 자바 키스토어 파일(keystore.jks)에 저장되며 인증서는 신뢰할 수 있는 CA에 의해 발행되며 인증서 파일(cacerts.jks)에 저장됩니다.

GlassFish v2를 설치할 때 서버 인증서로 자가 서명 인증서가 기본적으로 생성됩니다. 그러나 인증이 사용자의 사이트에서 중요한 경우라면, 자가 서명 인증서를 CA로부터의 디지털 서명 인증서로 교체할 필요가 있습니다. 이 섹션에서는 자가 서명 인증서를 대체하는 방법, CA에서 서버 인증서를 확득하는 방법 및 서버 인증서를 키스토어로 가져오는 방법을 설명합니다.

아래에 기술된 단계에서는 키 및 인증서 관리 툴인 keytool을 사용합니다. Keytool은 여러 버전의 자바 플랫폼, 스탠다드 에디션(자바 SE) 개발 킷(jdk)에서 사용 가능합니다. 한편 자바 SE 6에서는 keytool.에 몇 가지 필수 기능이 추가되었습니다. 아래의 명령은 jdk 6 버전의 keytool을 기반으로 합니다. keytool에 대한 자세한 정보는 JDK 툴 및 유틸리티를 참조하십시오.

다음은 애플리케이션 서버가 개발자 프로파일로 구성될 때 GlassFish v2를 SSL 서버로 작동시키기 위한 명령문입니다.

  1. 다음 명령을 수행하여 기본적으로 설치된 자가서명 인증서를 삭제하십시오(참고: 이 단계와 이후의 단계의 명령문은 포맷을 위해 여러 줄에 걸쳐 표시되었음).        keytool -delete -alias s1as -keystore keystore.jks
           -storepass <store_passwd>

    이 때 <store_passwd>는 키스토어에 대한 비밀번호(예: "mypass")입니다. s1as는 GlassFish v2 키스토어의 디폴트 alias입니다.

  2. 다음 명령을 수행하며 애플리케이션 서버를 위한 새로운 키 페어를 생성하십시오.       keytool -genkeypair -keyalg <key_alg>
          -keystore keystore.jks -validity <val_days> -alias s1as

    이 때 <key_alg>는 키 페어 생성을 위해 사용되는 알고리즘(예: RSA)이며 <val_days>는 인증서의 유효일 수(예: 365)입니다.

    키 페어 생성 외에도 해당 명령문은 공개 키를 자가 서명 인증서로 보호하고 인증서와 비밀 키를 alias에 의해 식별되는 새로운 키스토어 엔트리에 저장한다는 점에 유의하십시오.

    인증서의 이름이 사용자 사이트의 완전한 호스트 이름과 일치하도록 보장하는 것이 중요합니다. 그 이름이 일치하지 않으면 서버에 연결하는 클라이언트는 인증서의 이름이 사이트의 이름과 일치하지 않는다는 보안 경고를 받게 될 것입니다. 기본적으로 설치된 자가서명 인증서의 이름이 완전한 호스트 이름과 일치하는지 알고 있어야 합니다.

  3. 다음 명령을 수행하여 CSR(Certificate Signing Request)을 생성하십시오.       keytool -certreq -alias s1as -file <certreq_file>
          -keystore keystore.jks -storepass <store_passwd>

    여기서 <certreq_file>은 CSR이 저장되는 파일(예: s1as.csr)이며 <store_passwd>는 키스토어에 대한 비밀번호(예: changeit)입니다.

  4. VeriSign과 같은 CA에 CSR을 제출하십시오. 그러면 사용자는 응답으로 서명된 서버 인증서를 받게 될 것입니다. CA의 CA 인증서뿐만 아니라 응답에서 CA가 식별한, 중간에 발생한 모든 인증서를 브라우저로 가져와야 합니다.
  5. CA로부터 받은 서명된 서버 인증서를 마커 -----BEGIN CERTIFICATE-----와 -----END CERTIFICATE----- 를 포함하여 s1as.cert와 같은 파일에 저장하십시오. CA 인증서 및 모든 중간 CA 인증서를 다운로드하고 로컬 파일에 저장하십시오. CA 및 중간 CA 인증서를 브라우저로 가져오는 방법에 대해서는 브라우저 문서를 참조하십시오. Mozilla 및 Internet Explorer와 같은 다양한 브라우저로 CA 인증서를 가져오는 방법에 대한 정보는 CA에서 제공할 수도 있습니다.
  6. 원래의 자가 서명 인증서를 CA로부터 획득한 인증서(s1as.cert와 같은 파일에 저장)로 대체하십시오. 이를 위해 keytool 을 사용할 수 있으나 여러 단계를 필요로 합니다. 다음 자바 프로그램을 수행하면 더 쉽게 대체할 수 있습니다.

          import java.io.*;
          import java.security.Key;
          import java.security.KeyStore;
          import java.security.cert.Certificate;
          import java.security.cert.CertificateFactory;
          import java.security.cert.X509Certificate;
         
           
          public class Main {
              public static void main(String[] args) throws Exception {
                //args[] error checking logic omitted
                //file containing signed cert reply from CA
                String csrReplyFromCA = args[0];    
                //Path to GlassFish keystore.jks
                String keystoreLocation = args[1];  
                //Password for GlassFish keystore.jks
                String keystorePassword = args[2];  
                //The keyalias to be replaced : s1as in our example
                String selfSignedKeyEntry = args[3];
                 
                //create the signed Cert
                Certificate cert = null;
                FileInputStream fis =
                   new FileInputStream(csrReplyFromCA);
                CertificateFactory cf =
                   CertificateFactory.getInstance("X.509");
                cert = cf.generateCertificate(fis);
                 
                //now replace the original entry
                char[] passwordChars =
                   keystorePassword.toCharArray();
                KeyStore keystore = KeyStore.getInstance("JKS");
                keystore.load(new FileInputStream(keystoreLocation),
                   passwordChars);
                Key key = keystore.getKey(selfSignedKeyEntry,
                   passwordChars);
                keystore.setKeyEntry(selfSignedKeyEntry, key,
                   passwordChars, (new Certificate[]{cert}));
                keystore.store(new FileOutputStream(
                   keystoreLocation), passwordChars);
              }
          }

프로그램을 수행한 후에, GlassFish 키스토어 내의 인증서 s1as가 더 이상 원래의 자가 서명 인증서가 아니라 CA로부터 받은 인증서(response certificate)라는 것을 확인해야 합니다. 다음은 VeriSign으로부터 획득한 새 s1as 인증서와 원래의 s1as 인증서를 비교한 예입니다.

원래의 s1as (자가 서명):

Owner: CN=KUMAR, OU=Sun Java System Application Server, O=Sun
Microsystems, L=Santa Clara, ST=California, C=US
Issuer: CN=KUMAR, OU=Sun Java System Application Server, O=Su
n Microsystems, L=Santa Clara, ST=California, C=US
Serial number: 472acd34
Valid from: Fri Nov 02 12:39:40 GMT+05:30 2007 until: Mon Oct
30 12:39:40 GMT+05:30 2017

새로운 s1as (CA로부터 서명된 인증서 포함):

Owner: CN=KUMAR, OU=Terms of use at www.verisign.com/cps/test
ca (c)05, OU=Sun Java System Application Server, O=Sun Micros
ystems, L=Santa Clara, ST=California, C=US
Issuer: CN=VeriSign Trial Secure Server Test CA, OU=Terms of
use at https://www.verisign.com/cps/testca (c)05, OU="For Test
Purposes Only. No assurances.", O="VeriSign, Inc.", C=US
Serial number: 1375de18b223508c2cb0123059d5c440
Valid from: Sun Nov 11 05:30:00 GMT+05:30 2007 until: Mon Nov
26 05:29:59 GMT+05:30 2007

이러한 단계를 수행한 후에 GlassFish v2를 다시 시작하고 CA에 의해 발행된 서명된 서버 인증서를 사용할 수 있습니다.

클러스터 프로파일이 사용되는 경우

애플리케이션 서버가 클러스터 프로파일로 구성되는 경우, GlassFish v2를 SSL 서버로 작동시키려면 개발자 프로파일에 대해 수행했던 것과 동일한 단계를 수행합니다. 그러나 이 경우에 동일한 서버 키가 클러스터 내의 모든 애플리케이션 서버 인스턴스에 복제된다는 것을 확실하게 알아 둘 필요가 있습니다.

엔터프라이즈 프로파일이 사용되는 경우

엔터프라이즈 프로파일을 위한 Security Store 매개변수는 NSS이며 이는 네트워크 보안 서비스(Network Security Services)를 나타냅니다. NSS 보안 인프라에는 JKS 키스토어가 없으며 따라서 디폴트 GlassFish 키스토어가 없습니다.

GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키는 단계는 개발자 프로파일이 사용될 때와 엔터프라이즈 프로파일이 사용될 때가 대체로 유사합니다. 그러나 두 가지의 차이점이 있습니다. 첫 번째 차이는 프로세스의 첫 단계와 관계가 있습니다. JKS 키스토어가 없기 때문에 사용자는 비어 있는 키스토어(keystore.jks)로 프로세스를 시작합니다. 두 번째 차이는 프로세스의 마지막 단계와 관련이 있습니다. 결과로 얻은 서명 인증서를 JKS 키스토어로 가져오는 대신 사용자는 그것을 NSS 스토어로 가져옵니다. 즉, GlassFish v2 애플리케이션 서버를 SSL 서버로 작동시키려면 위에서 설명한 개발자 프로파일이 사용되는 경우와 동일한 단계를 수행하지만 비어 있는 키스토어로 시작하고 6단계를 다음으로 대체합니다.

  1. 다음 명령을 사용하여 키스토어로부터 서버 인증서를 위한 비밀키를 PEM(Privacy Enhanced Mail) 포맷으로 보내십시오.       keyexport.bat -keyfile serverkey.pem
          -keystore keystore.jks -storepass changeit -alias s1as

    이 명령문은 keyexport 유틸리티를 호출합니다. keyexport 패키지에 keyexport가 있습니다. 이 패키지는 Project Metro의 XWSS 다운로드 페이지에서 다운로드할 수 있습니다.

    위 명령에 대한 응답으로 키스토어 비밀번호 입력 프롬프트가 나타날 것입니다. 키스토어 비밀번호는 키 비밀번호와 동일하므로 리턴키를 누르면 됩니다.

    이것은 serverkey.pem 파일을 생성하며 이 파일에는 마커 -----BEGIN PRIVATE KEY----- 와 -----END PRIVATE KEY----- 아래에 서버 비밀 키가 포함됩니다.

  2. CA로부터 응답으로 온 서명 인증서(signed certificate reply)를 마커 -----BEGIN CERTIFICATE----- 와 -----END CERTIFICATE----- 를 포함하여 servercert.pem 파일에 추가하십시오. 마커 END PRIVATE KEY 아래에 그 응답을 추가하십시오.
  3. serverkey.pem 파일을 PKCS#12 파일(확장자가 .pfx인 파일)로 변환하십시오. "PKCS"는 RSA Security에 의해 고안 및 발행된 공개 키 암호화 표준의 그룹을 가리킵니다. PKCS#12는 비밀키와 그에 수반되며 비밀번호 기반의 대칭 키로 보호되는 공개 키 인증서를 저장하는데 흔히 사용되는 파일 형식을 정의합니다.

    serverkey.pem 파일을 PKCS#12 파일로 변환하는데 사용할 수 있는 툴은 여러가지가 있습니다. openssl 툴은 그러한 것 중 하나입니다. 다음은 openss1을 사용하여 파일을 변환하는 명령문입니다.

          openssl pkcs12  -export  -in serverkey.pem -out s1as.pfx

    위 명령에 대한 응답으로 익스포트 비밀번호 입력 프롬프트가 나타날 것입니다. "changeit"과 같은 비밀번호 또는 GlassFish 마스터 비밀번호를 입력하십시오.

    s1as.pfx 파일에는 이제 서명이 있는 서버 인증서 및 비밀 키가 포함될 것입니다.

  4. 원래의 s1as 자가서명 항목이 있으면 다음 명령을 수행하여 삭제하십시오.       certutil -D -n s1as -d $AS_NSS_DB

  5. pk12util 유틸리티를 사용하여 새 s1as.pfx 파일을 NSS 스토어로 가져오는 명령문은 다음과 같습니다.       pk12util -i s1as.pfx -d $AS_NSS_DB

    pk12util은 엔터프라이즈 프로파일을 위한 GlassFish 설치 임시 디렉토리 내에서 이용 가능한 NSS 유틸리티입니다. 그 유틸리티는 PCKS#12 파일을 NSS 스토어로 가져오거나 스토어에서 내보내는 데 사용됩니다.

    명령문에 대한 응답으로, NSS 소프트 토큰 및 PKCS#12 파일에 대한 비밀번호 입력 프롬프트가 나타날 것입니다. 적절한 비밀번호를 입력하십시오. 그러면 가져오기가 성공적으로 수행되었다는 다음과 같은 메시지를 볼 수 있을 것입니다.

          pk12util: PKCS12 IMPORT SUCCESSFUL  

고려해야 할 두 가지 경우가 있습니다.

  • 애플리케이션 서버 프로파일이 엔터프라이즈 프로파일이며 서버 키 페어가 이미 PKCS#12 파일에 있습니다. 스토어 내에 alias가 s1as인 항목이 이미 있는 경우에는 "엔터프라이즈 프로파일이 사용되는 경우"에서 설명한 대로 4단계를 수행하여 원래의 항목을 삭제하기만 하면 됩니다.      certutil -D -n s1as -d $AS_NSS_DB

    그리고 나서 5단계를 수행하여 새로운 s1as.pfx 파일을 NSS 스토어로 임포트합니다.

          pk12util -i s1as.pfx -d $AS_NSS_DB

    alias가 s1as인 항목이 스토어에 없으면 5단계만 수행하십시오.

  • 애플리케이션 서버 프로파일이 개발자 프로파일이며 서버 키 페어가 이미 PKCS#12 파일에 있습니다. 이러한 경우에 엔터프라이즈 프로파일이 사용되는 경우 에서 설명한 대로 5단계를 수행하여 원래의 s1as 항목을 삭제하기만 하면 됩니다. 그 후 pkcs12import 유틸리티를 사용하여 PCKS#12 파일을 GlassFish 키스토어로 가져오십시오.      pkcs12import.sh -file s1as.pfx -alias s1as
         -keystore keystore.jks -storepass changeit
         -pass <exp_password>

    이 때 <exp_password>는 PKCS#12 파일이 보내졌을 때 사용되었던 비밀번호(예: changeit)입니다.

    pkcs12import 패키지에 pkcs12import 유틸리티가 있으며 이 패키지는 Project Metro의 XWSS 다운로드 페이지에서 다운로드할 수 있습니다.

자세한 정보

GlassFish와 SSL에 대한 더 자세한 정보는 GlassFish v2로 SSL 및 CRL 확인(SSL and CRL Checking with GlassFish v2)를 참조하십시오.

또한 다음 리소스도 참조하십시오.


저자 정보

Kumar Jayanti는 썬마이크로시스템즈의 공학자 직원이며 웹 기술 및 표준 팀에서 일하고 있습니다. 현재 Kumar는 XML과 웹 서비스 보안 구현 부문에서 주역을 맡고 있으며 또한 최근에는 GlassFish 보안 모듈도 책임지게 되었습니다. 그는 2004년 초반부터 썬에서 웹 서비스 보안 분야에 관여해 왔으며 인도 Mumbai의 IIT에서 Computer Science 공학석사(M.Tech) 학위를 취득했습니다. 그의 관심 영역은 분산 컴퓨팅, CORBA, XML, 웹 서비스 및 보안 분야입니다.



이 글의 영문 원본은
http://java.sun.com/mailers/techtips/en ··· v07.html
에서 보실 수 있습니다.

"Java EE" 카테고리의 다른 글

Posted by 1010