2007. 12. 20. 22:49

SSL

항목 바로가기:

*SSL은 무엇이며 어떻게 작동합니까?
SSL 은 Secure Sockets Layer의 약어입니다. SSL 프로토콜은 Netscape에서 개발했으며 Internet Explorer, Netscape, AOL 및 Opera와 같이 널리 사용되고 있는 모든 웹 브라우저에서 지원됩니다. SSL을 작동하려면 인증 기관에서 발급한 SSL 인증서를 웹 서버에 설치해야 합니다. 그런 다음 SSL을 사용하여 브라우저와 웹 서버간에 전송된 데이터(보안 SSL 트랜잭션)를 암호화할 수 있습니다. 브라우저에서 http가 https로 변경되고 작은 자물쇠가 표시되어 SSL 보안 세션임을 나타냅니다. 웹 사이트 방문자는 이 자물쇠를 클릭하여 SSL 인증서를 표시할 수 있습니다.

*FreeSSL.com. SSL Jargon Buster!. n.d. <
http://www.freessl.com/ssl-certificate/ssl-terms.html> (2004년 5월 19일).



*PKC는 무엇이며 어떻게 작동합니까?
공 개 키 암호화(PKC)는 메시지를 안전하게 교환하는 방법으로 트랜잭션에 관련된 개인에게 두 개의 상호보완적인 키(공개 키, 개인 키)를 지정하는 방식으로 사용됩니다. 공개 키 암호화는 메시지를 수학적으로 스크램블하거나 스크램블을 푸는 암호학을 기반으로 합니다.

공개 키 암호화는 대칭 키 암호화의 일부 단점들을 보완합니다. 공개 키 암호화에서 개인 또는 조직은 공개 키와 개인 키라는 두 개의 상호보완적인 키를 사용합니다. 개인 키를 사용하여 암호화된 모든 정보는 공개 키를 사용해야만 암호를 해독할 수 있습니다. 마찬가지로 공개 키를 사용하여 암호화된 모든 정보는 개인 키를 사용해야만 암호를 해독할 수 있습니다. 예를 들면 다음과 같습니다.

1. Bob에게 두 개의 보완 키가 있습니다.
2. 한 키는 암호화에 다른 키는 암호 해독에 사용할 수 있습니다.
3. Bob은 한 키를 개인용(개인 키)으로 보관합니다.
4. Bob은 다른 키를 공개적으로 사용할 수 있도록 만듭니다(공개 키).
5. Alice가 Bob에게 메시지를 보내려고 합니다.
6. Bob이 Alice에게 자신의 공개 키 사본을 보냅니다.
7. Alice가 Bob의 공개 키로 메시지를 암호화합니다.
8. Bob이 자신의 개인 키로 메시지의 암호를 해독합니다.

공개 키 암호화에서 Alice가 비밀 메시지를 Bob에게 보내려면 Bob의 공개 키 사본이 있어야 합니다. 그러나, 이렇게 하려면 우선 Alice는 공개 키가 Bob의 것인지 확인해야 합니다.
인 증서(디지털 ID라고도 함)를 사용하여 이 문제를 처리합니다. 인증서란 공개 키를 특정 개인 또는 조직의 것임을 보증하는 전자 문서입니다. 인증서는 인증 기관(CA)이라는 신뢰할 수 있는 외부 업체에서 발급합니다. 인증서를 발급하기 전에 공인된 CA는 Bob의 신원 및 인증서의 공개 키가 실제로 Bob의 것인지 인증하는 일련의 절차를 수행합니다.

*VeriSign, Inc. About Digital IDs FAQ's. n.d. <
https://digitalid.s-trust.de/secure/server/about/aboutFAQ.htm> (2004년 5월 19일).



*인증서란 무엇입니까?
SSL 인증서는 디지털 인증서라고도 하며 기술적으로 디지털 정보 암호화 및 서명에 사용할 수 있는 한 쌍의 전자 키와 ID를 연결합니다. SSL 인증서를 사용하면 각 개인이 지정한 키를 사용할 권리를 갖고 있음을 검증할 수 있으므로 다른 사람이 부정하게 키를 사용하여 다른 사용자로 가장하는 것을 방지할 수 있습니다. SSL 인증서는 암호화와 함께 사용되어 완벽한 보안 솔루션을 제공하므로 트랜잭션에 관련된 개인 또는 조직의 신원을 보장할 수 있습니다.

SSL 인증서는 인증 기관(CA)이라는 신뢰할 수 있는 외부 업체에서 발급합니다. CA는 여권 발급 기관과 같은 역할을 수행합니다. CA는 일련의 절차를 통해 ID 발급 대상의 신원을 분명히 해야 합니다. 조직의 신원을 분명히 한 후에 CA는 해당 조직의 공개 키가 들어 있는 인증서를 발급하고 CA의 개인 키로 인증서에 서명합니다.

SSL 인증서를 사용하면 여러분의 사이트에서 인증되고 암호화된 온라인 상거래를 수행할 수 있습니다. 여러분의 사이트를 방문하는 사람들은 자신들이 여러분과 직접 상거래를 하고 있으며 자신들이 보내는 정보를 정해진 사람 이외의 다른 사람들이 가로채거나 암호를 해독할 수 없다는 확신을 갖고 신용 카드 번호나 기타 개인 정보를 보낼 수 있게 됩니다. SSL 인증서에는 다음과 같은 정보가 포함됩니다.

  • 조직의 일반적인 명칭(예: www.bea.com)
  • 추가 신원 정보(예: IP 및 실제 주소)
  • 공개 키
  • 공개 키 만료 날짜
  • ID를 발급한 CA 이름(예: VeriSign)
  • 고유 일련 번호
  • VeriSign의 디지털 서명
*eLiteral. 디지털 인증서. n.d. <http://services.eliteral.com/digital-certificate-mumbai/index.php> (2004년 5월 19일).


*인증 기관이란 무엇입니까?
인 증 기관이란 신뢰할 수 있는 외부 업체로서 여권 발급 기관 또는 공증 기관이라고 할 수 있습니다. 인증 기관은 디지털 인증서의 명부를 발급, 취소, 갱신 및 제공하는 기관입니다. 인증 기관은 엄정한 인증 절차를 거쳐 개인 및 조직의 인증서를 발급합니다. 모든 디지털 인증서는 인증 기관의 개인 키로 "서명되어" 신뢰성을 입증합니다. 인증 기관의 공개 키는 공개적으로 배포됩니다.

*VeriSign, Inc. About Digital IDs FAQ's. n.d. <https://digitalid.s-trust.de/secure/server/about/aboutFAQ.htm> (2004년 5월 19일).



