簡體   English   中英

如何在tomcat 8嵌入式javascript / json / java webapp上啟用ssl

[英]how to enable ssl on tomcat 8 embedded javascript/json/java webapp

我已經嘗試過一些可能使它工作的事情。 我有一個正在開發的Web應用程序。 通過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();

我只想要一個理想的嵌入式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) 

蝕控制台會吐出痕跡

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,仍然無法弄清楚。

這與所問的問題無關,但我有同樣的例外。 我正在嘗試測試我的代碼(其余api調用),並且我使用的是https:// localhost:2001,並且在方法名稱中發現了無效字符(CR或LF)。

問題是我應該使用http而不是https。

一點點地考慮一下,因為我從未配置過Tomcat。

話雖如此,看來您已經在8843上配置了帶有證書的服務器(您是要使用8443嗎?),但尚未為443配置它。我想您也需要為443服務器配置。 現在,如果您在443上進行連接,則可能未連接加密,並且可能是為什么收到這些錯誤的原因。

在您的原始配置中,站點在端口80上運行。另一個建議是嘗試僅在443上運行。更改httpsConnector.setPort(8843);。 到httpsConnector.setPort(443);

我也有同樣的問題。

您是否嘗試在heroku上運行此代碼?

如果可以,則可以使用以下方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM