Apache Tomcat에서 SSLv3 지원을 비활성화하려면 어떻게합니까?


20

TLSv1 만 사용하도록 Apache Tomcat 서버를 재구성하려고합니다. 그러나 여전히 특정 브라우저를 사용하여 SSLv3으로 폴백합니다.

<connector> 태그를 다음 설정으로 설정했습니다.

<Connector ...
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA" sslEnabledProtocols="TLSv1" />

구성 설정이 누락되었거나 존재하지 않아야 할 내용이 있습니까?


v3의 문제점은 무엇입니까? v1에 보안 문제가 있다고 생각했습니다.
mdpc

8
@mdpc POODLE은 SSLv3에 영향을줍니다.
CoverosGene

2
톰캣 버전? JDK 버전? 최신 버전에서 sslProtocol은 기본적으로 TLS입니다.
Xavier Lucas

2
rmeisen : 답변은 Tomcat 및 Java 버전 및 JSSE 구절 AJP를 사용하는 경우에 따라 다릅니다. 차이점은 sslProtocols=TLSv1구절 만큼 미묘합니다 sslProtocol="TLS"(알림 s?). Tomcat & Java 버전을 지정하면 광기에서 벗어날 수 있습니다.
Stefan Lasiewski

답변:


12

Tomcat 5 및 버전 6 버전에 따라 SSLEnabled = "true"는 릴리스 중반에 추가되었으므로 작동하지 않을 수 있습니다. 이 문제를 해결하려면 다음을 편집하면됩니다. sslProtocols = TLS받는 사람 : sslProtocols = "TLSv1, TLSv1.1, TLSv1.2"

이상하게 보이지만 TLS라고해도 SSL 3이 포함되어 있습니다.

이것은 Tomcat 5.5.20 및 Tomcat 6 인스턴스에서 수정되었습니다. 그레그

당신이해야 할 일은 다음과 같습니다.

쥬 보스 :

<Connector protocol="HTTP/1.1" SSLEnabled="true" 
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200"
       scheme="https" secure="true" clientAuth="false" 
       keystoreFile="${jboss.server.home.dir}/conf/keystore.jks"
       keystorePass="rmi+ssl"
       sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

암호 스위트 정의에 대해서는 확실하지 않지만 sslprotocol은 TLSv1, TLSv1.1, TLSv1.2 로 설정해야 합니다.

Tomcat 버전에 따라 다른 잠재적 인 솔루션이 다릅니다.

톰캣 5와 6

<Connector...
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslEnabledProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

** RHEL5 기반 배포판에서 다음 은 Tomcat 6.0.38 이전의 Tomcat 6 버전에 적용됩니다. **

참고 TLSv1.1,TLSv1.2자바 7에서 지원은 자바 6을 실행하는 서버에 이러한 지시문을 추가하지 자바 6. 무해하지만, TLSv1.1 & TLSv1.2을 사용하지 않습니다.

<Connector...
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
   clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

톰캣> = 7

<Connector...
       enableLookups="true" disableUploadTimeout="true"
       acceptCount="100"  maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
       clientAuth="false" sslProtocols = "TLSv1,TLSv1.1,TLSv1.2" />

Tomcat APR 커넥터

<Connector...
               maxThreads="200"
               enableLookups="true" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               SSLEnabled="true" 
               SSLProtocol="TLSv1"
               SSLCertificateFile="${catalina.base}/conf/localhost.crt"
               SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" />

위의 내용은 커넥터 사양보다 높은 사양에 맞도록 변경되었습니다. 출처 : https://access.redhat.com/solutions/1232233


1
참고 sslEnabledProtocols로 Tomcat 6에서 우리에게는 효과가 sslProtocols = "TLSv1,...."없었습니다.
Stefan Lasiewski

4

Tomcat 7이 TLSv1.2 만 엄격하게 사용하고 TLSv1.1 또는 SSLv3과 같은 이전 SSL 프로토콜로 폴백하지 않도록하는 유사한 유스 케이스가 있습니다.