*SSL 핸드셰이크란 무엇입니까?
SSL 핸드셰이크는 SSL 세션을 만드는 브라우저 및 웹 서버의 프로세스에 사용되는 용어입니다. SSL 핸드셰이크에는 브라우저가 SSL 인증서를 수신한 후 SSL 인증서와 관련된 SSL 키가 웹 서버에 있는지 여부를 암호화 방식으로 입증하기 위해 "challenge" 데이터를 웹 서버에 전송하는 과정이 포함됩니다. 암호화 challenge에 성공하면 SSL 핸드셰이크가 완료되고 웹 서버는 해당 웹 브라우저와 SSL 세션을 유지합니다. SSL 세션 동안 웹 서버와 웹 브라우저간에 전송된 데이터는 암호화됩니다.

핸드셰이크 문제 해결에 앞서 핸드셰이크에 대해서 잘 알고 있어야 합니다. 디버그 옵션을 사용하여 핸드셰이크를 디버그할 때 각 핸드셰이크 단계를 분석해야 문제를 파악할 수 있습니다. 핸드셰이크에 관련된 내용을 파악하려면
http://wp.netscape.com/eng/ssl3/3-SPEC.HTM을 참조하십시오.


클라이언트에서 ClientHello 메시지를 서버로 보내면 서버는 ServerHello 메시지로 응답해야 합니다. 그외의 경우에는 심각한 오류가 발생하여 연결이 끊어질 수 있습니다. client hello 및 server hello를 사용하여 클라이언트와 서버간에 향상된 보안 기능을 설정합니다. client hello 및 server hello를 통해 프로토콜 버전, 세션 ID, 암호 그룹 및 압축 방법과 같은 특성이 설정됩니다.

서버는 hello 메시지를 보낸 후 인증이 필요한 경우 인증서를 보냅니다.

서버가 인증되면 선택한 암호 그룹에 해당되는 경우 클라이언트 인증을 위해 클라이언트로부터 인증서(CertificateRequest)를 요청합니다(선택적 양방향).

이제 서버는 핸드셰이크의 hello 메시지 단계가 완료되었음을 알리는 ServerHelloDone 메시지를 보냅니다. 그런 다음 서버는 클라이언트로부터의 응답을 기다립니다.

서버에서 CertificateRequest 메시지를 보낸 경우 클라이언트는 인증서 메시지를 인증서 없음 경고를 보냅니다(선택적 양방향). 이제 ClientKeyExchange 메시지가 전송됩니다. 이 메시지의 내용은 ClientHello 및 ServerHello간에 선택된 공개 키 알고리즘에 따라 달라집니다. 클라이언트에서 서명 기능이 포함된 인증서를 보낸 경우 디지털 방식으로 서명된 CertificateVerify 메시지가 전달되어 인증서가 명시적으로 검증됩니다.

이 시점에서 클라이언트는 ChangeCipherSpec 메시지를 보내며 보류 중인 암호 사양의 사본을 현재 암호 사양으로 복사합니다. 클라이언트는 새 알고리즘, 키 및 보안 상태에서 즉시 Finished 메시지를 보냅니다. 이에 대한 응답으로 서버는 자신의 ChangeCipherSpec 메시지를 보내고 보류 중인 암호 사양을 현재 사양으로 전송하고 새 암호 사양에서 자신의 Finished 메시지를 보냅니다. 이 시점에서 핸드셰이크가 완료되고 클라이언트와 서버는 응용 프로그램 계층 데이터를 교환하기 시작합니다. (아래 순서도 참조)

*FreeSSL.com. SSL Jargon Buster!. n.d. <
http://www.freessl.com/ssl-certificate/ssl-terms.html> (2004년 5월 19일).



인증서 형식
주요 인증서 형식은 다음과 같습니다.

  • PEM
  • DER
  • PKCS#12

PEM
모 든 개인 키(RSA 및 DSA), 공개 키(RSA 및 DSA) 및 (X509) 인증서를 포함할 수 있습니다. ascii 헤더로 묶인 Base64 인코드 DER 형식으로 데이터를 저장하므로 시스템간 텍스트 모드 전송에 적합합니다.

-----BEGIN CERTIFICATE-----
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFTAT
BgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJpdHkxIzAhBgNVBAMT
GkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9zdXBw
b3J0QGJlYS5jb20wHhcNMDAwNTMwMjEzODAxWhcNMDQwNTEzMjEzODAxWjCBjDEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xFTATBgNVBAoTDEJFQSBXZWJMb2dpYzEZMBcGA1UEAxMQd2VibG9n
aWMuYmVhLmNvbTEeMBwGCSqGSIb3DQEJARYPc3VwcG9ydEBiZWEuY29tMFwwDQYJ
KoZIhvcNAQEBBQADSwAwSAJBALdsXEHqKHgs6zj0hU5sXMAUHzoT8kgWXmNkKHXH
79qbPh6EfdlriW9G/AbRF/pKrCQu7hhllAxREbqTuSlf2EMCAwEAATANBgkqhkiG
9w0BAQQFAANBACgmqflL5m5LNeJGpWx9aIoABCiuDcpw1fFyegsqGX7CBhffcruS
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
-----END CERTIFICATE-----


DER
DER(Distinguished Encoding Rules)에는 모든 개인 키, 공개 키 및 인증서가 포함될 수 있습니다. 대부분의 브라우저에서 기본 형식이며 ASN1 DER 형식에 따라 저장됩니다. 헤더가 없습니다. PEM은 텍스트 헤더로 묶인 DER입니다.

PKCS#12
PKCS#12(Public Key Cryptography Standards #12)에는 모든 개인 키, 공개 키 및 인증서가 포함될 수 있습니다. 바이너리 형식으로 저장되며 PFX 파일이라고도 합니다.



데모 인증서 생성
데모 인증서 생성 과정은 다음을 참조하십시오.

WLS 8.1

http://support.bea.com/askbea_soln/attachments/S-22841/Configure_Keystore_SSL_WLS81_viewlet_swf.html


WLS 6.1 및 7.0 http://support.bea.com/askbea_soln/attachments/S-21880/Setup_SSL_Certificates_WLS70_61_viewlet_swf.html
 
다음에서 데모 생성 과정을 간단히 설명합니다.

인증서 구성을 설정하려면 다음과 같은 인증서가 있어야 합니다.

  • 개인 키
  • 공개 키
  • 인증 기관(CA)

1단계 - 데모 개인 키 만들기
개인 키는 다음 세 가지 도구를 사용하여 만들 수 있습니다.

  • keytool
  • 인증서 서블릿
  • openssl

keytool(jdk에서 사용)
다음과 같이 개인 키를 생성합니다.

