gpt4 book ai didi

java - 使用 "single sided"身份验证创建纯 Java HTTPS 服务器?

转载 作者:行者123 更新时间:2023-11-30 11:16:16 24 4
gpt4 key购买 nike

我可以轻松地创建一个我需要的 HTTP 纯 Java 服务器。但是,像这样的 HTTPS 服务器:

package httpstest;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsServer;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

public class HttpsTest {

public static void main(String[] args) throws Exception {
HttpsServer server = HttpsServer.create(new InetSocketAddress(8000), 0);
server.setHttpsConfigurator(new HttpsConfigurator(createSSLContext()));
server.createContext("/test", new TestHandler());
server.setExecutor(null); // creates a default executor
server.start();
}

private static SSLContext createSSLContext() throws Exception {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream is = new FileInputStream("server.crt");
InputStream caInput = new BufferedInputStream(is);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);

return context;
}

static class TestHandler implements HttpHandler {

@Override
public void handle(HttpExchange t) throws IOException {
String response = "Successfully connected!";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}

将在服务器端编译和运行而不会出现错误,但会从浏览器中产生 SSL 错误。看起来服务器希望浏览器拥有相同的证书。我希望任何浏览器在没有安装证书的情况下通过 HTTPS 连接到它(就像有人会连接到 https://www.google.com 一样)

最佳答案

这是可能的。下面是关键代码:

SSLContext sslContext = SSLContext.getInstance("TLS");
char[] keystorePassword = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("filename.jks"), keystorePassword);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keystorePassword);
sslContext.init(kmf.getKeyManagers(), null, null);
HttpsConfigurator configurator = new HttpsConfigurator(sslContext);

关于java - 使用 "single sided"身份验证创建纯 Java HTTPS 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24959605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com