Translate

2018년 12월 18일 화요일

[WebLogic] CVE-2017-10271 취약점 패치방법










KISA에 WebLogic 원격실행이 가능한 보안취약점 업데이트 권고 공지가 있다.
(https://www.boho.or.kr/data/secNoticeView.do?bulletin_writing_sequence=26948)



취약한 WebLogic 버전
 - 10.3.3.0
 - 10.3.6 0
 - 12.2.1.1
 - 12.2.1.2
 - 12.1.3.0



취약점 설명
Oracle WebLogic Server WLS Security 구성 요소에서 부적절한 사용자 입력 값 처리로 인해 인증되지 않은 공격자가 WebLogic의 권한으로 원격 코드 실행이 가능한 취약점(CVE-2017-10271)


아래와 같이 http://{host}/wls-wsat/CoordinatorPortType URL을 이용하여 원격코드를 실행하는 요청을 보낼 수 있다.
(원격코드를 실행하여 암호화폐 채굴프로그램을 실행하는 이슈가 있다고 한다.)







패치방법
(아래의 방법중 편한 방법을 골라서 사용하면 된다. 3번이 가장 쉬움)

1. wls-wsat 컴포넌트 URL 웹방화벽 차단
 - /wls-wsat/*



2. wls-wsat 컴포넌트 삭제
# 아래와 같이 wls-wsat 컴포넌트 검색
1004lucifer@WAS01:/app>$ find /app/wls1036 -name *wls-wsat*
/app/wls1036/wlserver_10.3/server/lib/wls-wsat.war
/app/wls1036/domains/domain/servers/portal/tmp/_WL_internal/wls-wsat
/app/wls1036/domains/domain/servers/portal/tmp/.internal/wls-wsat.war
/app/wls1036/domains/domain/servers/admin/tmp/_WL_internal/wls-wsat
/app/wls1036/domains/domain/servers/admin/tmp/.internal/wls-wsat.war
1004lucifer@WAS01:/app>$
1004lucifer@WAS01:/app>$
# 검색결과의 wls-wsat 컴포넌트 삭제
1004lucifer@WAS01:/app>$ rm -rf /app/wls1036/wlserver_10.3/server/lib/wls-wsat.war
1004lucifer@WAS01:/app>$ rm -rf /app/wls1036/domains/domain/servers/portal/tmp/_WL_internal/wls-wsat
1004lucifer@WAS01:/app>$ rm -rf /app/wls1036/domains/domain/servers/portal/tmp/.internal/wls-wsat.war
1004lucifer@WAS01:/app>$ rm -rf /app/wls1036/domains/domain/servers/admin/tmp/_WL_internal/wls-wsat
1004lucifer@WAS01:/app>$ rm -rf /app/wls1036/domains/domain/servers/admin/tmp/.internal/wls-wsat.war
1004lucifer@WAS01:/app>$


1004lucifer
3. wls-wsat 컴포넌트 비활성화 옵션 추가
-Dweblogic.wsee.wstx.wsat.deployed=false
# setDomainEnv.sh 파일을 설정하거나 본인이 알고있다면 다른 쉘스크립트를 수정해도 된다.
$DOMAIN_HOME/bin/setDomainEnv.sh 파일 수정
1004lucifer@WAS01:/app/wls1036/domains/domain/bin>$ vi setDomainEnv.sh

... (생략)
JAVA_PROPERTIES="${JAVA_PROPERTIES} ${WLP_JAVA_PROPERTIES}"
export JAVA_PROPERTIES

JAVA_OPTIONS="${JAVA_OPTIONS} ${JAVA_PROPERTIES} -Dwlw.iterativeDev=${iterativeDevFlag} -Dwlw.testConsole=${testConsoleFlag} -Dwlw.logErrorsToConsole=${logErrorsToConsoleFlag}"
JAVA_OPTIONS="-Dweblogic.wsee.wstx.wsat.deployed=false ${JAVA_OPTIONS}"
export JAVA_OPTIONS
... (생략)

1004lucifer@WAS01:/app/wls1036/domains/domain/bin>$



4. patch v171017 이상 버전의 패치로 업데이트 한다.
(10.3.5이하는 10.3.6으로 업데이트 후 패치)
 - 링크: 웹로직 Patch 설치/제거/확인 방법 (BSU 이용)

(아래의 패치링크는 Oracle 계약이 되어있는계정만 내용이 보여지며 일반 개인계정은 내용을 볼수 없다.)
Product Home
Patch
Advisory Number
Comments
WebLogic Server 12.2.1.2 home
WLS PSU 12.2.1.2.171017 Patch 26485996
CVE-2017-10271, CVE-2017-10336, CVE-2017-10352, CVE-2017-10334
Fix for CVE-2017-5638 and CVE-2017-9805 is not included in the WLS PSU patches. See Note 2255054.1, "Oracle WebLogic Server Requirements for Apache Struts 2 and CVE-2017-5638 / CVE-2017-9805"
WebLogic Server 12.2.1.1 home
WLS PSU 12.2.1.1.171017 Patch 26519400
CVE-2017-10271, CVE-2017-10336, CVE-2017-10352, CVE-2017-10334
Fix for CVE-2017-5638 and CVE-2017-9805 is not included in the WLS PSU patches. See Note 2255054.1, "Oracle WebLogic Server Requirements for Apache Struts 2 and CVE-2017-5638 / CVE-2017-9805"
WebLogic Server 12.1.3.0 home
WLS PSU 12.1.3.0.171017 Patch 26519417
CVE-2017-10271, CVE-2017-10336, CVE-2017-10152, CVE-2017-10352, CVE-2017-10334
Fix for CVE-2017-5638 and CVE-2017-9805 is not included in the WLS PSU patches. See Note 2255054.1, "Oracle WebLogic Server Requirements for Apache Struts 2 and CVE-2017-5638 / CVE-2017-9805"
WebLogic Server 10.3.6.0 home
WLS PSU 10.3.6.0.171017 Patch 26519424
CVE-2017-10271, CVE-2017-10336, CVE-2017-10152, CVE-2017-10352, CVE-2017-10334
See Note 1607170.1, SSL Authentication Problem Using WebLogic 10.3.6 and 12.1.1 With JDK1.7.0_40 or Higher
Fix for CVE-2017-5638 is not included in the WLS PSU patches. See Note 2255054.1, "Upgrade Apache Struts 2 to Version 2.3.32 for WebLogic Code Example"


10.3.6은 아래 이미지의 Patch ID로 확인해도 좋다.
(빨간 네모박스의 Patch ID 적용하면 취약점 패치가 된다.)





검증

조치 후 WebLogic 재기동 후 wls-wsat URL 접속하여 페이지가 나오지 않는것을 확인한다.
http://{host}/wls-wsat/CoordinatorPortType




참고
http://genes1s.egloos.com/3079282
http://securityse.tistory.com/88
https://community.oracle.com/thread/4091882
https://support.oracle.com/knowledge/Middleware/1523009_1.html

2018년 11월 29일 목요일

[Chrome] ERR_SSL_PROTOCOL_ERROR 이슈 원인 및 해결방법






증상

 - 크롬을 이용해 SSL/TLS(https) 프로토콜 접속 시 아래와 같은 에러가 발생한다.


 {도메인}에서 잘못된 응답을 전송했습니다.
 Windows 네트워크 진단 프로그램을 실행해 보세요.

 ERR_SSL_PROTOCOL_ERROR










원인

1. 서버(WAS)에서 낮은 버전의 SSL을 사용하는 경우
1004lucifer
2. 서버(WAS)에서 응답한 Cipher Suites를 브라우저(Chrome)에서 처리 할 수 없는경우
  ( 링크 - Cipher Suites란 무엇일까? )







해결방법

1. 서버가 낮은 버전의 프로토콜을 사용하는 경우
  - 브라우저에서 낮은 버전의 프로토콜을 사용 가능하도록 옵션을 변경해 준다.
  (크롬과 IE는 같은 인터넷 옵션을 사용한다.)





2. 서버에서 응답한 Cipher Suites를 브라우저(Chrome)에서 처리할 수 없는경우

 1) IE, Edge, FireFox, Opera 등등 다른 브라우저를 사용해본다.
  - 브라우저마다 처리할 수 있는 Cipher Suites 종류가 다르다. (상세내용링크)
  - 이것마저 안되면 브라우저 사용자가 더이상 할 수 있는건 없다.
1004lucifer
 2) 서버관리자가 수정 할 수 있는 방법
  - 최신 프로토콜(TLS)을 사용할 수 있도록 WAS를 업그레이드 하거나 설정한다.
  - 대부분의 브라우저에서 지원하는 Cipher Suites를 사용하도록 셋팅한다. (상세내용링크)

2018년 11월 24일 토요일

[WebLogic] 웹로직 Patch 설치/제거/확인 방법 (BSU 이용)










BSU(BEA Smart Update)를 통해 웹로직 패치하는 방법은 아래와 같다.

 - 패치 파일은 p{patch_number}_{version}_Generic.zip 형식으로 되어있는데 개인 계정으로는 Oracle에서 다운받을 수 없으며, 라이센스 맺은 계정으로 로그인 해야만 다운로드가 가능하다.
 - 가능하다면 다른 서버에 있는 pacth (zip)파일을 가져오는게 시간적으로 간편하다.





실습환경
 - OS: OracleLinux 5
 - WebLogic ver: 10.3.6



선작업
 - patch 파일을 $BEA_HOME/utils/bsu/cache_dir 디렉토리에 압축을 푼다.


# 실습환경 웹로직 관련 홈디렉토리 경로
# $BEA_HOME(웹로직 설치디렉토리): /app/weblogic1036/
# $WL_HOME(웹로직 구성요소 디렉토리): /app/weblogic1036/wlserver_10.3/

[weblogic@ae2793daea03 ~]$
[weblogic@ae2793daea03 ~]$ ll
total 1203620
drwxrwxr-x 2 weblogic weblogic       4096 Aug  5 10:22 bea
-rwxr-xr-x 1 weblogic weblogic   72087592 Aug  5 10:08 jdk-6u45-linux-x64.bin
-rw-r--r-- 1 weblogic weblogic   91900574 Nov 24 06:35 p24667634_1036_Generic.zip
-rwxr-xr-x 1 weblogic weblogic 1068506707 Aug  5 09:40 wls1036_generic.jar
[weblogic@ae2793daea03 ~]$
[weblogic@ae2793daea03 ~]$
[weblogic@ae2793daea03 ~]$ unzip -d /app/weblogic1036/utils/bsu/cache_dir p24667634_1036_Generic.zip
Archive:  p24667634_1036_Generic.zip
  inflating: /app/weblogic1036/utils/bsu/cache_dir/patch-catalog_24721.xml
  inflating: /app/weblogic1036/utils/bsu/cache_dir/README.txt
  inflating: /app/weblogic1036/utils/bsu/cache_dir/XIDD.jar
[weblogic@ae2793daea03 ~]$






Patch Install
 - 기존 패치가 되어있는 상황이라면 패치를 제거 후 작업한다.


# bsu 디렉토리로 이동
[weblogic@ae2793daea03 ~]$ cd /app/weblogic1036/utils/bsu/
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
# Patch ID 확인 (현재 XIDD)
[weblogic@ae2793daea03 bsu]$ ll cache_dir/
total 138732
-rw-rw-r-- 1 weblogic weblogic     7035 Nov 29  2016 README.txt
-rw-rw-r-- 1 weblogic weblogic 88192621 Nov 25  2016 XIDD.jar
-rw-rw-r-- 1 weblogic weblogic 53854293 Nov 25  2016 patch-catalog_24721.xml
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
# 그냥 실행하면 아래와 같이 에러날 확률이 높음
[weblogic@ae2793daea03 bsu]$ ./bsu.sh -install -patchlist=XIDD -prod_dir=/app/weblogic1036/wlserver_10.3
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2436)
        at java.lang.Class.getMethod0(Class.java:2679)
        at java.lang.Class.getMethod0(Class.java:2688)
        at java.lang.Class.getMethod0(Class.java:2688)
        at java.lang.Class.getMethod(Class.java:1605)
        at com.bea.cie.common.dao.xbean.XBeanDataHandler.isValueSet(XBeanDataHandler.java:958)
        at com.bea.cie.common.dao.xbean.XBeanDataHandler.getValueFromObject(XBeanDataHandler.java:589)
        at com.bea.cie.common.dao.xbean.XBeanDataHandler.getSimpleValue(XBeanDataHandler.java:431)
        at com.bea.plateng.patch.dao.cat.PatchDependency.getRule(PatchDependency.java:48)
        at com.bea.plateng.patch.dao.cat.PatchCatalogHelper.getInvalidatedPatchMap(PatchCatalogHelper.java:1625)
        at com.bea.plateng.patch.PatchSystem.updatePatchCatalog(PatchSystem.java:436)
        at com.bea.plateng.patch.PatchSystem.refresh(PatchSystem.java:130)
        at com.bea.plateng.patch.PatchSystem.<init>(PatchSystem.java:114)
        at com.bea.plateng.patch.PatchSystem.<clinit>(PatchSystem.java:41)
        at com.bea.plateng.patch.Patch.main(Patch.java:279)
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Could not initialize class com.bea.plateng.patch.PatchSystem
        at com.bea.plateng.patch.PatchClientHelper.getAllPatchDetails(PatchClientHelper.java:74)
        at com.bea.plateng.patch.PatchInstallationHelper.cleanupPatchSets(PatchInstallationHelper.java:130)
        at com.bea.plateng.patch.PatchTarget.<init>(PatchTarget.java:272)
        at com.bea.plateng.patch.PatchTargetFactory.create(PatchTargetFactory.java:30)
        at com.bea.plateng.patch.ProductAliasTarget.constructPatchTargetList(ProductAliasTarget.java:88)
        at com.bea.plateng.patch.ProductAliasTarget.<init>(ProductAliasTarget.java:46)
        at com.bea.plateng.patch.ProductAliasTargetHelper.getProdAliasTargetList(ProductAliasTargetHelper.java:55)
        at com.bea.plateng.patch.ProductAliasTargetHelper.getAllHomeToProdAliasesTargetMap(ProductAliasTargetHelper.java:32)
        at com.bea.plateng.patch.ProductAliasTargetHelper.checkProfilesInProductAliases(ProductAliasTargetHelper.java:133)
        at com.bea.plateng.patch.Patch$1.run(Patch.java:376)
        at java.lang.Thread.run(Thread.java:662)
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
# bsu.sh 파일에서 힙메모리를 높게 설정해준다.
[weblogic@ae2793daea03 bsu]$ vi bsu.sh
#!/bin/sh

JAVA_HOME="/app/jdk1.6.0_45"

MEM_ARGS="-Xms2560m -Xmx5120m"

"$JAVA_HOME/bin/java" ${MEM_ARGS} -jar patch-client.jar $*
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
[weblogic@ae2793daea03 bsu]$
# 다시 패치 인스톨 명령어 수행 시 정상적으로 수행됨.
# 시간이 오래 걸리나 top 명령어로 확인 시 프로세스가 수행되는것을 알 수 있다.
[weblogic@ae2793daea03 bsu]$ ./bsu.sh -install -patchlist=XIDD -prod_dir=/app/weblogic1036/wlserver_10.3
Checking for conflicts..........
No conflict(s) detected
1004lucifer
Installing Patch ID: XIDD..
Result: Success

./bsu.sh: line 7:   127 Killed                  "$JAVA_HOME/bin/java" ${MEM_ARGS} -jar patch-client.jar $*
[weblogic@ae2793daea03 bsu]$






Patch Check
1004lucifer

# patch 적용 전
[weblogic@ae2793daea03 bsu]$ ./bsu.sh -view -status=applied -prod_dir=/app/weblogic1036/wlserver_10.3
ProductName:       WebLogic Server
ProductVersion:    10.3 MP6
Components:        WebLogic Server/Core Application Server,WebLogic Server/Admi
                   nistration Console,WebLogic Server/Configuration Wizard and
                   Upgrade Framework,WebLogic Server/Web 2.0 HTTP Pub-Sub Serve
                   r,WebLogic Server/WebLogic SCA,WebLogic Server/WebLogic JDBC
                    Drivers,WebLogic Server/Third Party JDBC Drivers,WebLogic S
                   erver/WebLogic Server Clients,WebLogic Server/WebLogic Web S
                   erver Plugins,WebLogic Server/UDDI and Xquery Support,WebLog
                   ic Server/Evaluation Database,WebLogic Server/Workshop Code
                   Completion Support
BEAHome:           /app/weblogic1036
ProductHome:       /app/weblogic1036/wlserver_10.3
PatchSystemDir:    /app/weblogic1036/utils/bsu
PatchDir:          /app/weblogic1036/patch_wls1036
Profile:           Default
DownloadDir:       /app/weblogic1036/utils/bsu/cache_dir
JavaVersion:       1.6.0_29
JavaVendor:        Sun


[weblogic@ae2793daea03 bsu]$
# patch 적용 후
[weblogic@ae2793daea03 bsu]$ ./bsu.sh -view -status=applied -prod_dir=/app/weblogic1036/wlserver_10.3
ProductName:       WebLogic Server
ProductVersion:    10.3 MP6
Components:        WebLogic Server/Core Application Server,WebLogic Server/Admi
                   nistration Console,WebLogic Server/Configuration Wizard and
                   Upgrade Framework,WebLogic Server/Web 2.0 HTTP Pub-Sub Serve
                   r,WebLogic Server/WebLogic SCA,WebLogic Server/WebLogic JDBC
                    Drivers,WebLogic Server/Third Party JDBC Drivers,WebLogic S
                   erver/WebLogic Server Clients,WebLogic Server/WebLogic Web S
                   erver Plugins,WebLogic Server/UDDI and Xquery Support,WebLog
                   ic Server/Evaluation Database,WebLogic Server/Workshop Code
                   Completion Support
BEAHome:           /app/weblogic1036
ProductHome:       /app/weblogic1036/wlserver_10.3
PatchSystemDir:    /app/weblogic1036/utils/bsu
PatchDir:          /app/weblogic1036/patch_wls1036
Profile:           Default
DownloadDir:       /app/weblogic1036/utils/bsu/cache_dir
JavaVersion:       1.6.0_29
JavaVendor:        Sun


Patch ID:          XIDD (24667634)

[weblogic@ae2793daea03 bsu]$






Patch Remove


[weblogic@ae2793daea03 bsu]$ ./bsu.sh -remove -patchlist=XIDD -prod_dir=/app/weblogic1036/wlserver_10.3
Checking for conflicts.........
No conflict(s) detected

Removing Patch ID: XIDD..
Result: Success

[weblogic@ae2793daea03 bsu]$



[Firefox] SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY 이슈 원인 및 해결방법






증상

 - 파이어폭스를 이용해 SSL/TLS(https) 프로토콜 접속 시 아래와 같은 에러가 발생한다.


 {_Domain_}에 접속하는 중에 오류가 발생했습니다. SSL에서 서버키 메시지 교환 도중 약한 Diffie-Hellman키를 받았습니다. (오류 코드: ssl_error_weak_server_ephemeral_dh_key)









원인

1. 서버(WAS)에서 https 통신 시 취약한 키교환방식(Diffie-Hellman)을 이용한 Cipher Suite 를 사용한 경우
  ( 링크 - Cipher Suites란 무엇일까? )







해결방법

1. 취약한 키교환방식을 허용하도록 설정변경
  - 브라우저에서 취약한 키교환방식을 허용하도록 설정을 변경한다.
  (추후 설정을 원래대로 돌려놓는 것을 권장)
1004lucifer




2. 서버관리자 - 서버(WAS)에서 보안에 강력한 Cipher Suites를 사용하도록 설정
  - 링크: 상세내용보기
  1) WAS를 (강력한 Cipher Suites를 사용하는)버전으로 업그레이드
  2) WAS에 보안에 강력한 Cipher Suites를 강제지정 셋팅
    - 키교환방식에 DHE가 들어가는 Cipher Suites를 제외


[Firefox] SSL_ERROR_NO_CYPHER_OVERLAP 이슈 원인 및 해결방법






증상

 - 파이어폭스를 이용해 SSL/TLS(https) 프로토콜 접속 시 아래와 같은 에러가 발생한다.


 {_Domain_}에 접속하는 중에 오류가 발생했습니다. 상대방과 안전하게 통신 할 수 없음: 일반 암호화 알고리듬이 없습니다. (오류 코드: ssl_error_no_cypher_overlap)









원인

1. 서버(WAS)에서 낮은 버전의 SSL을 사용하는 경우
1004lucifer
2. 서버(WAS)에서 응답한 Cipher Suites를 브라우저(Firefox)에서 처리 할 수 없는경우
  ( 링크 - Cipher Suites란 무엇일까? )







해결방법

1. 서버가 낮은 버전의 프로토콜을 사용하는 경우
  - 브라우저에서 낮은 버전의 프로토콜(SSL 3.0)을 사용 가능하도록 옵션을 변경해 준다.
  (모질라사이트 상세내용 링크)





2. 서버에서 응답한 Cipher Suites를 브라우저(Firefox)에서 처리할 수 없는경우

 1) IE, Edge, Chrome, Opera 등등 다른 브라우저를 사용해본다.
  - 브라우저마다 처리할 수 있는 Cipher Suites 종류가 다르다. (상세내용링크)
  - 이것마저 안되면 브라우저 사용자가 더이상 할 수 있는건 없다.
1004lucifer
 2) 서버관리자가 수정 할 수 있는 방법
  - 최신 프로토콜(TLS)을 사용할 수 있도록 WAS를 업그레이드 하거나 설정한다.
  - 대부분의 브라우저에서 지원하는 Cipher Suites를 사용하도록 셋팅한다. (상세내용링크)



참고
 - http://kb.mozillazine.org/Security.tls.version.*
 - http://kb.mozillazine.org/About:config

2018년 11월 23일 금요일

[Chrome] ERR_SSL_VERSION_OR_CIPHER_MISMATCH 이슈 원인 및 해결방법






증상

 - 크롬을 이용해 SSL/TLS(https) 프로토콜 접속 시 아래와 같은 에러가 발생한다.


 ERR_SSL_VERSION_OR_CIPHER_MISMATCH

 지원되지 않는 프로토콜
 클라이언트와 서버가 일반적인 SSL 프로토콜 버전 또는 암호화 제품군을 지원하지 않습니다.










원인

1. 서버(WAS)에서 낮은 버전의 SSL을 사용하는 경우
1004lucifer
2. 서버(WAS)에서 응답한 Cipher Suites를 브라우저(Chrome)에서 처리 할 수 없는경우
  ( 링크 - Cipher Suites란 무엇일까? )







해결방법

1. 서버가 낮은 버전의 프로토콜을 사용하는 경우
  - 브라우저에서 낮은 버전의 프로토콜을 사용 가능하도록 옵션을 변경해 준다.
  (크롬과 IE는 같은 인터넷 옵션을 사용한다.)





2. 서버에서 응답한 Cipher Suites를 브라우저(Chrome)에서 처리할 수 없는경우

 1) IE, Edge, FireFox, Opera 등등 다른 브라우저를 사용해본다.
  - 브라우저마다 처리할 수 있는 Cipher Suites 종류가 다르다. (상세내용링크)
  - 이것마저 안되면 브라우저 사용자가 더이상 할 수 있는건 없다.
1004lucifer
 2) 서버관리자가 수정 할 수 있는 방법
  - 최신 프로토콜(TLS)을 사용할 수 있도록 WAS를 업그레이드 하거나 설정한다.
  - 대부분의 브라우저에서 지원하는 Cipher Suites를 사용하도록 셋팅한다. (상세내용링크)


2018년 11월 21일 수요일

[Java][WAS] 특정 브라우저에서 HTTPS 접속 시 화면이 보이지 않는경우 (Cipher Suites 이슈)




PS.
WebLogic 10.3.6 사용중 해당 이슈로 Cipher Suites 강제지정 했었는데, BSU(BEA Smart Update)로 WebLogic Patch 후 Cipher Suites를 강제지정하지 않더라도 WebLogic이 Diffie-Hellman을 사용하지 않아 문제가 사라졌다.



증상

1. 특정 브라우저만 https 접속 시 정상적으로 보이지 않는다.
1004lucifer
2. 같은 브라우저인데 특정 PC에서만 https 접속 시 정상적으로 보이지 않는다. 
  (링크 - GPKI적용 2년차, 일부PC에서 https 접속이 안됩니다. 제발 도와주세요.)

3. Chrome 또는 Firefox 에서 아래와 같은 문자열이 보인다.
  - ERR_SSL_PROTOCOL_ERROR
  - ERR_SSL_VERSION_OR_CIPHER_MISMATCH
  - SSL_ERROR_NO_CYPHER_OVERLAP
  - SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY











PS. 원인을 보기에 앞서..
- SSL/TLS(https) 프로토콜 통신 시 내부 작동사항
  1) 브라우저는 서버(WAS)에 자기가(브라우저 스스로) 처리할 수 있는 암호화 알고리즘 리스트(Cipher Suites)를 서버에 전송한다.
  2) 서버는 해당 리스트중에서 (위에서부터)처리 가능한 암호화 알고리즘을 선택 후 브라우저에 답변한다.

링크 - [Java] SSL/TLS 디버깅 방법 및 로그분석
링크 - 알아두면 쓸데없는 신비한 TLS

원인

1. WAS에서 브라우저가 처리할 수 없는 암호화 알고리즘을 답변한경우
1004lucifer
2. WAS에서 정상적인 암호화 알고리즘을 답변했지만 해당 알고리즘의 보안이 취약하여 화면에 보여주지 않는경우
 - 이부분이 참 이해가지 않는게 브라우저가 처리가능한 알고리즘에 대해서 답변을 했는데 브라우저 스스로 처리 가능하다고 서버에 요청했던 알고리즘이 보안에 취약하니 보여주지 않는다는게 너무 어이가 없었다.



여기서 중요한 부분이 같은 브라우저라도 PC에 따라 서버에 올리는 Cipher Suites의 갯수와 순서가 아래와 같이 다르다.
(특히 IE11의 경우 Cipher Suites 갯수가 크게 차이난다.)

Windows 7 Enterprise K SP1 x64
1004lucifer
[IE 11.0.9600]
Cipher Suites:
[
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_RSA_WITH_AES_256_CBC_SHA,
    TLS_RSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
    SSL_RSA_WITH_3DES_EDE_CBC_SHA,
    SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
]

[Chrome 63.0.3239]
Cipher Suites:
[
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_RSA_WITH_AES_128_CBC_SHA,
    TLS_RSA_WITH_AES_256_CBC_SHA,
    SSL_RSA_WITH_3DES_EDE_CBC_SHA
]

[Firefox 39.0]
Cipher Suites:
[
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_RSA_WITH_AES_128_CBC_SHA,
    TLS_RSA_WITH_AES_256_CBC_SHA,
    SSL_RSA_WITH_3DES_EDE_CBC_SHA
]




Windows 10 Pro(ver. 1803) x64

[IE 11.407.17134]
Cipher Suites: 
[
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_RSA_WITH_AES_256_CBC_SHA,
    TLS_RSA_WITH_AES_128_CBC_SHA,
    SSL_RSA_WITH_3DES_EDE_CBC_SHA
]

[Chrome 70.0.3538]
Cipher Suites: 
[
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_RSA_WITH_AES_128_CBC_SHA,
    TLS_RSA_WITH_AES_256_CBC_SHA,
    SSL_RSA_WITH_3DES_EDE_CBC_SHA
]

[Firefox 63.0]
Cipher Suites: 
[
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_RSA_WITH_AES_128_CBC_SHA,
    TLS_RSA_WITH_AES_256_CBC_SHA,
    SSL_RSA_WITH_3DES_EDE_CBC_SHA
]






IE11이 WAS에 요청하는 Cipher Suites 가 PC마다 다를 때 나타나는 문제점


만일 WAS에서 처리 가능한 Cipher Suites가 아래와 같다고 해보자.
 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA
 - TLS_DHE_RSA_WITH_AES_256_CBC_SHA
 - TLS_RSA_WITH_AES_128_CBC_SHA
 - TLS_RSA_WITH_AES_256_CBC_SHA
 - SSL_RSA_WITH_3DES_EDE_CBC_SHA


그런 경우에 각 PC-브라우저에서 요청 후 WAS에서 받은 Cipher Suites는 아래와 같으며, 응답받은 Cipher Suites는 브라우저가 올린 Cipher Suites 순서와 상관이 있다.
 - Win7Ent-IE11: TLS_DHE_RSA_WITH_AES_256_CBC_SHA
 - Win10Pro-IE11: TLS_RSA_WITH_AES_256_CBC_SHA


이중에 Win7Ent-IE11 이 받은 DHE(Diffie-Hellman) 대칭키전달방식은 보안에 취약한 문제가 발견되었다.
Win10Pro에서는 정상적으로 화면을 보여주지만 Win7Ent는 화면에 아래의 캡쳐와 같이 보여주며 화면상으로 인터넷에 문제가 있는지 서버에 문제가 있는지 알수가 없다.






해결방안

1. WAS에서 SSL/TLS에서 사용할 Cipher Suites 를 강제로 지정한다.
 - 링크: WebLogic 10.3.6 에서 Cipher Suites 강제지정 방법
1004lucifer
2. 취약한 Cipher Suites를 사용하지 않는 WAS버전으로 업데이트를 하거나 패치를 한다.
 - 링크: 웹로직 Patch 설치/제거/확인 방법 (BSU 이용)


2018년 11월 19일 월요일

[Java][WAS] Cannot support {Cipher_Suite_Name} with currently installed providers 에러







증상

1. WAS와의 https 통신 시 오류나거나 브라우저에서 https 요청 시 화면이 보이지 않음.

2. WAS SSL Debug Mode로 로그 확인 시 아래와 같이 보여짐
  - WebLogic 기준이며 다른 WAS의 경우 로그 내용이 조금 다를 수 있음
  - 링크: Java SSL/TLS 디버깅 방법


adding as trusted cert:
  Subject: CN=SwissSign Platinum CA - G2, O=SwissSign AG, C=CH
  Issuer:  CN=SwissSign Platinum CA - G2, O=SwissSign AG, C=CH
  Algorithm: RSA; Serial number: 0x4eb200670c035d4f
  Valid from Wed Oct 25 17:36:00 KST 2006 until Sat Oct 25 17:36:00 KST 2036

adding as trusted cert:
  Subject: EMAILADDRESS=info@valicert.com, CN=http://www.valicert.com/, OU=ValiCert Class 1 Policy Validation Authority, O="ValiCert, Inc.", L=ValiCert Validation Network
  Issuer:  EMAILADDRESS=info@valicert.com, CN=http://www.valicert.com/, OU=ValiCert Class 1 Policy Validation Authority, O="ValiCert, Inc.", L=ValiCert Validation Network
  Algorithm: RSA; Serial number: 0x1
  Valid from Sat Jun 26 07:23:48 KST 1999 until Wed Jun 26 07:23:48 KST 2019

 ... (생략)
  
adding as trusted cert:
  Subject: CN=TC TrustCenter Class 2 CA II, OU=TC TrustCenter Class 2 CA, O=TC TrustCenter GmbH, C=DE
  Issuer:  CN=TC TrustCenter Class 2 CA II, OU=TC TrustCenter Class 2 CA, O=TC TrustCenter GmbH, C=DE
  Algorithm: RSA; Serial number: 0x2e6a000100021fd752212c115c3b
  Valid from Thu Jan 12 23:38:43 KST 2006 until Thu Jan 01 07:59:59 KST 2026

***
found key for : -1303753
chain [0] = [
[
  Version: V3
  Subject: CN=1004lucifer.co.kr, OU=EssentialSSL, OU=Domain Control Validated
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  modulus: 19319582615916585659242504168620425718645805827542544076367519867696185914255069380391761611176711763236138015178105913610261666808872857200056763482936155569643030949239457411028215201921515321255031124246934902745856049360960670836525338369519121654874032318461670026264305484084598428913822501539221068776613953044504654851115864964367308713844772369157117624745722953692816540566398064822652451732109298212767353851785781635913505536564496201813943378891319017249826847579583045980923164684260313066681015718006951059405090156338883534361341902284360952736550062700032127303539038935239709551420745512789576784293
  public exponent: 65537
  Validity: [From: Tue Apr 03 09:00:00 KST 2018,
               To: Sat May 04 08:59:59 KST 2019]
  Issuer: CN=COMODO RSA Domain Validation Secure Server CA, O=COMODO CA Limited, L=Salford, ST=Greater Manchester, C=GB
  SerialNumber: [    c6307bba f5e77272 74358350 93316fc5]

Certificate Extensions: 10
[1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticality=false
Extension unknown: DER encoded OCTET string =
0000: 04 81 F5 04 81 F2 00 F0   00 76 00 EE 4B BD B7 75  .........v..K..u
0010: CE 60 BA E1 42 69 1F AB   E1 9E 66 A3 0F 7E 5F B0  .`..Bi....f..._.
0020: 72 D8 83 00 C4 7B 89 7A   A8 FD CB 00 00 01 62 89  r......z......b.
0030: 33 2A 7B 00 00 04 03 00   47 30 45 02 20 47 A5 AC  3*......G0E. G..
0040: BB 4D 26 F4 F4 66 1B 57   05 F9 BF 43 BF 59 6C BD  .M&..f.W...C.Yl.
0050: FA F0 1E 3F 50 71 FC 0A   25 58 03 ED F1 02 21 00  ...?Pq..%X....!.
0060: E0 78 BA 37 2B A2 DD 09   55 5E 6C 75 FE EB B6 BF  .x.7+...U^lu....
0070: 49 6B 2B 15 BB 3D AC 67   27 F9 7E DB EE C7 6C 1A  Ik+..=.g'.....l.
0080: 00 76 00 74 7E DA 83 31   AD 33 10 91 21 9C CE 25  .v.t...1.3..!..%
0090: 4F 42 70 C2 BF FD 5E 42   20 08 C6 37 35 79 E6 10  OBp...^B ..75y..
00A0: 7B CC 56 00 00 01 62 89   33 29 DB 00 00 04 03 00  ..V...b.3)......
00B0: 47 30 45 02 21 00 84 1F   97 40 5E 11 60 D6 E0 33  G0E.!....@^.`..3
00C0: EE E4 01 B7 7F D6 D3 79   E7 62 4F 93 D6 6E DD D4  .......y.bO..n..
00D0: 7C 0C E5 E6 86 05 02 20   18 4B B4 77 C3 70 63 45  ....... .K.w.pcE
00E0: 14 CD 7F 16 37 2D 65 7C   5D A1 DF EA 3E 64 1F 1E  ....7-e.]...>d..
00F0: 24 1F 2B F8 FE 00 EA 5D                            $.+....]

 ... (생략)

[4]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: AD BD 98 7A 34 B4 26 F7   FA C4 26 54 EF 03 BD E0  ...z4.&...&T....
0010: 24 CB 54 1A                                        $.T.
]
]

]
  Algorithm: [SHA1withRSA]
  Signature:
0000: B0 9B E0 85 25 C2 D6 23   E2 0F 96 06 92 9D 41 98  ....%..#......A.
0010: 9C D9 84 79 81 D9 1E 5B   14 07 23 36 65 8F B0 D8  ...y...[..#6e...
0020: 77 BB AC 41 6C 47 60 83   51 B0 F9 32 3D E7 FC F6  w..AlG`.Q..2=...
0030: 26 13 C7 80 16 A5 BF 5A   FC 87 CF 78 79 89 21 9A  &......Z...xy.!.
0040: E2 4C 07 0A 86 35 BC F2   DE 51 C4 D2 96 B7 DC 7E  .L...5...Q......
0050: 4E EE 70 FD 1C 39 EB 0C   02 51 14 2D 8E BD 16 E0  N.p..9...Q.-....
0060: C1 DF 46 75 E7 24 AD EC   F4 42 B4 85 93 70 10 67  ..Fu.$...B...p.g
0070: BA 9D 06 35 4A 18 D3 2B   7A CC 51 42 A1 7A 63 D1  ...5J..+z.QB.zc.
0080: E6 BB A1 C5 2B C2 36 BE   13 0D E6 BD 63 7E 79 7B  ....+.6.....c.y.
0090: A7 09 0D 40 AB 6A DD 8F   8A C3 F6 F6 8C 1A 42 05  ...@.j........B.
00A0: 51 D4 45 F5 9F A7 62 21   68 15 20 43 3C 99 E7 7C  Q.E...b!h. C<...
00B0: BD 24 D8 A9 91 17 73 88   3F 56 1B 31 38 18 B4 71  .$....s.?V.18..q
00C0: 0F 9A CD C8 0E 9E 8E 2E   1B E1 8C 98 83 CB 1F 31  ...............1
00D0: F1 44 4C C6 04 73 49 76   60 0F C7 F8 BD 17 80 6B  .DL..sIv`......k
00E0: 2E E9 CC 4C 0E 5A 9A 79   0F 20 0A 2E D5 9E 63 26  ...L.Z.y. ....c&
00F0: 1E 55 92 94 D8 82 17 5A   7B D0 BC C7 8F 4E 86 04  .U.....Z.....N..

]
***
trigger seeding of SecureRandom
done seeding SecureRandom
Using SSLEngineImpl.
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA
<2018. 11. 8 오후 2시 53분 28초 KST> <Error> <Server> <BEA-002608> <The ListenThread because of an error: java.lang.IllegalArgumentException: Cannot support TLS_RSA_WITH_AES_256_CBC_SHA with currently installed providers
java.lang.IllegalArgumentException: Cannot support TLS_RSA_WITH_AES_256_CBC_SHA with currently installed providers
        at sun.security.ssl.CipherSuiteList.<init>(CipherSuiteList.java:92)
        at sun.security.ssl.SSLEngineImpl.setEnabledCipherSuites(SSLEngineImpl.java:2003)
        at weblogic.security.SSL.jsseadapter.JaSSLEngine$9.run(JaSSLEngine.java:240)
        at weblogic.security.SSL.jsseadapter.JaSSLEngine.doAction(JaSSLEngine.java:813)
        at weblogic.security.SSL.jsseadapter.JaSSLEngine.setEnabledCipherSuites(JaSSLEngine.java:238)
        at weblogic.server.channels.DynamicJSSEListenThread.registerSocket(DynamicJSSEListenThread.java:73)
        at weblogic.server.channels.DynamicListenThread.run(DynamicListenThread.java:188)
        at java.lang.Thread.run(Thread.java:745)
>
<2018. 11. 8 오후 2시 54분 06초 KST> <Info> <Health> <BEA-310002> <73% of the total memory in the server is free>

<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param verbose initialized to: true>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param packagePrefix initialized to: jsp_servlet>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param compilerclass initialized to: null>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param compileCommand initialized to: javac>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param compilerval initialized to: javac>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param pageCheckSeconds initialized to: -1>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param encoding initialized to: EUC_KR>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param superclass initialized to null>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: param workingDir initialized to: /app/wls1036/domains/{Domain_Name}/servers/{Server}/tmp/_WL_user/{Context_Name}/40ruv0>
<2018. 11. 8 오후 4시 37분 57초 KST> <Info> <ServletContext-> <BEA-000000> <JspServlet: initialization complete>
<2018. 11. 8 오후 4시 38분 06초 KST> <Info> <Health> <BEA-310002> <90% of the total memory in the server is free>
<2018. 11. 8 오후 4시 39분 06초 KST> <Info> <Health> <BEA-310002> <75% of the total memory in the server is free>






원인

- 현재 사용하는 Java 버전이 해당 암호화 알고리즘을 지원하지 않음.
 (링크: JDK의 암호화 알고리즘 키 제한 이슈)




해결방법

1. 암호화 알고리즘 unlimited 가능한 Java 버전으로 업데이트
2. JCE 설치하여 알고리즘 unlimited 로 변경
 - 링크: 암호화 알고리즘 unlimited Java버전 및 JCE 설치방법

3. 현재 버전의 Java가 사용가능한 Cipher Suite를 사용
 - 링크: WebLogic에서 Cipher Suites 강제 지정방법
 1) JCE 에서만 사용가능한 256이상의 Cipher Suite 제외
 2) JCE 에서만 사용가능한 ECDSA, ECDH, ECDHE, ECDH_anon Cipher Suite 제외
 3) 위 두가지 항목 외 다른 128 이하의 알고리즘 사용
  - 링크: Java6 사용가능한 알고리즘
  - 링크: Java7 사용가능한 알고리즘





Java 사용가능한 암호화 알고리즘 unlimit로 변경, 또는 사용가능한 Cipher Suite 지정 시 아래와 같이 SSL/TLS Debug Log 가 보여지며 정상적으로 https 웹페이지가 보여지게 된다.


Using SSLEngineImpl.
Using SSLEngineImpl.
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
[Raw read]: length = 5
0000: 16 03 01 02 00                                     .....
[Raw read]: length = 512
0000: 01 00 01 FC 03 03 A0 5A   00 75 9C 6D C9 5E 03 E1  .......Z.u.m.^..

 ... (생략)

01F0: 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00  ................
ExecuteThread: '0' for queue: 'weblogic.socket.Muxer', READ: TLSv1 Handshake, length = 512
*** ClientHello, Unknown-3.3
RandomCookie:  GMT: -1604714379 bytes = { 156, 109, 201, 94, 3, 225, 63, 73, 153, 17, 151, 135, 210, 113, 250, 3, 154, 197, 104, 53, 99, 226, 201, 194, 117, 162, 238, 252 }
Session ID:  {187, 60, 89, 212, 171, 218, 61, 231, 49, 86, 29, 95, 208, 199, 21, 202, 207, 241, 134, 115, 208, 143, 51, 44, 233, 111, 4, 227, 89, 185, 76, 90}
Cipher Suites: [Unknown 0xea:0xea, Unknown 0x13:0x1, Unknown 0x13:0x2, Unknown 0x13:0x3, Unknown 0xc0:0x2b, Unknown 0xc0:0x2f, Unknown 0xc0:0x2c, Unknown 0xc0:0x30, Unknown 0xcc:0xa9, Unknown 0xcc:0xa8, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, Unknown 0x0:0x9c, Unknown 0x0:0x9d, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA]
Compression Methods:  { 0 }1004lucifer
Unsupported extension type_10794, data:
Extension renegotiation_info, renegotiated_connection: <empty>
Unsupported extension type_23, data:
Unsupported extension type_35, data:
Unsupported extension signature_algorithms, data: 00:12:04:03:08:04:04:01:05:03:08:05:05:01:08:06:06:01:02:01
Unsupported extension status_request, data: 01:00:00:00:00
Unsupported extension type_18, data:
Unsupported extension type_16, data: 00:0c:02:68:32:08:68:74:74:70:2f:31:2e:31
Unsupported extension type_30032, data:
Extension ec_point_formats, formats: [uncompressed]
Unsupported extension type_51, data: 00:29:2a:2a:00:01:00:00:1d:00:20:06:f0:ca:25:17:1c:50:6e:de:31:28:37:04:3b:fb:2e:da:48:a8:a0:c6:bf:c7:aa:2e:df:88:8c:71:1f:28:3e
Unsupported extension type_45, data: 01:01
Unsupported extension type_43, data: 0a:fa:fa:03:04:03:03:03:02:03:01
Extension elliptic_curves, curve names: {unknown curve 10794, unknown curve 29, secp256r1, secp384r1}
Unsupported extension type_27, data: 02:00:02
Unsupported extension type_19018, data: 00
Unsupported extension type_21, data: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
***
[read] MD5 and SHA1 hashes:  len = 512
0000: 01 00 01 FC 03 03 A0 5A   00 75 9C 6D C9 5E 03 E1  .......Z.u.m.^..
0010: 3F 49 99 11 97 87 D2 71   FA 03 9A C5 68 35 63 E2  ?I.....q....h5c.

 ... (생략)

01E0: 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00  ................
01F0: 00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00  ................
%% Created:  [Session-7, TLS_RSA_WITH_AES_256_CBC_SHA]
*** ServerHello, TLSv1
RandomCookie:  GMT: 1524735920 bytes = { 9, 76, 209, 227, 25, 103, 244, 70, 88, 21, 251, 61, 166, 58, 205, 105, 11, 162, 10, 194, 197, 150, 141, 56, 20, 249, 253, 225 }
Session ID:  {91, 226, 160, 176, 184, 206, 91, 215, 68, 249, 89, 109, 144, 215, 240, 108, 140, 87, 22, 10, 147, 64, 211, 83, 239, 191, 23, 24, 235, 211, 130, 158}
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA
Compression Method: 0
Extension renegotiation_info, renegotiated_connection: <empty>
***
Cipher suiteTLS_RSA_WITH_AES_256_CBC_SHA
*** Certificate chain
chain [0] = [
[1004lucifer
  Version: V3
  Subject: CN=1004lucifer.co.kr, OU=EssentialSSL, OU=Domain Control Validated
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  modulus: 19319582615916585659242504168620425718645805827542544076367519867696185914255069380391761611176711763236138015178105913610261666808872857200056763482936155569643030949239457411028215201921515321255031124246934902745856049360960670836525338369519121654874032318461670026264305484084598428913822501539221068776613953044504654851115864964367308713844772369157117624745722953692816540566398064822652451732109298212767353851785781635913505536564496201813943378891319017249826847579583045980923164684260313066681015718006951059405090156338883534361341902284360952736550062700032127303539038935239709551420745512789576784293
  public exponent: 65537
  Validity: [From: Tue Apr 03 09:00:00 KST 2018,
               To: Sat May 04 08:59:59 KST 2019]
  Issuer: CN=COMODO RSA Domain Validation Secure Server CA, O=COMODO CA Limited, L=Salford, ST=Greater Manchester, C=GB
  SerialNumber: [    c6307bba f5e77272 74358350 93316fc5]

Certificate Extensions: 10
[1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticality=false
Extension unknown: DER encoded OCTET string =

 ... (생략)

00D0: F1 44 4C C6 04 73 49 76   60 0F C7 F8 BD 17 80 6B  .DL..sIv`......k
00E0: 2E E9 CC 4C 0E 5A 9A 79   0F 20 0A 2E D5 9E 63 26  ...L.Z.y. ....c&
00F0: 1E 55 92 94 D8 82 17 5A   7B D0 BC C7 8F 4E 86 04  .U.....Z.....N..

]
***
*** ServerHelloDone
[write] MD5 and SHA1 hashes:  len = 5768
0000: 02 00 00 4D 03 01 5B E2   A0 B0 09 4C D1 E3 19 67  ...M..[....L...g
0010: F4 46 58 15 FB 3D A6 3A   CD 69 0B A2 0A C2 C5 96  .FX..=.:.i......
0020: 8D 38 14 F9 FD E1 20 5B   E2 A0 B0 B8 CE 5B D7 44  .8.... [.....[.D
0030: F9 59 6D 90 D7 F0 6C 8C   57 16 0A 93 40 D3 53 EF  .Ym...l.W...@.S.
0040: BF 17 18 EB D3 82 9E 00   2F 00 00 05 FF 01 00 01  ......../.......
0050: 00 0B 00 16 2F 00 16 2C   00 06 62 30 82 06 5E 30  ..../..,..b0..^0
0060: 82 05 46 A0 03 02 01 02   02 11 00 C6 30 7B BA F5  ..F.........0...
0070: E7 72 72 74 35 83 50 93   31 6F C5 30 0D 06 09 2A  .rrt5.P.1o.0...*
1004lucifer
 ... (생략)

00A0: 6E 58 12 7E 70 8E 8F 15   91 16 6E 73 00 BE 56 74  nX..p.....ns..Vt
00B0: 6B 8A DC 1B 03 ED 84 6C   0B 1B 04 5A 4A 9E 4C E9  k......l...ZJ.L.
00C0: 93 71 5A 64 0F 80 8C F8   FD AC C0 0D 10 E6 E0 FB  .qZd............
00D0: BB 70 77 E3 64 78 55 46   25 DE 28 9B 2C 8C 3A 57  .pw.dxUF%.(.,.:W
00E0: AC 9B 37 54 DA 75 61 82   70 3B F9 6A 94 C1 40 FD  ..7T.ua.p;.j..@.
00F0: 1B 70 13 74 EA 18 49 3E   37 D7 FF 8F 0C 79 FF 3F  .p.t..I>7....y.?
0100: 4B 03 B8 C4 76 88                                  K...v.
ExecuteThread: '2' for queue: 'weblogic.socket.Muxer', READ: TLSv1 Handshake, length = 262
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1
SESSION KEYGEN:
PreMaster Secret:
0000: 03 03 CD A9 64 4D 64 7A   8A 5C 85 5B 17 51 E0 C8  ....dMdz.\.[.Q..
0010: A8 53 45 F0 F1 41 0E DA   34 A8 1D C0 3B F8 C4 9F  .SE..A..4...;...
0020: 4C 58 BA 69 3E 48 B5 EC   F1 F8 93 C6 44 50 72 4E  LX.i>H......DPrN
1004lucifer
 ... (생략)

0000: 14 03 01 00 01                                     .....
[Raw read]: length = 1
0000: 01                                                 .
ExecuteThread: '2' for queue: 'weblogic.socket.Muxer', READ: TLSv1 Change Cipher Spec, length = 1
[Raw read]: length = 5
0000: 16 03 01 00 30                                     ....0
[Raw read]: length = 48
0000: BD 9A FD 56 62 93 0F D4   73 FC A2 2A A7 33 11 CB  ...Vb...s..*.3..
0010: 57 A8 C7 29 68 71 D6 9F   3A ED A5 3A BF 58 AF F9  W..)hq..:..:.X..
0020: DD 1C 39 B3 3F 8D E0 0D   3D 6C 6C 52 AF D8 01 84  ..9.?...=llR....
ExecuteThread: '2' for queue: 'weblogic.socket.Muxer', READ: TLSv1 Handshake, length = 48
Padded plaintext after DECRYPTION:  len = 48
0000: 14 00 00 0C 43 E2 9C 2B   46 5D 79 35 47 01 6C 41  ....C..+F]y5G.lA
0010: E8 C5 56 60 E7 31 4C 98   AD 2A FD EF D1 24 F4 CA  ..V`.1L..*...$..
0020: AB A6 77 1D 0B 0B 0B 0B   0B 0B 0B 0B 0B 0B 0B 0B  ..w.............
*** Finished
verify_data:  { 67, 226, 156, 43, 70, 93, 121, 53, 71, 1, 108, 65 }
***
[read] MD5 and SHA1 hashes:  len = 16
0000: 14 00 00 0C 43 E2 9C 2B   46 5D 79 35 47 01 6C 41  ....C..+F]y5G.lA
ExecuteThread: '2' for queue: 'weblogic.socket.Muxer', WRITE: TLSv1 Change Cipher Spec, length = 1
*** Finished
verify_data:  { 192, 232, 219, 79, 38, 8, 16, 9, 216, 119, 248, 145 }
***
[write] MD5 and SHA1 hashes:  len = 16
0000: 14 00 00 0C C0 E8 DB 4F   26 08 10 09 D8 77 F8 91  .......O&....w..
Padded plaintext before ENCRYPTION:  len = 48
0000: 14 00 00 0C C0 E8 DB 4F   26 08 10 09 D8 77 F8 91  .......O&....w..
0010: 02 72 D8 02 70 D0 74 1D   DC 80 21 20 5D EB 5F 0E  .r..p.t...! ]._.
0020: F1 F6 DC 5E 0B 0B 0B 0B   0B 0B 0B 0B 0B 0B 0B 0B  ...^............
ExecuteThread: '2' for queue: 'weblogic.socket.Muxer', WRITE: TLSv1 Handshake, length = 48
%% Cached server session: [Session-7, TLS_RSA_WITH_AES_256_CBC_SHA]
[Raw write]: length = 6
0000: 14 03 01 00 01 01                                  ......
[Raw write]: length = 53
0000: 16 03 01 00 30 2F 73 F6   0E B7 DD 21 BC D7 D9 BE  ....0/s....!....
0010: 02 77 E6 96 7C 4D 4C 89   A5 1B C9 A5 78 2C 8F D8  .w...ML.....x,..

 ... (생략)






참고
 - https://docs.oracle.com/middleware/11119/wls/SECMG/ssl.htm#SECMG502


2018년 11월 18일 일요일

[Java] JDK의 암호화 알고리즘 키 제한 이슈 (Illegal key size 오류)





Java에서 (특히 256비트 이상)암호화 처리를 할 시 java.security.InvalidKeyException: Illegal key size 예외가 발생하는 경우가 있는데..


Java는 아래의 버전 이상에서만 unlimited 암호화를 지원한다.
- JDK 6u181 (개인은 6u45 버전까지 다운로드 가능)
- JDK 7u171 (개인은 7u80 버전까지 다운로드 가능)
- JDK 8u161
1004lucifer
주의
 - JDK 6u45 리눅스 버전은 unlimited 로 설정이 되어있음.
 - 따라서 JDK 6u45 사용 시 리눅스와 윈도우환경의 결과가 다르다.
(삽질 한참하다가 JDK소스 디컴파일해서 까보고 디버깅모드 돌려가며 겨우 알아냄..ㅠ)


위의 Java 버전보다 낮은경우에는 아래와 같이 암호화를 지원한다.
(언급되지 않은 알고리즘은 기본적으로 128비트까지 지원)
<JAVA_HOME>/jre/lib/security/local_policy.jar!/default_local.policy
1004lucifer
grant {
    permission javax.crypto.CryptoPermission "DES", 64;
    permission javax.crypto.CryptoPermission "DESede", *;
    permission javax.crypto.CryptoPermission "RC2", 128, 
              "javax.crypto.spec.RC2ParameterSpec", 128;
    permission javax.crypto.CryptoPermission "RC4", 128;
    permission javax.crypto.CryptoPermission "RC5", 128, 
          "javax.crypto.spec.RC5ParameterSpec", *, 12, *;
    permission javax.crypto.CryptoPermission "RSA", *;
    permission javax.crypto.CryptoPermission *, 128;
};




또한 SSL/TLS 프로토콜 이용시 사용하는 Cipher Suites 에서도
ECDSA, ECDH, ECDHE, ECDH_anon
위의 키교환방식에 대해서는 Java가 limited 상황에서는 사용할 수 없다.




JDK업데이트 없이 해결방법

1. JCE(Java Cryptography Extension)를 다운
 - Java 1.2
 - Java 1.4
 - Java 5
 - Java 6, 7, 8
 - Java 9 부터는 디폴트 unlimit 정책

2. <JAVA_HOME>/jre/lib/security/ 디렉토리에

3. local_policy.jar, US_export_policy.jar 파일 덮어쓰기


PS.
JDK 8u151 이상 버전에서는 아래와 같이 두개의 디렉토리로 나뉘어져 있다.
 - <JAVA_HOME>/jre/lib/security/policy/limited
 - <JAVA_HOME>/jre/lib/security/policy/unlimited

JDK 8u151 이상에서는 JCE 다운로드 없이
<JAVA_HOME>/jre/lib/security/java.security 파일에
crypto.policy=unlimited 옵션 지정 시 바로 사용가능하다.






아래의 JDK의 JCE 소스 발췌를 통해 JDK 8u161 부터 unlimited 가 디폴트로 지정된것을 알 수 있다.

JDK 8u151 - jce.jar!/javax.crypto/JceSecurity.class
private static void setupJurisdictionPolicies()
  throws Exception
{
 String str1 = System.getProperty("java.home");
 String str2 = Security.getProperty("crypto.policy");

 Path localPath = str2 == null ? null : Paths.get(str2, new String[0]);
 if ((localPath != null) && ((localPath.getNameCount() != 1) ||
   (localPath.compareTo(localPath.getFileName()) != 0))) {
  throw new SecurityException("Invalid policy directory name format: " + str2);
 }
 if (localPath == null) {
  localPath = Paths.get(str1, new String[] { "lib", "security" });
 } else {
  localPath = Paths.get(str1, new String[] { "lib", "security", "policy", str2 });
 }
 if (debug != null) {
  debug.println("crypto policy directory: " + localPath);
 }
 File localFile1 = new File(localPath.toFile(), "US_export_policy.jar");
 File localFile2 = new File(localPath.toFile(), "local_policy.jar");
 if ((str2 == null) && ((!localFile1.exists()) ||
   (!localFile2.exists())))
 {
  localPath = Paths.get(str1, new String[] { "lib", "security", "policy", "limited" });

  localFile1 = new File(localPath.toFile(), "US_export_policy.jar");
  localFile2 = new File(localPath.toFile(), "local_policy.jar");
 }
 URL localURL = ClassLoader.getSystemResource("javax/crypto/Cipher.class");
 if ((localURL == null) ||
   (!localFile1.exists()) || (!localFile2.exists())) {
  throw new SecurityException("Cannot locate policy or framework files!");
 }
 CryptoPermissions localCryptoPermissions1 = new CryptoPermissions();
 CryptoPermissions localCryptoPermissions2 = new CryptoPermissions();
 loadPolicies(localFile1, localCryptoPermissions1, localCryptoPermissions2);

 CryptoPermissions localCryptoPermissions3 = new CryptoPermissions();
 CryptoPermissions localCryptoPermissions4 = new CryptoPermissions();
 loadPolicies(localFile2, localCryptoPermissions3, localCryptoPermissions4);
 if ((localCryptoPermissions1.isEmpty()) || (localCryptoPermissions3.isEmpty())) {
  throw new SecurityException("Missing mandatory jurisdiction policy files");
 }
 defaultPolicy = localCryptoPermissions1.getMinimum(localCryptoPermissions3);
 if (localCryptoPermissions2.isEmpty()) {
  exemptPolicy = localCryptoPermissions4.isEmpty() ? null : localCryptoPermissions4;
 } else {
  exemptPolicy = localCryptoPermissions2.getMinimum(localCryptoPermissions4);
 }
}


JDK 8u161 - jce.jar!/javax.crypto/JceSecurity.class
private static void setupJurisdictionPolicies()
  throws Exception
{
 String str1 = System.getProperty("java.home");
 String str2 = Security.getProperty("crypto.policy");

 Path localPath = str2 == null ? null : Paths.get(str2, new String[0]);
 if ((localPath != null) && ((localPath.getNameCount() != 1) ||
   (localPath.compareTo(localPath.getFileName()) != 0))) {
  throw new SecurityException("Invalid policy directory name format: " + str2);
 }
 if (localPath == null) {
  localPath = Paths.get(str1, new String[] { "lib", "security" });
 } else {
  localPath = Paths.get(str1, new String[] { "lib", "security", "policy", str2 });
 }
 if (debug != null) {
  debug.println("crypto policy directory: " + localPath);
 }
 File localFile1 = new File(localPath.toFile(), "US_export_policy.jar");
 File localFile2 = new File(localPath.toFile(), "local_policy.jar");
 if ((str2 == null) && ((!localFile1.exists()) ||
   (!localFile2.exists())))
 {
  localPath = Paths.get(str1, new String[] { "lib", "security", "policy", "unlimited" });

  localFile1 = new File(localPath.toFile(), "US_export_policy.jar");
  localFile2 = new File(localPath.toFile(), "local_policy.jar");
 }
 URL localURL = ClassLoader.getSystemResource("javax/crypto/Cipher.class");
 if ((localURL == null) ||
   (!localFile1.exists()) || (!localFile2.exists())) {
  throw new SecurityException("Cannot locate policy or framework files!");
 }
 CryptoPermissions localCryptoPermissions1 = new CryptoPermissions();
 CryptoPermissions localCryptoPermissions2 = new CryptoPermissions();
 loadPolicies(localFile1, localCryptoPermissions1, localCryptoPermissions2);

 CryptoPermissions localCryptoPermissions3 = new CryptoPermissions();
 CryptoPermissions localCryptoPermissions4 = new CryptoPermissions();
 loadPolicies(localFile2, localCryptoPermissions3, localCryptoPermissions4);
 if ((localCryptoPermissions1.isEmpty()) || (localCryptoPermissions3.isEmpty())) {
  throw new SecurityException("Missing mandatory jurisdiction policy files");
 }
 defaultPolicy = localCryptoPermissions1.getMinimum(localCryptoPermissions3);
 if (localCryptoPermissions2.isEmpty()) {
  exemptPolicy = localCryptoPermissions4.isEmpty() ? null : localCryptoPermissions4;
 } else {
  exemptPolicy = localCryptoPermissions2.getMinimum(localCryptoPermissions4);
 }
}





아래링크의 AES256 암호화 자바 샘플을 통해 디버깅모드로 실행하게되면 jce.jar 내부적으로 돌아가는 모습을 볼 수 있다.
 - https://dukeom.wordpress.com/2013/01/08/aes256-%EC%95%94%ED%98%B8%ED%99%94-java-%EC%83%98%ED%94%8C/
(JDK 6은 클래스,변수명 난독화가 되어있어 디버깅모드로 한줄한줄 제대로 볼 수 없었음)





참고
 - https://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#AppC
 - https://hongsii.github.io/2018/04/05/aes256-java-security-invalidkeyexception-illegal-key-size-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95/
 - https://dukeom.wordpress.com/2013/01/08/aes256-%EC%95%94%ED%98%B8%ED%99%94-java-%EC%83%98%ED%94%8C/
 - https://rsec.kr/?p=455