как включить ssl на встроенном javascript/json/java веб-приложении tomcat 8

Я пробовал многое, чтобы заставить это работать. У меня есть веб-приложение, которое я разрабатываю. 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();

Я просто хочу простую веб-службу, которая идеально встроена, чтобы ее развертывание и настройка были простыми.

для генерации пары ключей я использовал команду:

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, хотя я перечисляю там, все еще не могу понять.


person mmartin    schedule 07.01.2016    source источник
comment
какие ошибки вы получаете?   -  person saljuama    schedule 07.01.2016
comment
обычно, когда вас просят указать ошибки, лучше отредактировать вопрос и включить их, чтобы не упустить ни одной детали. Также эта ошибка возникает, когда порт открыт, но сертификат неправильно установлен на сервере.   -  person saljuama    schedule 07.01.2016


Ответы (3)


Это не связано с заданным вопросом, но у меня такое же исключение. Я пытался протестировать свой код (остальный вызов API) и использовал https://localhost:2001, и я получил В имени метода обнаружен недопустимый символ (CR или LF).

Проблема в том, что я должен использовать http, а не https.

person Arun    schedule 14.03.2016

Отнеситесь к этому с недоверием, потому что я никогда не настраивал Tomcat.

С учетом сказанного похоже, что вы настроили сервер на 8843 (вы имели в виду использовать 8443?) с вашим сертификатом, но не настроили его для 443. Я думаю, вам также понадобится конфигурация для сервера 443. Прямо сейчас, если вы подключаетесь к 443, вы, вероятно, не подключаетесь зашифрованным, и, возможно, поэтому вы получаете эти ошибки.

В исходной конфигурации у вас был сайт, работающий на порту 80. Другое предложение было бы запустить, чтобы попробовать просто запустить на 443. Измените httpsConnector.setPort(8843); в httpsConnector.setPort(443);

person sbjustin    schedule 08.01.2016
comment
Я переключил все порты на 443, он подключается к нему, но не в безопасном режиме. я бы подумал, что три строки должны поместить его в безопасный режим httpsConnector.setPort(443); httpsConnector.setSecure(true); httpsConnector.setScheme("https"); - person mmartin; 09.01.2016

У меня такая же проблема.

Вы пытались запустить этот код на героку?

Если да, возможно, вы можете использовать это:

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

person Kleman    schedule 11.01.2016