C : \ apache-tomcat-7.0.64-64bit 및 C : \ Java64 \ jdk1.8.0_60을 사용하고 있습니다.

이 지침을 따르십시오 : https://tomcat.apache.org/tomcat-7.0-doc/security-howto.html . Tomcat은 SSL 지원 설정이 비교적 간단합니다.

많은 참고 문헌에서 많은 조합을 테스트했으며 결국 Tomcat 7이 TLSv1.2 만 수락하도록 강제하는 1을 발견했습니다. 만져야 할 2 곳 :

1) C : \ apache-tomcat-7.0.64-64bit \ conf \ server.xml에서

<Connector port="8443" 
 protocol="org.apache.coyote.http11.Http11Protocol"
 maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
 keystoreFile="ssl/.keystore" keystorePass="changeit"
 clientAuth="false" sslProtocol="SSL" sslEnabledProtocols="TLSv1.2" />

어디에

keystoreFile = 지역 자체 서명 신뢰 저장소

org.apache.coyote.http11.Http11Protocol = JSSE BIO 구현

우리는 org.apache.coyote.http11.Http11AprProtocolopenssl에 의해 구동되기 때문에를 사용하지 않습니다 . 기본 openssl은 이전 SSL 프로토콜을 지원하도록 대체됩니다.

2) Tomcat을 시작할 때 다음 환경 매개 변수를 활성화하십시오.

set JAVA_HOME=C:\Java64\jdk1.8.0_60
set PATH=%PATH%;C:\Java64\jdk1.8.0_60\bin
set CATALINA_HOME=C:\apache-tomcat-7.0.64-64bit
set JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2" -Dsun.security.ssl.allowUnsafeRenegotiation=false -Dhttps.protocols="TLSv1.2"

JAVA_OPTS 제한이 필요합니다. 그렇지 않으면 Tomcat (Java8 기반)이 이전 SSL 프로토콜을 지원하도록 대체됩니다.

Tomcat 시작 C:\apache-tomcat-7.0.64-64bit\bin\startup.bat

Tomcat 시작 로그에 JAVA_OPTS가 나타납니다.

Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djdk.tls.client.protocols=TLSv1.2
Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dsun.security.ssl.allowUnsafeRenegotiation=false
Oct 16, 2015 4:10:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dhttps.protocols=TLSv1.2

그런 다음 openssl 명령을 사용하여 설정을 확인할 수 있습니다. 먼저 localhost : 8443을 TLSv1.1 프로토콜과 연결하십시오. Tomcat은 서버 인증서로 응답을 거부합니다.

C:\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_1
Loading 'screen' into random state - done
CONNECTED(000001C0)
5372:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:.\ssl\s3_pkt.c:362:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes

localhost : 8443을 TLSv1.2 프로토콜로 연결하고 Tomcat은 ServerHello를 인증서로 응답합니다.

C:\OpenSSL-Win32\bin>openssl s_client -connect localhost:8443 -tls1_2
Loading 'screen' into random state - done
CONNECTED(000001C0)
depth=1 C = US, ST = Washington, L = Seattle, O = getaCert - www.getacert.com
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
0 s:/C=SG/ST=SG/L=Singapore/O=Xxxx/OU=Development/CN=Myself
   i:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
1 s:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
   i:/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
---
Server certificate
-----BEGIN CERTIFICATE-----
(ignored)
-----END CERTIFICATE-----
subject=/C=SG/ST=SG/L=Singapore/O=Xxxx/OU=Development/CN=Myself
issuer=/C=US/ST=Washington/L=Seattle/O=getaCert - www.getacert.com
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2367 bytes and written 443 bytes

이는 Tomcat이 TLSv1.2 요청에만 엄격하게 응답 함을 나타냅니다.


아주 좋고 철저한 답변! 명성!
Jenny D는 Monica Reinstate Monica

JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2필요하지 않다는 것을 알았습니다 (Tomcat 8.0.29, Java 1.8.0_74). 그것도 여기에 언급되지 않은 것 : wiki.apache.org/tomcat/Security/POODLE


0

Tomcat 6.0.41에서는 NIO 커넥터가 해당 설정을 무시하므로 차단 커넥터를 사용해야합니다.

http://wiki.apache.org/tomcat/Security/POODLE

http://mail-archives.apache.org/mod_mbox/tomcat-users/201410.mbox/%3C5440F1C6.3040205@apache.org%3E

커넥터 포트 = "443"protocol = "org.apache.coyote.http11.Http11Protocol"maxThreads = "200"scheme = "https"secure = "true"SSLEnabled = "true"clientAuth = "false"
keystoreFile = "tomcat.jks "keystorePass ="changeit "sslEnabledProtocols ="TLSv1, TLSv1.1, TLSv1.2 "/>


0

Tomcat 5.5에서는 문서화되지 않은 매개 변수를 사용해야합니다

protocols="TLSv1"

이 프로토콜 버전의 사용을 제한합니다.


0

server.xml의 Jboss 4.0.3 SP1 (Java 1.5의 Tomcat 5.5)에서 SSL 3 (POODLE)을 비활성화하려면 다음과 같이 코드를 변경하십시오.

<Connector port="443" address="${jboss.bind.address}" maxThreads="100" strategy="ms" maxHttpHeaderSize="8192" emptySessionPath="true" scheme="https" secure="true" clientAuth="false" keystoreFile="${jboss.server.home.dir}/conf/eCP.keystore" keystorePass="password" sslProtocol="TLS" protocols="TLSv1,TLSv1.1,TLSv1.2" />


0

최신 Tomcat의 경우 sslProtocolssslEnabledProtocols 콤보를 다음과 같이 사용하십시오.

<Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocols="TLSv1,TLSv1.1,TLSv1.2" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" SSLEnabled="true" URIEncoding="UTF-8" keystorePass=""/>


0

우선, @iviorel 말한대로, 그렇지 않은 sslProtocols, 그것은이다 sslProtocol. (왜 그의 대답이 점수를 떨어 뜨렸습니까?)

JSSE
저에게 Tomcat 7 및 Java 7에서는 sslProtocol다음 구성이 작동하지 않습니다.

<Connector SSLEnabled="true" clientAuth="false" 
keyAlias="keyalias" keystoreFile="keystore" keystorePass="changeit" 
maxThreads="150" port="443" protocol="org.apache.coyote.http11.Http11Protocol" 
scheme="https" secure="true" sslProtocol="TLSv1,TLSv1.1,TLSv1.2" />

그것은 말한다 :

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-443"]
java.io.IOException: TLSv1,TLSv1.1,TLSv1.2 SSLContext not available
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:465)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:187)
    at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:398)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:646)
    ...
Caused by: java.security.NoSuchAlgorithmException: TLSv1,TLSv1.1,TLSv1.2 SSLContext not available
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSSLContext(JSSESocketFactory.java:478)
    at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:439)
    ... 19 more

그러나 다음은 잘 작동합니다.

<Connector SSLEnabled="true" clientAuth="false" 
keyAlias="keyalias" keystoreFile="keystore" keystorePass="changeit" 
maxThreads="150" port="443" protocol="org.apache.coyote.http11.Http11Protocol" 
scheme="https" secure="true" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" />

APR
SSL v3을 비활성화하고 TLSv1 프로토콜을 활성화하려면

SSLProtocol="TLSv1"

TLSv1, TLSv1.1, TLSv1.2 프로토콜을 활성화하려면 :

SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"

또는:

SSLProtocol="all"

참고 : "TLSv1.1", "TLSv1.2"값에는 Tomcat Native 1.1.32 및이를 지원하는 Tomcat 버전이 필요합니다.

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