Java 7에서 클라이언트에 TLS 1.1 및 1.2 사용


50

Java 7은 클라이언트에 대해 TLS 1.1 및 1.2를 비활성화합니다. 에서 자바 암호화 아키텍쳐 (architecture) 오라클 공급자 문서 :

Java SE 7 릴리스의 SunJSSE가 TLS 1.1 및 TLS 1.2를 지원하지만 클라이언트 연결에 기본적으로 두 버전이 활성화되어 있지 않습니다. 일부 서버는 순방향 호환성을 올바르게 구현하지 않으며 TLS 1.1 또는 TLS 1.2 클라이언트와의 통신을 거부합니다. 상호 운용성을 위해 SunJSSE는 클라이언트 연결에 기본적으로 TLS 1.1 또는 TLS 1.2를 활성화하지 않습니다.

Java 응용 프로그램 솔루션이 아닌 시스템 전체 설정 (아마도 구성 파일을 통해)에서 프로토콜을 활성화하는 데 관심이 있습니다.

TLS 1.1 및 1.2 시스템 전체를 관리적으로 활성화하려면 어떻게합니까 ?

참고 : POODLE부터SSLv3 시스템 전체 관리적으로 비활성화하고 싶습니다. (SSLv3의 문제는 15 년 이상 POODLE보다 오래되었지만 Java / Oracle / Developers는 기본 모범 사례를 따르지 않았으므로 나와 같은 사용자는 혼란을 정리해야합니다.)


Java 버전은 다음과 같습니다.

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

나를 위해 일한 것은 여기에 설명 된 것처럼 기본 SSLContext를 설정하는 것입니다. stackoverflow.com/questions/39157422/…
shmert

답변:


31

-Dhttps.protocols=TLSv1.1,TLSv1.2https 연결 중에 사용해야하는 TLS 프로토콜 버전을 지정하도록 JVM을 구성 하는 다음 특성 을 추가 할 수 있습니다.


6
이것이 무엇을하는지 더 설명하십시오. 그렇지 않으면, 이것은 모호하고 잘못된 손에 잠재적으로 손상을 줄 수 있습니다.
studiohack

1
@Thomasz-나는 다른 사람들과 동의합니다 ... 시스템 전체에서 어떻게 관리합니까? 머신의 구성 파일에 추가됩니까? 그렇다면 파일은 무엇이며 어디에 추가합니까?
jww

3
이 링크가 도움이 될 것입니다 : blogs.oracle.com/java-platform-group/entry/… 명령 행 예에서 -Dhttps.protocols 특성을 매개 변수로 추가 할 수 있습니다. java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 또는 응용 프로그램 (서버) 구성 파일의 어딘가에 있습니다. 애플리케이션 의지 협상 HTTPS 연결, 모든 협상 정보를 인쇄 할 때 사용 된 프로토콜 버전을 포함하여, -Djavax.net.debug = 모든 그 후 :이 추가 PARAM를 추가하여 작동하는지 확인할 수 있습니다
토마스 Rebizant

이 매개 변수 (https.protocols)는 https 연결 중에 사용해야 할 프로토콜 버전을 Java 가상 머신으로 구성하고 있습니다.
Tomasz Rebizant

3
@TomaszRebizant, 맞습니다. 예를 들어 export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"Tomcat의 setenv.sh를 추가 하면 애플리케이션 서버의 앱에서 작성된 모든 SSL 연결에 대해 TLSv1 및 TLSv2를 모두 사용할 수 있습니다.
Zaki

14

Java 1.7을 가정하면 시작 스크립트에 다음과 같은 것을 추가 할 수 있습니다.

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

다른 제안 : https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


이 특성 문서를 찾은 곳에서는 JAVA7 문서에서 "-D deployment.security. {ProtocolName} = True / False;"에 대해 언급 한 곳이 없습니다.
runcode

@runcode, 확실하지는 않지만 위에서 언급 한 oracle.com 블로그에 언급되어 있습니다
cnst

