我需要为 Java 应用程序设置一个真正轻量级的 HTTPS 服务器。这是一个模拟器,在我们的开发实验室中用于模拟野外设备接受的 HTTPS 连接。因为它纯粹是一个轻量级的开发工具,根本不以任何方式用于生产,我很乐意绕过认证和尽可能多的协商。
我计划在 Java 6 SE 中使用 HttpsServer
类,但我正在努力让它工作。作为测试客户端,我使用 cygwin 命令行中的 wget
(wget https://[address]:[port]
) 但 wget
报告它“无法建立 SSL 连接”。
如果我使用 -d
选项运行 wget
进行调试,它会告诉我“SSL 握手失败”。
我花了 30 分钟在谷歌上搜索,一切似乎都指向了相当无用的 Java 6 文档,该文档描述了这些方法,但实际上并没有谈论如何让该死的东西说话或提供任何示例代码.
谁能把我推向正确的方向?
最佳答案
我最终使用的是这个:
try {
// Set up 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);
// Set up the key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
// Set up the trust manager factory
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
// Set up 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");
}
要生成 keystore :
$ keytool -genkeypair -keyalg RSA -alias self_signed -keypass simulator \
-keystore lig.keystore -storepass simulator
另见 here .
可能 storepass 和 keypass 可能不同,在这种情况下 ks.load
和 kmf.init
必须分别使用 storepass 和 keypass。
关于java - 简单的 Java HTTPS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2308479/