Usage; keytool -genkey      [-v] [-alias <alias>] [-keyalg <keyalg>]
             [-keysize <taille_clU>] [-sigalg <sigalg>]
             [-dname <nomd>] [-validity <joursval>]
             [-keypass <mot_passe_clU>] [-keystore <keystore>]
             [-storepass <mot_passe_store>] [-storetype <type_store>]
             [-provider <classe_fournisseur>] ...

keytool -genkey -keyalg RSA -alias mykey -keystore mykeystore.jks
Enter keystore password:  password
What is your first and last name?
  [Unknown]:  Colette Gotfried
What is the name of your organizational unit?
  [Unknown]:  Customer Service
What is the name of your organization?
  [Unknown]:  BEA
What is the name of your City or Locality?
  [Unknown]:  Liberty Corner
What is the name of your State or Province?
  [Unknown]:  New Jersey
What is the two-letter country code for this unit?
  [Unknown]:  NJ
Is CN=Colette, OU=Customer Service, O=BEA, L=Liberty Corner, ST=NJ, C=NJ correct?
  [no]:  yes

Enter key password for <mykey>
        (RETURN if same as keystore password):

이 결과 mykeystore.jks 파일이 생성됩니다. 이 파일에는 개인 키 및 자체 서명된 공개 키가 있습니다. keytool 사용에 관한 자세한 내용은 Keytool 설명서를 참조하십시오.

WebLogic의 인증서 서블릿(7.0까지만 지원됨)
이 응용 프로그램은 certificate.war 파일로 배포됩니다. 다음과 같이 호출할 수 있습니다.

http://hostname:port/certificate

2단계 - 신뢰할 수 있는 CA에서 공개 키 서명

다음 단계는 인증된 CA로부터 공개 키 서명을 받는 것입니다. CSR(Cert Signature Request)을 검색한 후 이를 인증 기관에 보냄으로써 서명을 받을 수 있습니다.

keytool -certreq -keystore demokeystore
Enter keystore password :  password

-----BEGIN NEW CERTIFICATE REQUEST-----
MIIBrTCCARYCAQAwbTELMAkGA1UEBhMCRlIxEDAOBgNVBAgTB0Zsb3JpZGUxDjAMBgNVBAcTBVBh
cmlzMQwwCgYDVQQKEwNCRUExEzARBgNVBAsTCkJFQVN5c3RlbXMxGTAXBgNVBAMTEFNlYmFzdGll
bk1hbGJvaXMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMMfPz2S+6tXayJ2qmQ0yF6MFXxQ
XcmL2n9QqnE1k+hmIRfvD6dAYSOc8wZorbjZppEqHMK4ZVRKQuqvrRdyasR7DJO6ezQSGG0kyB+J
qLDLMkwT8ig0Z6eiIdQkvrbnCTi9hPWI76rdgwxF8UIeJbh7k0NctG1CISZdLGwRxeOJAgMBAAGg
ADANBgkqhkiG9w0BAQQFAAOBgQB5gK/tsCt3S6FTA+kfYpXMyplmbI7sDd4I0JOlciqe7ssw+va1
wA5UEVt8HqRXQMczEcZRwrf0QbxjQXJUMz4e6i4OuQvp/XMK+EOWHTcLwYgu708A81GyisXUd3/D
iecFRcH4TBCIHHbdqtFtVH0BXKsLUuiAxabRyI0507XfXg==
-----END NEW CERTIFICATE REQUEST-----

위 코드를 모두(BEGIN NEW CERTIFICATE REQUEST 및 END NEW CERTIFICATE REQUEST 포함) 인증 기관에 복사하여 붙여넣습니다.

다음 예제는 theVerisign CA를 사용합니다.

  • Verisign 사이트로 이동합니다.
  • SSL Trial ID를 클릭합니다.
  • 해당 사항을 모두 입력한 후 생성한 CSR을 복사하여 붙여넣습니다.
  • Verisign에서 공개 키를 PEM 형식으로 첨부하여 전자 메일을 보낼 것입니다. 이것을 public.pem으로 저장합니다.
  • Verisign CA 루트 인증서 링크가 제공되면 CA.pem과 같은 새 파일로 저장합니다.

CA 루트를 keystore에 저장합니다. 중간 CA가 있는 경우 이 중간 CA를 CA 루트 뒤에 입력해야 합니다.

keytool -import -alias verisignCA -file CA.pem -keystore mykeystore -trustcacerts

keytool -import -alias verisignIntermediateCA -file IntermediateCA.pem -keystore mykeystore -trustcacerts


이 공개 키를 keystore로 가져옵니다. 이 공개 키는 개인 키와 동일한 별칭으로도 사용됩니다.

keytool -import -alias mykey -file public.pem -keystore mykeystore -trustcacerts


인증서 형식 변환

OpenSSL은 keytool과 유사한 기능이 있는 개방형 소프트웨어 도구입니다. http://www.openssl.org/contrib/ssl.ca-0.1.tar.gz에서 OpenSSL을 다운로드하십시오.

PEM에서 PKCS#12(Netscape, IE 등)로

openssl pkcs12 -export -in pem-certificate-and-key-file -out pkcs-12-certificate-and-key-file

openssl pkcs12 -export -in pem-certificate-file -inkey pem-key-file -out pkcs-12-certificate-and-key-file

PKCS#12에서 PEM으로
http://support.globalsign.net/en/serversign/pkcs12.cfm

  • pkcs12 파일에서 개인 키를 추출합니다.
  • openssl/bin 디렉토리에서 명령줄을 엽니다.
  • 다음 명령을 실행하여 pkcs12 파일에서 개인 키를 추출합니다.

openssl pkcs12 .in keyexport.pfx .nocerts .nodes .out keyexport.prv

  • pkcs12(.pfx) 파일을 만드는데 사용할 암호를 입력합니다.
  • pkcs12 파일에서 공개 키를 추출합니다.
  • 다음 명령을 실행하여 pkcs12 파일에서 공개 키를 추출합니다.
openssl pkcs12 .in keyexport.pfx .nokeys .out keyexport.pub
  • pkcs12(.pfx) 파일을 만드는데 사용할 암호를 입력합니다.
  • PEM 암호를 입력하고 확인합니다.
  • PEM/DER에서 DER/PEM으로 - RSA 키
openssl rsa -inform PEM|DER -outform DER|PEM -in pem-file|der-file -out der-file|pem-file


PEM 키는 다음과 같습니다.

-----BEGIN CERTIFICATE-----

...ascii stuff....

-----END CERTIFICATE-----

참고: DER 키는 ascii 형식이므로 해독하기 어렵습니다.



인증서 검토

개인 키:
openssl -rsa -inform DER -in demokey.der -text

공개 키, 인증 기관:

openssl -x509 -inform PEM -in democert.pem -text

Keystore:
keytool -list -keystore mykeystore.jks -v
Enter keystore password: password

