【问题标题】:how to enable ssl on tomcat 8 embedded javascript/json/java webapp如何在 tomcat 8 嵌入式 javascript/json/java webapp 上启用 ssl
【发布时间】:2016-04-11 07:55:49
【问题描述】:

我已经尝试了可能的事情来让它工作。我有一个正在开发的网络应用程序。通过 json 与 java 后端对话的 javascript 前端。整个事情运行在嵌入式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();

我只想要一个简单的网络服务,理想地嵌入,以便部署和配置简单。

为了生成密钥对,我使用了以下命令:

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,即使我在那里列出,仍然无法弄清楚。

【问题讨论】:

  • 你遇到了什么错误?
  • 通常,当您被要求提供错误时,最好编辑问题并包含它们,这样更容易不会错过任何细节。此外,当端口打开但证书未正确安装在服务器上时,也会发生该错误。

标签: java tomcat web-applications embedded-tomcat-8


【解决方案1】:

这与提出的问题无关,但我得到了同样的例外。我正在尝试测试我的代码(rest api 调用),我使用的是https://localhost:2001,但在方法名称中发现了无效字符(CR 或 LF)。

问题是我应该使用 http 而不是 https。

【讨论】:

    【解决方案2】:

    我也有同样的问题。

    您是否尝试在 heroku 上运行此代码?

    如果,是的,也许你可以使用这个:

    https://robots.thoughtbot.com/set-up-cloudflare-free-ssl-on-heroku

    【讨论】:

      【解决方案3】:

      对此持保留态度,因为我从未配置过 Tomcat。

      话虽如此,您似乎已经使用您的证书在 8843 上配置了服务器(您的意思是使用 8443 吗?),但尚未为 443 配置它。我认为您需要为 443 服务器配置好吧。现在,如果您在 443 上连接,您可能没有连接加密,这可能是您收到这些错误的原因。

      在您的原始配置中,您的站点在端口 80 上运行。另一个建议是尝试在 443 上运行。更改 httpsConnector.setPort(8843); 到 httpsConnector.setPort(443);

      【讨论】:

      • 我把它的所有端口都切换到了 443,它连接到它但不是在安全模式下。我想这三行应该把它放在安全模式httpsConnector.setPort(443); httpsConnector.setSecure(true); httpsConnector.setScheme("https");
      猜你喜欢
      • 2015-09-11
      • 2019-02-09
      • 2012-06-11
      • 2015-07-17
      • 1970-01-01
      • 2010-10-31
      • 2020-04-06
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多