[
https://jira.codehaus.org/browse/CONTINUUM-2501?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=362270#comment-362270
]
Brent N Atkinson commented on CONTINUUM-2501:
---------------------------------------------
After reading
http://blog.yuriytkach.com/2011/10/javaxnetsslsslexception-badrecordmac.html, I
was able to reproduce this error locally using an Apache Httpd server
configured only for SSLv3. The problem as the article states, is not with
certificates, but with attempting to negotiate an unsupported protocol to a
server that only supports SSLv3. Though this behavior is no longer present in
later versions of the JDK (I tried on 6 & 7) I could repeat the problem through
manual configuration of the security subsystem (using {{-Dhttps.protocols}}).
The version of httpd for reference:
{code}
$ apache2 -version
Server version: Apache/2.4.7 (Ubuntu)
Server built: Jul 22 2014 14:36:38
{code}
I enabled only the SSLv3 protocol by changing the apache configuration to read:
{code}
# Enable only the SSLv3 protocol
SSLProtocol SSLv3
{code}
Using the attached tryssl program, I was able to confirm that the problem was
no longer the same under Java 6. This is apparently because SSLv3 is now
disabled due to security vulnerabilities:
{code}
$ /usr/lib/jvm/java-6-oracle/bin/java -jar tryssl-1.0-SNAPSHOT.jar
"https://192.168.11.15/pom.xml"
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host
closed connection during handshake
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:882)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at TrySSL.main(TrySSL.java:40)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:462)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:863)
... 8 more
{code}
The error given by Java 7 is more descriptive:
{code}
$ /usr/lib/jvm/java-7-oracle/bin/java -jar tryssl-1.0-SNAPSHOT.jar
"https://192.168.11.15/pom.xml"
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Server chose
SSLv3, but that protocol version is not enabled or not supported by the client.
at
sun.security.ssl.ClientHandshaker.serverHello(ClientHandshaker.java:445)
at
sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:199)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:901)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:837)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1023)
at
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
at
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
at
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
at
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301)
at
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at TrySSL.main(TrySSL.java:40)
{code}
Using the {{https.protocols}} system property, I was able to successfully fetch
content by enabling the SSLv3 protocol (it does the same thing as the attached
patch, without requiring code changes):
{code}
/usr/lib/jvm/java-6-oracle/bin/java -Dhttps.protocols=SSLv3 -jar
tryssl-1.0-SNAPSHOT.jar "https://192.168.11.15/pom.xml"
<?xml version="1.0" encoding="windows-1252"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
....
{code}
Finally, I was able to reproduce the exact error message by specifying both
TLSv1 and SSLv3, which causes the java security subsystem to attempt
negotiation to the SSLv3 server using TLS:
{code}
$ /usr/lib/jvm/java-6-oracle/bin/java -Dhttps.protocols=TLSv1,SSLv3 -jar
tryssl-1.0-SNAPSHOT.jar "https://192.168.11.15/pom.xml"
Exception in thread "main" javax.net.ssl.SSLException: Received fatal alert:
bad_record_mac
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
at
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at TrySSL.main(TrySSL.java:40)
{code}
Given that this can be configured using system properties, the patch
essentially forces using SSLv3 and nothing else, and no one should be using
SSLv3 for security reasons, I'm going to reject this.
> Exception while downloading pom from https url
> ----------------------------------------------
>
> Key: CONTINUUM-2501
> URL: https://jira.codehaus.org/browse/CONTINUUM-2501
> Project: Continuum
> Issue Type: Bug
> Components: Core system
> Affects Versions: 1.2.3, 1.3.6, 1.4.0 (Beta), 1.4.1
> Reporter: Vlado Pesov
> Assignee: Brent N Atkinson
> Priority: Minor
> Fix For: 1.5.0
>
> Attachments: EasySSLSocketFactory.patch, tryssl.tgz
>
>
> The exception is because the http client cannot handle certificates for SSLv3
> protocol, so this support must be explicitly enabled. Here is the exception:
> Could not download the URL: https://xxxxxx:*****@hostname.com/project/pom.xml
> javax.net.ssl.SSLException: Connection has been shutdown:
> javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
> at com.sun.net.ssl.internal.ssl.
> SSLSocketImpl.checkEOF(SSLSocketImpl.java:1267)
> at
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkWrite(SSLSocketImpl.java:1279)
> at
> com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:43)
> at
> org.apache.http.impl.io.AbstractSessionOutputBuffer.flushBuffer(AbstractSessionOutputBuffer.java:87)
> at
> org.apache.http.impl.io.AbstractSessionOutputBuffer.flush(AbstractSessionOutputBuffer.java:94)
> at
> org.apache.http.impl.AbstractHttpClientConnection.doFlush(AbstractHttpClientConnection.java:171)
> at
> org.apache.http.impl.SocketHttpClientConnection.close(SocketHttpClientConnection.java:192)
> at
> org.apache.http.impl.conn.DefaultClientConnection.close(DefaultClientConnection.java:161)
> at
> org.apache.http.impl.conn.AbstractPooledConnAdapter.close(AbstractPooledConnAdapter.java:158)
> at
> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
> at
> org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410)
> at
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
> at
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
> at
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
> at
> org.apache.maven.continuum.project.builder.AbstractContinuumProjectBuilder.createMetadataFile(AbstractContinuumProjectBuilder.java:122)
> at
> org.apache.maven.continuum.project.builder.AbstractContinuumProjectBuilder.createMetadataFile(AbstractContinuumProjectBuilder.java:244)
> at
> org.apache.maven.continuum.project.builder.maven.MavenTwoContinuumProjectBuilder.readModules(MavenTwoContinuumProjectBuilder.java:149)
> at
> org.apache.maven.continuum.project.builder.maven.MavenTwoContinuumProjectBuilder.buildProjectsFromMetadata(MavenTwoContinuumProjectBuilder.java:124)
> at
> org.apache.maven.continuum.core.action.CreateProjectsFromMetadataAction.execute(CreateProjectsFromMetadataAction.java:152)
> at
> org.apache.maven.continuum.DefaultContinuum.executeAction(DefaultContinuum.java:2759)
> at
> org.apache.maven.continuum.DefaultContinuum.executeAddProjectsFromMetadataActivity(DefaultContinuum.java:1569)
> at
> org.apache.maven.continuum.DefaultContinuum.executeAddProjectsFromMetadataActivity(DefaultContinuum.java:1815)
> at
> org.apache.maven.continuum.DefaultContinuum.addMavenTwoProject(DefaultContinuum.java:1365)
> at
> org.apache.maven.continuum.web.action.AddMavenTwoProjectAction.doExecute(AddMavenTwoProjectAction.java:109)
> at
> org.apache.maven.continuum.web.action.AddMavenProjectAction.execute(AddMavenProjectAction.java:189)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
> at
> com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
> at
> org.apache.struts2.interceptor.BackgroundProcess$1.run(BackgroundProcess.java:56)
> at java.lang.Thread.run(Thread.java:619)
> Caused by: javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
> at
> com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
> at
> com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
> at
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1694)
> at
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:939)
> at
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1120)
> at
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)
> at
> com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
> at
> org.apache.http.impl.io.AbstractSessionOutputBuffer.flushBuffer(AbstractSessionOutputBuffer.java:87)
> at
> org.apache.http.impl.io.AbstractSessionOutputBuffer.flush(AbstractSessionOutputBuffer.java:94)
> at
> org.apache.http.impl.AbstractHttpClientConnection.doFlush(AbstractHttpClientConnection.java:171)
> at
> org.apache.http.impl.AbstractHttpClientConnection.flush(AbstractHttpClientConnection.java:176)
> at
> org.apache.http.impl.conn.AbstractClientConnAdapter.flush(AbstractClientConnAdapter.java:221)
> at
> org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:240)
> at
> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:119)
> ... 23 more
--
This message was sent by Atlassian JIRA
(v6.1.6#6162)