Keystore type: jks
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: mykey
Creation date: Mar 30, 2004
Entry type: keyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Colette, OU=Customer Service, O=BEA, L=Liberty Corner, ST=NJ, C=NJ
Issuer: CN=Colette, OU=Customer Service, O=BEA, L=Liberty Corner, ST=NJ, C=NJ
Serial number: 4069afc4
Valid from: Tue Mar 30 12:35:00 EST 2004 until: Mon Jun 28 13:35:00 EDT 2004
Certificate fingerprints:
         MD5:  1D:D7:8F:82:19:6D:A6:BF:C9:B1:DA:E2:EB:B3:C1:93
         SHA1: 0A:83:65:79:B2:59:35:33:24:56:AF:84:E6:A3:D0:E9:12:69:C8:67
 

*******************************************
*******************************************

기타 명령:

pkcs12 파일에서 개인 키를 추출합니다.

openssl pkcs12 .in keyexport.pfx .nocerts .nodes .out keyexport.prv

pkcs12 파일에서 공개 키를 추출합니다.

openssl pkcs12 .in keyexport.pfx .nokeys .out keyexport.pub

자세한 내용은 http://www.techonline.com/community/ed_resource/feature_article/14364를 참조하십시오.



keystore를 사용하도록 WLS 구성(단방향 SSL에만 해당)
관리 콘솔에서 Server 페이지로 이동한 후 Keystore & SSL 탭에서 다음 항목을 선택합니다.

Custom Identity and Custom Trust
Custom Identity
Custom Identity Key Store File Name:  mykeystore
Custom Identity Key Store Type: jks
Custom Identity Key Store Pass Phrase: password
Confirm Custom Identity Key Store Pass Phrase: password

Custom Trust
Custom Trust Key Store File Name: mykeystore
Custom Trust Key Store Type: jks
Custom Trust Key Store Pass Phrase: password
Confirm Custom Trust Key Store Pass Phrase: password

Private Key Alias: mykey
Passphrase: password
Confirm Passphrase: password


SSL Listen Port Enabled를 선택했는지 확인한 후 서버를 다시 시작하십시오.


<19 dUc. 2003 10 h 39 CET> <Debug> <TLS> <000000> <SSLManager.getServerCertifica
te()>
<19 dUc. 2003 10 h 39 CET> <Notice> <Security> <BEA-090171> <Loading the identity certificate stored under the alias mykey from the jks keystore file D:\_Wk\supportpattern\mydomain\demokeystore.>
<19 dUc. 2003 10 h 39 CET> <Notice> <WebLogicServer> <BEA-000298> <Certificate expires in 14 days: [
[
  Version: V3
  Subject: CN=CertServer, OU=BEASystems, O=BEA, L=Paris, ST=Florida, C=FR
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  com.sun.net.ssl.internal.ssl.JSA_RSAPublicKey@1bf
  Validity: [From: Fri Dec 19 01:00:00 CET 2003,
               To: Sat Jan 03 00:59:59 CET 2004]
  Issuer: OU=For VeriSign authorized testing only. No assurances (C)VS1997, OU=www.verisign.com/repository/TestCPS Incorp. By Ref. Liab. LTD., O="VeriSign, Inc"

  SerialNumber: [    0ed7bf9a 778fd148 175bac0b e1d3627d]

Certificate Extensions: 5
[1]: ObjectId: 2.5.29.31 Criticality=false
Extension unknown: DER encoded OCTET string =
0000: 04 3B 30 39 30 37 A0 35   A0 33 86 31 68 74 74 70  .;0907.5.3.1http
0010: 3A 2F 2F 63 72 6C 2E 76   65 72 69 73 69 67 6E 2E  ://crl.verisign.
0020: 63 6F 6D 2F 53 65 63 75   72 65 53 65 72 76 65 72  com/SecureServer
0030: 54 65 73 74 69 6E 67 43   41 2E 63 72 6C           TestingCA.crl
 

[2]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
[1.3.6.1.5.5.7.3.1, 1.3.6.1.5.5.7.3.2]]

[3]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
  [CertificatePolicyId: [2.16.840.1.113733.1.7.21]
[PolicyQualifierInfo: [
  qualifierID: 1.3.6.1.5.5.7.2.1
  qualifier: 0000: 16 2A 68 74 74 70 3A 2F   2F 77 77 77 2E 76 65 72  .*http://www.ver
isign.com/repository/TestCPS
0010: 69 73 69 67 6E 2E 63 6F   6D 2F 72 65 70 6F 73 69 
0020: 74 6F 72 79 2F 54 65 73   74 43 50 53             

]]  ]
]

[4]: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

[5]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:false
PathLen: undefined
]

]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 08 3A F5 EC EE 10 AD 9C   3C D7 94 5A 84 9C 34 F2  .:......<..Z..4.
0010: 61 70 30 45 AF 99 03 79   AF 47 D9 A0 62 20 A6 D3  ap0E...y.G..b ..
0020: C1 21 98 59 A3 3D 6D 8F   E9 58 71 CE 87 FE AB 8A  .!.Y.=m..Xq.....
0030: 99 D8 F5 71 DE 44 55 2E   BB EB 86 15 C0 31 BF 25  ...q.DU......1.%

]>
<19 dUc. 2003 10 h 39 CET> <Info> <WebLogicServer> <BEA-000307> <Exportable key maximum lifespan set to 500 uses.>
<19 dUc. 2003 10 h 39 CET> <Info> <WebLogicServer> <BEA-000308> <Using full strength (domestic) SSL.>
<19 dUc. 2003 10 h 39 CET> <Notice> <Security> <BEA-090169> <Loading trusted certificates from the jks keystore file D:\_Wk\supportpattern\mydomain\demokeystore.>
<19 dUc. 2003 10 h 39 CET> <Debug> <TLS> <000000> <Trusted CA: [
[
  Version: V1
  Subject: OU=For VeriSign authorized testing only. No assurances (C)VS1997, OU=www.verisign.com/repository/TestCPS Incorp. By Ref. Liab. LTD., O="VeriSign, Inc"
  Signature Algorithm: MD5withRSA, OID = 1.2.840.113549.1.1.4

  Key:  com.sun.net.ssl.internal.ssl.JSA_RSAPublicKey@166
  Validity: [From: Sun Jun 07 02:00:00 CEST 1998,
               To: Wed Jun 07 01:59:59 CEST 2006]
  Issuer: OU=For VeriSign authorized testing only. No assurances (C)VS1997, OU=www.verisign.com/repository/TestCPS Incorp. By Ref. Liab. LTD., O="VeriSign, Inc"

  SerialNumber: [    52a9f424 da674c9d af4f5378 52abef6e]

]
  Algorithm: [MD5withRSA]
  Signature:
0000: A5 A7 47 F2 8F 37 10 A0   96 94 CF E6 7C DB A3 E4  ..G..7..........
0010: 02 22 49 AC 08 F8 D3 08   C9 EF 9B B2 9C C0 32 60  ."I...........2`
0020: B9 A1 30 92 88 B5 80 14   98 F5 B8 89 A7 DA 0A F9  ..0.............
0030: CB F5 62 7D CA B9 53 3E   62 9B 5C 59 72 DF C7 12  ..b...S>b.\Yr...

]>
<19 dUc. 2003 10 h 39 CET> <Debug> <TLS> <000000> <SSLManager: loaded 1 trusted CAs from D:\_Wk\supportpattern\mydomain\demokeystore>
<19 dUc. 2003 10 h 39 CET> <Info> <WebLogicServer> <BEA-000307> <Exportable key maximum lifespan set to 500 uses.>
<19 dUc. 2003 10 h 39 CET> <Info> <WebLogicServer> <BEA-000300> <Certificate contents: 2 certificate(s):
  fingerprint = 68dd50d604d078d8da79c2b93a6d9886, not before = Fri Dec 19 01:00:00 CET 2003, not after = Sat Jan 03 00:59:59 CET 2004, holder = C=FR SP=Florida L=Paris O=BEA OU=BEASystems CN=CertServer , issuer = O=VeriSign, Inc OU=For Veri Sign authorized testing only. No assurances (C)VS1997 , key =  modulus length=12 9 exponent length=3
  fingerprint = 40065311fdb33e880a6f7dd14e229187, not before = Sun Jun 07 02:00:
