首页 > 解决方案 > 使用 HttpsServer 创建 TLS/SSL 服务器

问题描述

我整天都在尝试用 java 制作服务器 TLS/SSL HTTPS。有人能帮我吗?

这是我的代码

static class MyHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange t) throws IOException {
        System.out.println("called");
        String response = "This is the response";
        t.sendResponseHeaders(200, response.length());
        OutputStream os = t.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }
}

static HttpsServer server = null;
static int port = 9000;

public static void main(String[] args) throws Exception {
    String keystoreFilename = "/home/kratess/" + "mykey.keystore";
    char[] storepass = "mypassword".toCharArray();
    char[] keypass = "mypassword".toCharArray();
    String alias = "alias";
    FileInputStream fIn = new FileInputStream(keystoreFilename);
    KeyStore keystore = KeyStore.getInstance("JKS");
    keystore.load(fIn, storepass);

    // display certificate
    Certificate cert = keystore.getCertificate(alias);
    System.out.println(cert);

    // setup the key manager factory
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(keystore, keypass);

    // setup the trust manager factory
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(keystore);



    server = HttpsServer.create(new InetSocketAddress(port), 0);

    // create ssl context
    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");

    // setup the HTTPS context and parameters
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    server.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
        public void configure(HttpsParameters params) {
            try {
                // initialise the SSL context
                SSLContext c = SSLContext.getDefault();
                SSLEngine engine = c.createSSLEngine();
                params.setNeedClientAuth(true);
                params.setCipherSuites(engine.getEnabledCipherSuites());
                params.setProtocols(engine.getEnabledProtocols());
                // get the default parameters
                SSLParameters defaultSSLParameters = c.getDefaultSSLParameters();
                params.setSSLParameters(defaultSSLParameters);
            } catch (Exception ex) {
                ex.printStackTrace();
                System.out.println("Failed to create HTTPS server");
            }
        }
    });

    System.out.println("server started at " + port);
    server.createContext("/test", new MyHandler());
    server.setExecutor(null);

    server.start();
}

服务器启动,但它和证书在 chrome 上不起作用。证书打印在控制台中并且全部完成。

Chrome 给出了响应ERR_EMPTY_RESPONSE

此外,没有调用 HttpHandler 。

我哪里错了?如果此解决方案不起作用,有人可以建议我必须使用什么吗?我需要对此 HTTPS 进行编码以创建 WebHook 页面(需要 SSL)

标签: javasocketssslhttps

解决方案


推荐阅读