获取sslexcexception: Received fatal alert: internal_error在Tomc



在Java主方法中运行此代码时,我得到Status = 200,这一切都很好。

try {
    String url = "https://www.celltowerleaseexperts.com/"; 
    int status = HttpResponseUtil.getResponseCode(url);
    logger.warn("Status = " + status);
} catch (Exception e) {
    logger.warn(e.getMessage(), e);
}
这是HttpResponseUtil的代码:
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import javax.net.ssl.SSLContext;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpResponseUtil {
 private static final Logger logger = LoggerFactory.getLogger(HttpResponseUtil.class);
 private final static String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0";
 public static int getResponseCode(String url) throws IOException {
  SSLConnectionSocketFactory sslsf = null;
  try {
   SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(new TrustSelfSignedStrategy()).build();
   sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
  } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
   logger.warn("Using SSLContexts.createSystemDefault()");
   SSLContext sslContext = SSLContexts.createSystemDefault();
   sslsf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
  }
  CloseableHttpClient httpClient = HttpClients.custom()
    .setUserAgent(USER_AGENT)
    .disableAutomaticRetries()
    .disableCookieManagement()
    .setSSLSocketFactory(sslsf).build();
  try {
   HttpGet httpGet = new HttpGet(url);
   CloseableHttpResponse response = httpClient.execute(httpGet);
   return response.getStatusLine().getStatusCode();
  } finally {
   httpClient.close(); 
  }
 } 

但是当我尝试在Tomcat上运行它时,我得到了这个错误:

Received fatal alert: internal_error
javax.net.ssl.SSLException: Received fatal alert: internal_error
    at sun.security.ssl.Alerts.getSSLException(Unknown Source) ~[na:1.8.0_91]
    at sun.security.ssl.Alerts.getSSLException(Unknown Source) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) ~[na:1.8.0_91]
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) ~[na:1.8.0_91]
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) ~[httpclient-4.5.jar:4.5]
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) ~[httpclient-4.5.jar:4.5]
    at com.ardor.util.HttpResponseUtil.getResponseCode(HttpResponseUtil.java:45) ~[HttpResponseUtil.class:na]
    at com.ardor.controller.jsf.WebsiteCrawlerJsfController.doCrawl(WebsiteCrawlerJsfController.java:80) ~[WebsiteCrawlerJsfController.class:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_91]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_91]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_91]
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278) [jasper-el.jar:7.0.59]
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273) [jasper-el.jar:7.0.59]
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:650) [javax.faces-2.2.8-16.jar:2.2.8-16]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [catalina.jar:7.0.59]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.59]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat7-websocket.jar:7.0.59]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.59]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) [catalina.jar:7.0.59]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) [catalina.jar:7.0.59]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [catalina.jar:7.0.59]
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.59]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) [catalina.jar:7.0.59]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) [tomcat-coyote.jar:7.0.59]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) [tomcat-coyote.jar:7.0.59]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) [tomcat-coyote.jar:7.0.59]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_91]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_91]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-coyote.jar:7.0.59]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_91]

我正在使用Java 7和Apache Tomcat 7.0.59

*****EDIT**:我启用了jvax。如Sangram Jadhav建议的ssl日志输出。这里是:(太长了,所以我只是把它粘贴在一个在线记事本上)

https://shrib.com/see/8kk9lXzMDl3vRZaTOt0v1oJi2ADaToRRP1R0OGCRs6DAVdTkNK?v=nc

这可能是因为JDK8的问题

尝试将JDK/JRE更新到最新的JDK/JRE。从日志中可以清楚地看到您正在使用JDK/JRE 1.8.0_91。

编辑:

在检查Jdk版本时,似乎这个问题仍然没有发布(Build 8u122)。您可以尝试使用早期访问构建。

另一种解决方案是避免设置自定义主机名验证器,因为会出现上述问题。找出在代码中设置主机名验证器的位置。查找下面方法的参考

javax.net.ssl.HttpsURLConnection.setHostnameVerifier

并删除该代码

相关内容

最新更新