用 Java 创建一个简单的 Web 服务器 (2) - HTTPS 服务器
使用 JDK 创建一个简单且灵活的 HTTPS 服务器来处理 GET/POST 请求
引言
在我的上一篇提示中,我介绍了如何创建简单的 HTTP 服务器,它可以在 这里 获取。这个简单的服务器足够灵活,可以融入到您自己的项目中。
本提示将扩展这个想法并创建一个简单的 HTTPS 服务器。
背景
HTTPS(安全超文本传输协议)是一个安全的协议,通常用于确保互联网上的安全通信。HTTPS 使用包含私钥和公钥对的数字证书来验证发送者和接收者。发送者用公钥加密信息并发送数据,然后接收者通过用私钥解密数据来获取信息,反之亦然。
Using the Code
自 Java 1.6 起,J2EE SDK 中就包含了一个内置的 HTTP/HTTPS 服务器。 可以在这里下载该库。
步骤
- 准备证书
- 加载证书
- 启动服务器
- 测试
1. 准备证书
在 Java 中,我们可以使用 keytool(随 JDK 一起安装)来生成证书。 keytool 是一个 Java 数字证书管理工具。 基本上,keytool 将私钥和证书这两条信息存储到一个密钥库文件中。 keytool 可以用于生成本地服务器证书 - 该证书有效,但未被 CA(证书颁发机构)识别,因为它仅是自签名的。 有关如何使用此工具创建证书的更多详细信息,请参见此处。
例如
打开命令行(终端),输入
keytool -genkey -alias alias -keypass mypassword -keystore mykey.keystore -storepass mypassword
-genkey
:必需参数-alias
:指定别名-keypass
:指定私钥的密码-keystore
:指定密钥文件名-storepass
:指定密钥的密码
按照以下步骤输入一些认证信息,并在最后输入“y
”。
一个名为 mykey.keystore 的文件将在当前文件夹中创建。 这就是证书。
实际上,在实际项目中,我们从 CA 颁发者申请证书。 这里是一个列表。
2. 加载证书
现在,我们可以编程来加载证书
// load certificate
String keystoreFilename = getPath() + "mycert.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);
3. 启动服务器
我们需要创建一个 HttpsServer
对象,并使用 https 上下文将其初始化为证书绑定
// create https server
server = HttpsServer.create(new InetSocketAddress(port), 0);
// create ssl context
SSLContext sslContext = SSLContext.getInstance(protocol);
// 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(false);
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");
}
}
});
4. 测试
打开浏览器(例如 Internet Explorer),输入 https://:9000/ 并单击导航,您将获得如下警报
由于我们手动创建了自签名证书,并且不是由 CA 颁发的,因此浏览器无法识别它。 因此,我们得到了一个安全警报。 单击继续,我们将看到服务器状态。
您可以测试其他请求处理程序,例如 echoHeader
、echoGet
、echoPost(有关处理程序的详细信息,请参阅上一篇文章)。
测试 echoHeader
处理程序
测试 echoGet
处理程序
历史
- 2015年10月24日:第一个版本