Простой Java HTTPS-сервер
Мне нужно настроить действительно легкий HTTPS-сервер для Java-приложения. Это симулятор, который используется в наших лабораториях разработки, чтобы имитировать соединения HTTPS, принятые частью оборудования в дикой природе. Поскольку это чисто легкий инструмент для разработки и вообще не используется в производстве, я вполне счастлив обойти сертификаты и столько переговоров, сколько смогу.
Я планирую использовать class HttpsServer
в Java 6 SE, но я изо всех сил HttpsServer
заставить его работать. В качестве тестового клиента я использую wget
из командной строки cygwin ( wget https://[address]:[port]
), но wget
сообщает, что это «Не удалось установить соединение SSL».
Если я запустил wget
с параметром -d
для отладки, он сообщает мне, что «SSL-квитирование не сработало».
- Как использовать TLS 1.2 в Java 6
- Apache HttpClient на Android, производящем CertPathValidatorException (имя_отчета! = Имя_почты)
- Как сохранить сертификат SSL удаленного сервера локально как файл
- Определение данных сертификата TLS с помощью Microsoft Edge
- Поддержка Android SSL - SNI
Я потратил 30 минут на поиск в Google, и все, кажется, просто указывает на довольно бесполезную документацию по Java6, описывающую методы, но на самом деле не говорит о том, как заставить говорить о штопании или предоставить какой-либо примерный код вообще.
Может ли кто-нибудь подтолкнуть меня в правильном направлении?
- Получение Chrome для принятия самоподписанного локального сертификата
- Какие версии SSL / TLS поддерживают System.Net.WebRequest?
- Thunderbird: Ошибка: imap.server.com: сервер не поддерживает RFC 5746, см. CVE-2009-3555
- Вызывается SSL-вызов Invoke-WebRequest?
- javax.net.ssl.SSLException: Ошибка чтения: ssl = 0x9524b800: ошибка ввода-вывода во время системного вызова, сброс соединения с помощью одноранговой сети
- Подключение к WebSphere MQ в Java с помощью SSL / Keystore
- Какой простой способ полностью игнорировать ssl с java-url-соединениями?
- Поддерживает ли Android Volley SSL?
В конечном итоге я использовал это:
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. Вы можете проверить это самостоятельно и определить, подходит ли оно вашим потребностям. Надеюсь, вы сочтете это полезным 🙂