00 CEST 1998, not after = Wed Jun 07 01:59:59 CEST 2006, holder = O=VeriSign, Inc OU=For VeriSign authorized testing only. No assurances (C)VS1997 , issuer = O=VeriSign, Inc OU=For VeriSign authorized testing only. No assurances (C)VS1997 , key =  modulus length=65 exponent length=3>

<19 dUc. 2003 10 h 39 CET> <Notice> <WebLogicServer> <BEA-000355> <Thread "SSLListenThread.Default" listening on port 7002, ip address *.*>


작업이 완료되었습니다. 단방향 SSL(클라이언트 인증 없음)을 수행하도록 WebLogic을 구성했습니다.

문제 해결어느 한 쪽의 SSL 구성이나 SSL 통신에 사용되는 인증서나 사용 중인 SSL 소프트웨어에서 문제가 발생할 수 있습니다. 우선 어느 쪽에서 어떤 SSL 오류가 발생했는지 정확히 파악해야 합니다.

1. 오류 파악: SSL 디버그 플래그를 설정하여 SSL 문제 추적

SSL 문제를 진단하려면 Java 명령줄에 다음 명령을 추가합니다.

  • -Dweblogic.security.SSL.verbose=true
  • -Dssl.debug=true
  • -Dweblogic.StdoutDebugEnabled=true

-Dweblogic.security.SSL.debugEaten=true 플래그도 서버에 추가할 수 있습니다. 그러나 내용이 너무 복잡해질 수도 있으므로 최후에 추가하는 것이 좋습니다.

config.xml에서 DebugSSL="true",

<ServerDebug DebugSSL="true' Name="myserver"/>

및 Server Mbean에서 StdoutDebugEnabled="true" StdoutSeverityLevel="64"를 추가할 수 있습니다.

이 옵션은 서버와 클라이언트에서 모두 WebLogic SSL 패키지를 사용하는 경우 서버와 클라이언트에 대해 모두 지정하고 그렇지 않은 경우에는 WebLogic 서버쪽에 대해서만 지정하면 됩니다.


2. 핸드셰이크는 정확히 어떤 형태입니까?

참고: 자세한 내용은 SSL 핸드셰이크란 무엇입니까?를 참조하십시오.

첫 번째 SSL 핸드셰이크
SSL 로그를 grep하면 양호한 핸드셰이크는 다음 내용을 표시합니다.

서버쪽
type mylogserver  | grep "HANDSHAKEMESSAGE"

<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientHelloV2>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientKeyExchange>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientKeyExchange RSA>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>

type mylogserver  | grep "CHANGE_CIPHER_SPEC"
 <18 d?c. 2003 13 h 26 CET> <Debug> <TLS> <000000> <write CHANGE_CIPHER_SPEC offset = 0 length = 1>


클라이언트쪽
type mylogclient | grep ""HANDSHAKEMESSAGE"

  <18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHello>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Certificate>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHelloDone>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>

세션을 다시 시작하는 SSL
핸드셰이크가 두 번째 요청에서 세션을 다시 시작할 때 발생합니다.

그림 제공: FreeSSL.com. SSL Jargon Buster!. n.d.<http://www.freessl.com/ssl-certificate/ssl-terms.html> (2004년 5월 19일).

서버쪽
type mylogserver  | grep "HANDSHAKEMESSAGE"

<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientHelloV2>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientKeyExchange>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientKeyExchange RSA>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>
<REQUEST ONE PROCESSED>
<NOW PROCESSING REQUEST TWO>
<18 dUc. 2003 13 h 27 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientHello>
<18 dUc. 2003 13 h 27 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>


type mylogserver  | grep "CHANGE_CIPHER_SPEC"
<18 dUc. 2003 13 h 27 CET> <Debug> <TLS> <000000> <write CHANGE_CIPHER_SPEC offset = 0 length = 1>
<18 dUc. 2003 13 h 27 CET> <Debug> <TLS> <000000> <126795 received CHANGE_CIPHER_SPEC>


클라이언트쪽
type mylogclient | grep ""HANDSHAKEMESSAGE"

<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHello>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Certificate>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHelloDone>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>
<REQUEST ONE PROCESSED>
<18 dec. 2003 13 h 26 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHello>
<18 dec. 2003 13 h 27 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>

핸드셰이크에서 클라이언트 인증 수행(양방향 SSL)핸드셰이크에서 클라이언트 인증을 수행할 때 발생합니다(양방향 SSL).



그림 제공: FreeSSL.com. SSL Jargon Buster!. n.d.<http://www.freessl.com/ssl-certificate/ssl-terms.html> (2004년 5월 19일).

서버쪽

type mylogserver  | grep "HANDSHAKEMESSAGE"

<19 dec. 2003 11 h 07 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientHello>
<19 dec. 2003 11 h 07 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Certificate>
<19 dec. 2003 11 h 07 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientKeyExchange>
<19 dec. 2003 11 h 07 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ClientKeyExchange RSA>
<19 dec. 2003 11 h 07 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: CertificateVerify>
<19 dec. 2003 11 h 07 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>

클라이언트쪽
type mylogclient | grep ""HANDSHAKEMESSAGE"

