java - 简单的 Java HTTPS 服务器

标签 java ssl https java-6

我需要为 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.loadkmf.init 必须分别使用 storepass 和 keypass。

关于java - 简单的 Java HTTPS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2308479/

相关文章:

java - Axis2/Rampart 客户端自签名证书

c# - 如何将我的 Azure 站点启用为 https 而不是 http?

c++ - 我的 https C++ 代码在某些网站上不起作用 (binance)

java - 为网站创建 .jar 文件

.net - Pop3 帮助 C++ 实现!

java - 知道 android 上的默认键盘

amazon-web-services - AWS 上的 Realm 对象服务器 (ROS) : how to make a valid Websocket request?

iis - 在不影响使用此证书的人的情况下,在 IIS 上续订 SSL 证书

java - jgoodies 如何删除使用 PanelBuilder 添加的组件?

java - 消息处理模型3返回错误: Unknown security name