我已尝试过让这项工作得以实现的事情。我有一个我正在开发的网络应用程序。 javascript前端,通过json与java后端进行通信。整个东西在嵌入式tomcat 8实例上运行。它工作正常,直到我尝试启用ssl / tls加密。
在添加ssl之前
Tomcat tomcat = new Tomcat();
String webappDirLocation = "src/main/webapp/";
String webPort = System.getenv("PORT");
if (webPort == null || webPort.isEmpty()) {
webPort = "8080";
}
tomcat.setPort(Integer.valueOf(webPort));
Connector connector = tomcat.getConnector();
connector.setURIEncoding("UTF-8");
tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());
tomcat.start();
tomcat.getServer().await();
在我尝试使用自签名证书添加ssl之后。
Tomcat tomcat = new Tomcat();
String tmp = "1q2w3e4r5t";
String filePathToStore = "src/main/app/ssl/keystore.jks";
char[] keystorePasswordCharArray = tmp.toCharArray();
Connector httpsConnector = new Connector();
httpsConnector.setPort(8843);
httpsConnector.setSecure(true);
httpsConnector.setScheme("https");
httpsConnector.setAttribute("keyAlias", "tomcat");
httpsConnector.setAttribute("keystorePass", keystorePasswordCharArray);
httpsConnector.setAttribute("keystoreFile", new File(filePathToStore));
httpsConnector.setAttribute("clientAuth", "false");
httpsConnector.setAttribute("sslProtocol", "TLS");
httpsConnector.setAttribute("SSLEnabled", true);
Service service = tomcat.getService();
service.addConnector(httpsConnector);
Connector defaultConnector = tomcat.getConnector();
defaultConnector.setRedirectPort(443);
String webappDirLocation = "src/main/webapp/";
Connector connector = tomcat.getConnector();
connector.setURIEncoding("UTF-8");
tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());
tomcat.start();
tomcat.getServer().await();
我只想要一个理想嵌入的简单Web服务,以便部署和配置简单。
生成密钥对我使用了命令:
keytool -genkeypair -keystore keystore.jks -keyalg RSA -alias tomcat
然后我将keystore.jks复制到我的app / ssl /目录中。
它将运行并编译,没有错误。当我试图通过https:\\ localhost访问该网站时,Firefox抱怨:
(Error code: ssl_error_rx_record_too_long)
并且eclipse控制台会吐出一条痕迹
Jan 06, 2016 9:14:25 PM org.apache.coyote.http11.AbstractHttp11Processor process
INFO: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character (CR or LF) found in method name at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:228)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1010)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
仍然可以通过http:\\ localhost:443访问该站点。安装证书需要做什么?从密钥库导出并将其放入浏览器?我只期待一条警告信息。
继续进行故障排除我发现了一个名为SSLPoke的简单程序,这是我得到的错误:
java SSLPoke localhost 443
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at sun.security.ssl.InputRecord.handleUnknownRecord(Unknown Source)
at sun.security.ssl.InputRecord.read(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
at sun.security.ssl.AppOutputStream.write(Unknown Source)
at sun.security.ssl.AppOutputStream.write(Unknown Source)
at SSLPoke.main(SSLPoke.java:23)
所以看来我的联系并没有说https,即使我在那里列出,仍然无法弄明白。
答案 0 :(得分:3)
这与提出的问题无关,但我得到了同样的例外。我试图测试我的代码(休息api调用),我正在使用https://localhost:2001,并且我在方法名称中找到了无效字符(CR或LF)。
问题是我应该使用http而不是https。
答案 1 :(得分:0)
因为我从来没有配置过Tomcat,所以带着一点点盐。
据说看起来你已经在8843上配置了一个服务器(你的意思是使用8443吗?)和你的证书但没有为443配置它。我认为你需要为443服务器配置好。现在,如果你在443上连接,你可能没有连接加密,也可能是你收到这些错误的原因。
在原始配置中,您的站点在端口80上运行。将运行另一个建议以尝试仅在443上运行。更改httpsConnector.setPort(8843); 至 httpsConnector.setPort(443);
答案 2 :(得分:-2)
我有同样的问题。
您是否尝试在heroku上运行此代码?
如果,是的,你可以使用它:
https://robots.thoughtbot.com/set-up-cloudflare-free-ssl-on-heroku