>type mylogclient | grep ""HANDSHAKEMESSAGE"
<23 dec. 2003 15 h 59 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHello>
<23 dec. 2003 15 h 59 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Certificate>
<23 dec. 2003 15 h 59 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: CertificateRequest>
<23 dec. 2003 15 h 59 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHelloDone>
<23 dec. 2003 15 h 59 CET> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Finished>


type mylogclient | grep "CHANGE_CIPHER_SPEC"
<23 dec. 2003 15 h 59 CET> <Debug> <TLS> <000000> <write CHANGE_CIPHER_SPEC offs

3. 로그 분석 - 오류 파악
로그의 내용을 확인할 때 서버나 클라이언트에서 발생하고 있는 첫 번째 SSL 예외를 찾아야 합니다. 다음은 예상되는 모든 오류입니다.

close_notify, unexpected_message, bad_record_mac, decryption_failed, record_overflow, decompression_failure, handshake_failure, bad_certificate, unsupported_certificate, certificate_revoked, certificate_expired,   certificate_unknown, illegal_parameter, unknown_ca, access_denied, decode_error, decrypt_error,   export_restriction, protocol_version, insufficient_security, internal_error, user_canceled, no_renegotiation

가장 일반적인 오류 및 문제 해결 방법은 다음과 같습니다.


일반 인증서
문제를 조사하거나 재현하기 전에 모든 인증서를 확인해야 합니다.

openssl x509 -in ca.pem -text

Certificate:
    Data:

        Version: 3 (0x2)

        Serial Number: 0 (0x0)

        Signature Algorithm: md5WithRSAEncryption

        Issuer: C=US, ST=California, L=San Francisco, O=BEA WebLogic, OU=Securit
y, CN=Demo Certificate Authority/Email=support@bea.com
        Validity

            Not Before: May 30 21:37:44 2000 GMT

            Not After : May 14 21:37:44 2004 GMT

        Subject: C=US, ST=California, L=San Francisco, O=BEA WebLogic, OU=Securi
ty, CN=Demo Certificate Authority/Email=support@bea.com
        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

            RSA Public Key: (512 bit)

                Modulus (512 bit):

                    00:dd:51:28:0f:64:36:96:7e:0f:ca:29:54:35:4c:

                    8f:6b:dc:90:c5:2e:98:a8:99:3b:c7:05:a5:00:76:

                    79:00:08:6a:ed:d9:28:b1:90:c2:35:96:18:61:36:

                    62:86:93:b1:19:c8:0b:c2:a6:3a:81:86:42:37:ba:

                    70:96:4f:a1:fd

                Exponent: 65537 (0x10001)

    Signature Algorithm: md5WithRSAEncryption

        00:5b:0a:65:9f:5d:73:59:da:e6:51:e9:3b:c1:0b:f3:91:0f:

        0c:f4:72:08:9f:65:4d:1c:37:6c:f3:04:a8:8b:72:06:e1:00:

        5e:1f:30:a1:18:06:37:98:fd:2a:29:c3:a1:6b:26:14:20:4e:

        e4:c1:72:a8:de:69:e0:03:cb:e3

-----BEGIN CERTIFICATE-----

MIICQzCCAe2gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx

EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFTAT

BgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJpdHkxIzAhBgNVBAMT

GkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9zdXBw

b3J0QGJlYS5jb20wHhcNMDAwNTMwMjEzNzQ0WhcNMDQwNTE0MjEzNzQ0WjCBqTEL

MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG

cmFuY2lzY28xFTATBgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJp

dHkxIzAhBgNVBAMTGkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZI

hvcNAQkBFg9zdXBwb3J0QGJlYS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEA

3VEoD2Q2ln4PyilUNUyPa9yQxS6YqJk7xwWlAHZ5AAhq7dkosZDCNZYYYTZihpOx

GcgLwqY6gYZCN7pwlk+h/QIDAQABMA0GCSqGSIb3DQEBBAUAA0EAAFsKZZ9dc1na

5lHpO8EL85EPDPRyCJ9lTRw3bPMEqItyBuEAXh8woRgGN5j9KinDoWsmFCBO5MFy

qN5p4APL4w==

-----END CERTIFICATE-----


해결 방법
모든 인증서의 유효성을 검사하고 만료 날짜를 확인합니다.



호스트 이름 유효성 검사 실패

클라이언트쪽

[Security:090504]Certificate chain received from localhost - 127.0.0.1 failed hostname verification check. Certificate contained CertServer but check expected localhost javax.net.ssl.SSLKeyException: [Security:090504]Certificate chain received from localhost - 127.0.0.1 failed hostname verification check. Certificate contained CertServer but check expected localhost
        at com.certicom.tls.interfaceimpl.TLSConnectionImpl.fireException(Unknown Source)
        at com.certicom.tls.interfaceimpl.TLSConnectionImpl.fireAlertSent(Unknown Source)
        at com.certicom.tls.record.handshake.HandshakeHandler.fireAlert(Unknown Source)..

해결 방법
  -Dweblogic.security.SSL.ignoreHostnameVerification=true 스위치를 사용합니다. 이 옵션은 서버 인증서의 CN이 CertServer인데 접속을 시도하는 URL은 이와 다르다는 것을 의미합니다. 만약 t3://CertServer:7001으로 접속한다면 이 HostnameVerification 옵션은 필요 없습니다.

다른 해결 방법도 있습니다.

 -Dweblogic.security.SSL.hostnameVerifier=examples.security.sslclient.

NulledHostnameVerifier

  NulledHostnameVerifier는 WLS의 예제에 포함되어 있습니다.



CERT_CHAIN_UNTRUSTED

클라이언트쪽

<23 dec. 2003 15 h 26 CET> <Warning> <Security> <BEA-090542> <Certificate chain
received from localhost - 127.0.0.1 was not trusted causing SSL handshake failure. Check the certificate chain to determine if it should be trusted or not. If it should be trusted, then update the client trusted CA configuration to trust the CA certificate that signed the peer certificate chain. If you are connecting to a WLS server that is using demo certificates (the default WLS server behavior), and you want this client to trust demo certificates, then specify -Dweblogic.security.TrustKeyStore=DemoTrust on the command line for this client.>
<23 dUc. 2003 15 h 31 CET> <Debug> <TLS> <000000> <Validation error = 16>

<23 dUc. 2003 15 h 31 CET> <Debug> <TLS> <000000> <Certificate chain is untrusted>

<23 dUc. 2003 15 h 31 CET> <Debug> <TLS> <000000> <SSLTrustValidator returns: 16>

<23 dUc. 2003 15 h 31 CET> <Debug> <TLS> <000000> <Trust status (16):   CERT_CHAIN_UNTRUSTED>