1
@ cnst-여기서 문제는 모든 Java 소프트웨어의 모든 개발자에게 연락하여이를 수행해야한다는 것입니다. 따라서 내 컴퓨터에서 관리적으로 한 번 수행하려는 이유입니다.
jww

나를 위해 작동하지 않았다.
Sridhar Sarnobat

9

Mac OS X의 Java 7의 경우로 이동 System Preferences > Java하면 Java 제어판이 별도의 창에서 열립니다. 그런 다음 Advanced탭으로 이동하여 Advanced Security Settings섹션으로 스크롤 하여 Use TLS 1.1Use TLS 1.2확인란을 선택하십시오.

여기에 이미지 설명을 입력하십시오


고마워 Spiff. 이미 표시된 것처럼 TLS 1.0 이상을 이미 설정했습니다. 그러나 SSLSocket(다른 Java 프로그램에서 발생한다고 가정) TLS 1.0이 활성화되어 있으며 TLS 1.1 및 1.2를 사용할 수 있습니다.
jww

3
시스템에서도이를 테스트 할 수 있습니다 (관심이있는 경우). 이 버그 보고서 에서 ProtocolTest.java 를 다운로드 하여 실행하십시오. 컴파일하고 실행하려면 터미널에서 실행하십시오 . 활성화 된 프로토콜 아래에 무엇이 표시되는지 확인하십시오 . javac ProtocolTest.java && java ProtocolTest
jww

2
이것은 WebStart 클라이언트 및 애플릿에서만 작동합니다. Java 실행 파일로 시작된 응용 프로그램 서버에는 영향을 미치지 않습니다.
eckes

8

방금 최근에 이것을 연구하고 추가하고 싶습니다 .JDK에서는 작동하지 않습니다. deployment.properties는 JRE에서 실행되는 애플릿 및 기타 항목에만 적용됩니다.

JDK 응용 프로그램 (예 : LDAP에 연결해야하는 서버)의 경우 서버는 클라이언트이지만 deployment.security입니다. 작동하지 않습니다.

SSLContext.getInstance ( "TLSv1.2")와 같은 코드를 작성하지 않으면 변경할 수 없습니다.


4

데스크톱에서 실행되는 Java 애플릿 및 Java Web Start 프로그램에 대해서는 deployment.security. * 설정이 작동하는 것 같습니다. 다른 사람들이 여기에서 언급했듯이 deployment.properties를 편집하여 지정할 수 있습니다.

다음은 그룹 정책을 사용하여 모든 사용자에 대해 동일한 deployment.properties 파일을 배포하는 방법을 보여주는 기사입니다. http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

불행히도 java.exe 또는 javaw.exe를 직접 호출하는 컴퓨터의 모든 Java 프로그램에 대해서는이 기능을 설정할 수 없습니다. java를 사용하는 각 프로그램을 찾아서 java에 전달할 매개 변수를 지정하는 구성 파일을 찾아서 변경해야합니다.

Tomcat의 경우 Tomcat에서 다른 서버로의 연결이 TLS 1.1+ :를 사용하도록이를 전달해야했습니다 -Dhttps.protocols=TLSv1.1,TLSv1.2. Linux에서는 편집 bin/catalina.sh또는을 작성하여 수행 할 수 있습니다 bin/setenv.sh.

Tomcat이 서버 측에서 TLS 1.2 만 사용하는 데 필요한 것이 무엇인지 모르겠습니다. 우리는 Apache HTTP를 사용합니다.


1

Java 7 -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2을 사용하는 경우 JVM의 인수에 추가 할 수 있습니다 .

여기에는 몇 가지주의 사항이 있습니다.

이러한 단점에도 불구하고, 특히 유용한 프로토콜이 TLS를 사용하지만 HTTPS (예 : LDAPS)가 아닌 경우에 유용 할 수 있다고 생각합니다.

[업데이트] 우분투에서 서버 풀을 운영하는 회사에서는 OpenJDK 7의 121 업데이트조차도 이것을 제대로 구현하기에 충분하지 않다는 것을 깨달았습니다. 작동하기 전에 모든 서버를 업데이트하여 181을 업데이트했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.