Простой Java HTTPS-сервер

Мне нужно настроить действительно легкий HTTPS-сервер для Java-приложения. Это симулятор, который используется в наших лабораториях разработки, чтобы имитировать соединения HTTPS, принятые частью оборудования в дикой природе. Поскольку это чисто легкий инструмент для разработки и вообще не используется в производстве, я вполне счастлив обойти сертификаты и столько переговоров, сколько смогу.

Я планирую использовать class HttpsServer в Java 6 SE, но я изо всех сил HttpsServer заставить его работать. В качестве тестового клиента я использую wget из командной строки cygwin ( wget https://[address]:[port] ), но wget сообщает, что это «Не удалось установить соединение SSL».

Если я запустил wget с параметром -d для отладки, он сообщает мне, что «SSL-квитирование не сработало».

Я потратил 30 минут на поиск в Google, и все, кажется, просто указывает на довольно бесполезную документацию по Java6, описывающую методы, но на самом деле не говорит о том, как заставить говорить о штопании или предоставить какой-либо примерный код вообще.

Может ли кто-нибудь подтолкнуть меня в правильном направлении?

В конечном итоге я использовал это:

 try { // setup the socket address InetSocketAddress address = new InetSocketAddress ( InetAddress.getLocalHost (), config.getHttpsPort () ); // initialise the HTTPS server HttpsServer httpsServer = HttpsServer.create ( address, 0 ); SSLContext sslContext = SSLContext.getInstance ( "TLS" ); // initialise the keystore char[] password = "simulator".toCharArray (); KeyStore ks = KeyStore.getInstance ( "JKS" ); FileInputStream fis = new FileInputStream ( "lig.keystore" ); ks.load ( fis, password ); // setup the key manager factory KeyManagerFactory kmf = KeyManagerFactory.getInstance ( "SunX509" ); kmf.init ( ks, password ); // setup the trust manager factory TrustManagerFactory tmf = TrustManagerFactory.getInstance ( "SunX509" ); tmf.init ( ks ); // setup the HTTPS context and parameters sslContext.init ( kmf.getKeyManagers (), tmf.getTrustManagers (), null ); httpsServer.setHttpsConfigurator ( new HttpsConfigurator( sslContext ) { public void configure ( HttpsParameters params ) { try { // initialise the SSL context SSLContext c = SSLContext.getDefault (); SSLEngine engine = c.createSSLEngine (); params.setNeedClientAuth ( false ); params.setCipherSuites ( engine.getEnabledCipherSuites () ); params.setProtocols ( engine.getEnabledProtocols () ); // get the default parameters SSLParameters defaultSSLParameters = c.getDefaultSSLParameters (); params.setSSLParameters ( defaultSSLParameters ); } catch ( Exception ex ) { ILogger log = new LoggerFactory ().getLogger (); log.exception ( ex ); log.error ( "Failed to create HTTPS port" ); } } } ); LigServer server = new LigServer ( httpsServer ); joinableThreadList.add ( server.getJoinableThread () ); } catch ( Exception exception ) { log.exception ( exception ); log.error ( "Failed to create HTTPS server on port " + config.getHttpsPort () + " of localhost" ); } 

Чтобы создать хранилище ключей:

 $ keytool -genkey -alias alias -keypass simulator \ -keystore lig.keystore -storepass simulator 

См. Также здесь .

Потенциально храните и клавиатура могут быть разными, и в этом случае ks.load и kmf.init должны использовать пропускную способность и keypass соответственно.

Я обновил ваш ответ для https-сервера (не на основе сокетов), он может помочь с CSRF и AJAX Call

 import java.io.*; import java.net.InetSocketAddress; import java.lang.*; import java.net.URL; import com.sun.net.httpserver.HttpsServer; import java.security.KeyStore; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.TrustManagerFactory; import com.sun.net.httpserver.*; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; import java.io.InputStreamReader; import java.io.Reader; import java.net.URLConnection; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; import java.net.InetAddress; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpsExchange; public class SimpleHTTPSServer { public static class MyHandler implements HttpHandler { @Override public void handle(HttpExchange t) throws IOException { String response = "This is the response"; HttpsExchange httpsExchange = (HttpsExchange) t; t.getResponseHeaders().add("Access-Control-Allow-Origin", "*"); t.sendResponseHeaders(200, response.length()); OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); } } /** * @param args */ public static void main(String[] args) throws Exception { try { // setup the socket address InetSocketAddress address = new InetSocketAddress(8000); // initialise the HTTPS server HttpsServer httpsServer = HttpsServer.create(address, 0); SSLContext sslContext = SSLContext.getInstance("TLS"); // initialise the keystore char[] password = "password".toCharArray(); KeyStore ks = KeyStore.getInstance("JKS"); FileInputStream fis = new FileInputStream("testkey.jks"); ks.load(fis, password); // setup the key manager factory KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, password); // setup the trust manager factory TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); tmf.init(ks); // setup the HTTPS context and parameters sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext) { public void configure(HttpsParameters params) { try { // initialise the SSL context SSLContext c = SSLContext.getDefault(); SSLEngine engine = c.createSSLEngine(); params.setNeedClientAuth(false); params.setCipherSuites(engine.getEnabledCipherSuites()); params.setProtocols(engine.getEnabledProtocols()); // get the default parameters SSLParameters defaultSSLParameters = c.getDefaultSSLParameters(); params.setSSLParameters(defaultSSLParameters); } catch (Exception ex) { System.out.println("Failed to create HTTPS port"); } } }); httpsServer.createContext("/test", new MyHandler()); httpsServer.setExecutor(null); // creates a default executor httpsServer.start(); } catch (Exception exception) { System.out.println("Failed to create HTTPS server on port " + 8000 + " of localhost"); exception.printStackTrace(); } } } 

Чтобы создать самозаверяющий сертификат

 keytool -genkey -keyalg RSA -alias selfsigned -keystore testkey.jks -storepass password -validity 360 -keysize 2048 

Просто напоминание другим: com.sun.net.httpserver.HttpsServer в вышеприведенных решениях не является частью стандарта Java, но является запатентованным и поставляется только с Sun / Oracle JVM, поэтому это не будет работать ни на одной другой исполняемой среде Java ,

Существует несколько облегченных HTTP-серверов, которые вы можете встроить в свое приложение, поддерживающее HTTPS и запускаемое на любой JVM.

Одним из них является JLHTTP – легкий HTTP-сервер Java, который представляет собой крошечный сервер с одним файлом (или до 50K / 35K jar) без зависимостей. Настройка хранилища ключей, SSLContext и т. Д. Аналогична описанной выше, поскольку она также зависит от стандартной реализации JSSE или вы можете указать стандартные системные свойства для настройки SSL. Подробные сведения см. В разделе « Вопросы и ответы», а также код и его документацию.

Отказ от ответственности: Я автор JLHTTP. Вы можете проверить это самостоятельно и определить, подходит ли оно вашим потребностям. Надеюсь, вы сочтете это полезным 🙂

  • Не удалось установить доверительные отношения для безопасного канала SSL / TLS - SOAP
  • Как заставить SSL / https в Express.js
  • Ошибка «Нет равных сертификатов» в Android 2.3, но НЕ в 4
  • как получить закрытый ключ из файла PEM?
  • Что происходит на проводе при настройке соединения TLS / LDAP или TLS / HTTP?
  • Заставить браузер загружать «https» версию веб-сайта, а не «http»?
  • Как отключить предупреждение ненадежного соединения Firefox с использованием Selenium?
  • Delphi: idHttp + SSL
  • Обновление для Mac OS X Lion 10.7.2 прерывает SSL
  • Сколько информации может видеть мой интернет-провайдер?
  • Проблемы с использованием Maven и SSL за прокси-сервером
  • Interesting Posts

    пароль и подтверждение подтверждения поля пароля угловые2 реактивные формы

    Какую команду мне нужно использовать для удаления файла с именем `-rf`?

    Internet Explorer игнорирует cookies на некоторых доменах (не может читать или устанавливать cookies)

    Как я могу улавливать и обрабатывать данные из ответов XHR с помощью casperjs?

    Как SHA512 может сделать длинную строку в короткую строку

    Ошибка метатег-метаданных в Content-Security-Policy. Ошибка в приложении для телефонного разговора.

    Как сериализовать / десериализовать словаря `из пользовательского XML, не использующего XElement?

    Сериализация XML и унаследованные типы

    Диапазон пропускания полосы 5GHZ очень короткий

    Как создать точную копию массива?

    Gcc автоматически инициализирует статические переменные до нуля?

    привязки, не разрешающие обработку АСТ в eclipse

    Android – ручка «Enter» в EditText

    Запретить добавление приложений для запуска экрана при установке

    Самый неприятный синтаксический анализ: почему A a (()); Работа?

    Давайте будем гением компьютера.