해결 방법
서버에서 보내는 체인을 클라이언트에서 신뢰하지 않습니다. 이 경우

-Dweblogic.security.TrustKeyStore=CustomTrust
-Dweblogic.security.CustomTrustKeyStoreFileName=<yourkeystore>

서버에서 보내는 모든 신뢰할 수 있는 CA(공개 키의 CA)를 함께 추가합니다.

또는

-Dweblogic.security.SSL.trustedCAKeyStore=<your keystore>

SSL 핸드셰이크를 시도하기 전에 클라이언트(또는 서버가 SSL 클라이언트로 동작하는 경우의 서버)는 부팅 시에 로드한 신뢰할 수 있는 인증서를 로그에 표시합니다. 이 로그는 다음과 같습니다.


<Mar 22, 2004 11:54:43 AM EST> <Debug> <TLS> <000000> <SSLManager, getting trusted CAs from default key store: /web/bea/weblogic700/server/lib/cacerts>
<Mar 22, 2004 11:54:43 AM EST> <Debug> <TLS> <000000> <Trusted CA: Serial number: 69042098805081595651034369680212310004

Issuer:C=US, ST=MyState, L=MyTown, O=MyOrganization, OU=FOR TESTING ONLY, CN=CACERT
Subject:C=US, ST=MyState, L=MyTown, O=MyOrganization, OU=FOR TESTING ONLY, CN=CACERT
Not Valid Before:Thu Mar 21 15:12:27 EST 2002
Not Valid After:Tue Mar 22 15:12:27 EST 2022
Signature Algorithm:MD5withRSA
>
<Mar 22, 2004 11:54:43 AM EST> <Debug> <TLS> <000000> <Trusted CA: Serial number: 46914133237969612308202465797198785159
Issuer:C=US, ST=MyState, L=MyTown, O=MyOrganization, OU=FOR TESTING ONLY, CN=CertGenCAB
Subject:C=US, ST=MyState, L=MyTown, O=MyOrganization, OU=FOR TESTING ONLY, CN=CertGenCAB
Not Valid Before:Thu Oct 24 11:54:45 EDT 2002
Not Valid After:Tue Oct 25 11:54:45 EDT 2022
Signature Algorithm:MD5withRSA
>
<Mar 22, 2004 11:54:43 AM EST> <Debug> <TLS> <000000> <Trusted CA: Serial number: 11374952449

Issuer:C=US, O=VeriSign, Inc., OU=Class 4 Public Primary Certification Authority
Subject:C=US, O=VeriSign, Inc., OU=Class 4 Public Primary Certification Authority
Not Valid Before:Sun Jan 28 19:00:00 EST 1996

Not Valid After:Fri Dec 31 18:59:59 EST 1999
Signature Algorithm:MD2withRSA


SSL 핸드셰이크 동안 서버에서 인증서를 보내는 경우 로그는 다음과 같습니다.

<Mar 22, 2004 11:54:43 AM EST> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: ServerHello>
<Mar 22, 2004 11:54:43 AM EST> <Debug> <TLS> <000000> <HANDSHAKEMESSAGE: Certificate>
<Mar 22, 2004 11:54:43 AM EST> <Debug> <TLS> <000000> <Performing hostname validation checks: secure.authorize.net>
<Mar 22, 2004 11:54:44 AM EST> <Debug> <TLS> <000000> <validationCallback: validateErr = 0>
<Mar 22, 2004 11:54:44 AM EST> <Debug> <TLS> <000000> <  cert[0] = Serial number: 61240024771365919750260051707246880350
Issuer:O=VeriSign Trust Network, OU=VeriSign, Inc., OU=VeriSign International Server CA - Class 3, OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
Subject:C=US, ST=Washington, L=Bellevue, O=InfoSpace, OU=Authorize.Net, OU=Terms of use at www.verisign.com/RPA (c)01, CN=secure.authorize.net
Not Valid Before:Mon Apr 21 20:00:00 EDT 2003
Not Valid After:Thu Apr 21 19:59:59 EDT 2005
Signature Algorithm:MD5withRSA
>
<Mar 22, 2004 11:54:44 AM EST> <Debug> <TLS> <000000> <  cert[1] = Serial number: 49573667635714834907930444256359116452
Issuer:C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
Subject:O=VeriSign Trust Network, OU=VeriSign, Inc., OU=VeriSign International Server CA - Class 3, OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
Not Valid Before:Wed Apr 16 20:00:00 EDT 1997
Not Valid After:Mon Oct 24 19:59:59 EDT 2011
Signature Algorithm:SHAwithRSA
>
<Mar 22, 2004 11:54:44 AM EST> <Debug> <TLS> <000000> <  cert[2] = Serial number: 149843929435818692848040365716851702463
Issuer:C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
Subject:C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
Not Valid Before:Sun Jan 28 19:00:00 EST 1996
Not Valid After:Tue Aug 01 19:59:59 EDT 2028
Signature Algorithm:MD2withRSA

두 목록을 비교하여 누락된 인증서와 누락된 원인을 파악하십시오. 다음은 몇 가지 예상되는 경우입니다.

  • 인증서를 신뢰할 수 있지만 만료되었습니다.
  • 클라이언트에서 cacerts 인증서를 로드하지 않습니다.
  • 서버에서 자체 서명 인증서를 사용하는 경우 클라이언트가 신뢰하도록 구성해야 합니다.



BAD_CERTIFICATE(서명이 잘못되어 SSL 핸드셰이크 오류 발생)

클라이언트쪽

<23 dUc. 2003 15 h 36 CET> <Debug> <TLS> <000000> <Alert received from peer, notifying peer we received it: com.certicom.tls.record.alert.Alert@1b34126>
<23 dUc. 2003 15 h 36 CET> <Warning> <Security> <BEA-090482> <BAD_CERTIFICATE alert was received from localhost - 127.0.0.1. Check the peer to determine why it rejected the certificate chain (trusted CA configuration, hostname verification). SSL debug tracing may be required to determine the exact reason the certificate was rejected.>
<23 dUc. 2003 15 h 36 CET> <Debug> <TLS> <000000> <close(): 6386542>
[Security:090482]BAD_CERTIFICATE alert was received from localhost - 127.0.0.1.Check the peer to determine why it rejected the certificate chain (trusted CA configuration, hostname verification). SSL debug tracing may be required to determ
ine the exact reason the certificate was rejected.javax.net.ssl.SSLKeyException: [Security:090482]BAD_CERTIFICATE alert was received from localhost - 127.0.0.1. Check the peer to determine why it rejected the certificate chain (trusted CA c
onfiguration, hostname verification). SSL debug tracing may be required to determine the exact reason the certificate was rejected.

서버쪽

