问题
我们面临着从美国登录到来自Digitalocean的纽约市数据中心的服务的问题。他报告了一个通用的http连接问题。其他来自欧洲的客户则没有问题。
我还可以确认客户端无法创建与授权服务的会话。
架构
我们有一个webapp,一个第三方SSO提供者,一个授权服务和一个资源服务。这些服务使用HTTPS,而webapp则不使用。
这些服务是Spring Boot (1.4.1.RELEASE) REST控制器,带有spring-boot-starter-security、spring-boot-starter-web和unirest-java (1.4.9),由MongoDB支持。
日志
资源服务
2016-10-29 15:37:57.282 ERROR 5 --- [nio-8444-exec-4] o.a.coyote.http11.Http11NioProtocol : Error reading request, ignored
java.lang.NullPointerException: null
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.getSslSupport(NioEndpoint.java:1329) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:792) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_11]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_11]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_11]身份验证服务
2016-10-29 15:37:57.279 ERROR 7 --- [nio-8443-exec-6] o.a.coyote.http11.Http11NioProtocol : Error reading request, ignored
java.lang.NullPointerException: null
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.getSslSupport(NioEndpoint.java:1329) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:792) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_11]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_11]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar!/:8.5.5]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_11]问题
我不知道为什么会弹出这个异常,而且只针对这个特定的客户端。你能帮帮我吗?我会提供更多的信息。
发布于 2016-10-30 01:38:56
基于this topic,它似乎是Http11NioProtocol中的一个bug。作为解决方法,他们建议使用Http2NioProcol。
以下是如何在spring boot中配置Htpp2NioProtocol的示例。
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http2NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File keystore = new ClassPathResource("keystore").getFile();
File truststore = new ClassPathResource("keystore").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
protocol.setKeystorePass("changeit");
protocol.setTruststoreFile(truststore.getAbsolutePath());
protocol.setTruststorePass("changeit");
protocol.setKeyAlias("apitester");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access keystore: [" + "keystore"
+ "] or truststore: [" + "keystore" + "]", ex);
}
}ps:我认为这不会真正解决问题,但会给你一个更好的错误信息,而不是NPE。我还建议您获取无法连接到您的服务的用户的浏览器和操作系统信息。可能他的计算机无法解析你的服务器证书的证书链。
https://stackoverflow.com/questions/40321174
复制相似问题