我正在尝试使用java套接字创建简单的web服务器,应该支持http &https。但我一次只能做到一个。我需要逻辑支持http @端口80 &HTTPS @ 443端口。
这是使用sslsocket的HTTPS服务器的示例代码。我们可以使用简单的ServerSocket实现HTTP Server。
public class HttpsServer {
public static void main(String[] args) {
try {
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream("/opt/p12file.p12"), "p12pass".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, "p12pass".toCharArray());
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(8080);
while (true) {
SSLSocket c = (SSLSocket) s.accept();
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
w.write("HTTP/1.0 200 OK");
w.newLine();
w.write("Content-Type: text/html");
w.newLine();
w.newLine();
w.write("<html><body><h1>Https Server Works</h1></body></html>");
w.newLine();
w.flush();
w.close();
c.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
有谁能帮帮我吗?如何使SSL服务器套接字同时支持http &java中的HTTPS ?
你不能。HTTP为明文,SSLServerSocket
不支持。
你需要我正在尝试使用java套接字创建简单的web服务器,应该支持http &https。但我一次只能做到一个。我需要逻辑支持http @端口80 &HTTPS @ 443端口。
:
- 一个明文
ServerSocket
监听80 - 和
SSLServerSocket
监听443 - 每个 的accept-loop线程
- 每个接受的套接字一个连接线程。
您永远不会在静态main()
方法中完成它。我建议您阅读Java教程的"自定义网络"部分,然后阅读JSSE参考指南。
你当然也需要好好看看RFC 2616 HTTP 1.1。
正如评论中建议的那样,您应该真正使用现成的东西。
您有两个选择:
-
使用两个不同的端口,一个用于http,一个用于https。
-
SSL Hello检测/端口统一:
在HTTP和HTTPS中,客户端被期望首先对话。所以服务器可以使用这个来检测客户端期望的协议:
- 如果客户端发送TLS ClientHello,则继续TLS握手;
- 如果发送的是普通HTTP请求,则按原样处理请求。
更多信息:
-
Java服务器可以在一个端口上接受SSL和明文连接吗?
-
是否可以将普通套接字更改为SSLSocket?