<23 dUc. 2003 15 h 38 CET> <Warning> <Security> <BEA-090478> <Certificate chain received from 127.0.0.1 - 127.0.0.1 was not signed properly causing SSL handshake failure.>


해결 방법
서버로 전달되는 CA 인증서가 체인에 대해 잘못된 순서로 표시될 수 있습니다. CA를 확인하고 공개 CA, 중간 CA, 루트 CA와 같은 순서인지 확인합니다.



CLOSE_NOTIFY

CLOSE_NOTIFY에 대한 경고는 정상적으로 발생할 수 있으므로 추적 기능은 이 경고를 특별하게 취급하지 않습니다. ALERT 심각도 1 유형은 연결이 종료되었음을 나타냅니다. 그러나 핸드셰이크 완료를 나타내기 전에 모든 핸드셰이크 메시지를 확인하십시오. 다음은 예상되는 CLOSE_NOTIFY ALERT의 한 예입니다.


<Jun 18, 2002 7:15:27 AM EDT> <Debug> <TLS> <000000> <NEW ALERT: com.certicom.tls.record.alert.Alert@2241f8 Se
verity: 1 Type: 0
java.lang.Exception: Stack trace
at weblogic.security.utils.SSLSetup.debug(SSLSetup.java:290)
at com.certicom.tls.record.alert.Alert.<init>(Unknown Source)
at com.certicom.tls.interfaceimpl.TLSConnectionImpl.closeWriteHandler(Unknown Source)
at com.certicom.tls.interfaceimpl.TLSConnectionImpl.close(Unknown Source)
at javax.net.ssl.impl.SSLSocketImpl.close(Unknown Source)
at weblogic.socket.NTSocketMuxer.cleanup(NTSocketMuxer.java:500)
at weblogic.rjvm.t3.T3JVMConnection.close(T3JVMConnection.java:692)
at weblogic.rjvm.ConnectionManager.removeConnection(ConnectionManager.java:982)
at weblogic.rjvm.ConnectionManager.shutdown(ConnectionManager.java:573)
at weblogic.rjvm.ConnectionManagerServer.shutdown(ConnectionManagerServer.java:527)
at weblogic.rjvm.RJVMImpl.peerGone(RJVMImpl.java:937)
at weblogic.rjvm.RJVMImpl.gotExceptionReceiving(RJVMImpl.java:615)
at weblogic.rjvm.ConnectionManager.gotExceptionReceiving(ConnectionManager.java:826)
at weblogic.rjvm.t3.T3JVMConnection.hasException(T3JVMConnection.java:634)
at weblogic.socket.SSLFilter.hasException(SSLFilter.java:302)
at weblogic.socket.NTSocketMuxer.processSockets(NTSocketMuxer.java:537)
at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:23)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:141)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:122



HANDSHAKE_FAILURE
이 오류는 WebLogic 서버가 원격 Microsoft 서버에 연결할 때 발생할 수 있습니다.

서버쪽

####<18.feb.2004 kl 16.09 CET> <Debug> <TLS> <zkb1b74v> <raitnow-server> <ExecuteThread: '14' for queue: 'weblogic.kernel.Default'> <system> <> <000000> <26572483 received ALERT>
####<18.feb.2004 kl 16.09 CET> <Debug> <TLS> <zkb1b74v> <raitnow-server> <ExecuteThread: '14' for queue: 'weblogic.kernel.Default'> <system> <> <000000> <NEW ALERT: com.certicom.tls.record.alert.Alert@75ca3e Severity: 2 Type: 40
java.lang.Throwable: Stack trace
at weblogic.security.utils.SSLSetup.debug(SSLSetup.java:265)
at com.certicom.tls.record.alert.Alert.<init>(Unknown Source)
at com.certicom.tls.record.alert.AlertHandler.handleAlertMessages(Unknown Source)
at com.certicom.tls.record.ReadHandler.interpretContent(Unknown Source)
at com.certicom.tls.record.ReadHandler.readRecord(Unknown Source)
at com.certicom.tls.record.ReadHandler.readUntilHandshakeComplete(Unknown Source)
at com.certicom.tls.interfaceimpl.TLSConnectionImpl.completeHandshake(Unknown Source)
at com.certicom.tls.record.WriteHandler.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:69)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:127)
at java.io.FilterOutputStream.flush(FilterOutputStream.java:123)
at weblogic.net.http.HttpURLConnection.writeRequests(HttpURLConnection.java:99)
at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:296)
at java.net.URLConnection.getContent(URLConnection.java:582)
at no.nordea.safe.raitnow.ejb.impl.HTTPSRAConnection.getConnectionReader(HTTPSRAConnection.java:73)
at no.nordea.safe.raitnow.ejb.impl.HTTPRARequester.retrieveResponse(HTTPRARequester.java:211)
at no.nordea.safe.raitnow.ejb.impl.HTTPRARequester.sendRequest(HTTPRARequester.java:138)
at no.nordea.safe.raitnow.ejb.impl.CastorRADataTransformer.order(CastorRADataTransformer.java:199)
at no.nordea.safe.raitnow.ejb.EndUserRegistrationAuthorityBean.order(EndUserRegistrationAuthorityBean.java:98)
at no.nordea.safe.raitnow.ejb.EndUserRegistrationAuthorityBean_mzdjm5_EOImpl.order(EndUserRegistration
AuthorityBean_mzdjm5_EOImpl.java:532)
at no.nordea.safe.raitnow.ejb.EndUserRegistrationAuthorityBean_mzdjm5_EOImpl_WLSkel.invoke(Unknown Source)
at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:477)
at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerRef.java:108)
at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:420)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)
at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:415)
at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
>
####<18.feb.2004 kl 16.09 CET> <Debug> <TLS> <zkb1b74v> <raitnow-server> <ExecuteThread: '14' for queue: 'weblogic.kernel.Default'> <system> <> <000000> <Alert received from peer, notifying peer we received it: com.certicom.tls.record.alert.Alert@75ca3e>
####<18.feb.2004 kl 16.09 CET> <Warning> <Security> <zkb1b74v> <raitnow-server> <ExecuteThread: '14' for queue: 'weblogic.kernel.Default'> <system> <> <BEA-090497> <HANDSHAKE_FAILURE alert received from 193.214.20.203 - 193.214.20.203. Check both sides of the SSL configuration for mismatches in supported ciphers, supported protocol versions, trusted CAs, and hostname verification
settings.>

'프로그래밍 > java' 카테고리의 다른 글

자바 날짜 가져오기..  (0) 2009.02.18
[ "==" 과 "equals()" 의 차이점]  (0) 2008.12.09
자바 정규식  (0) 2008.08.27
자바보안과 암호화  (0) 2007.10.17
난수발생  (0) 2007.09.06