65.9K
CodeProject 正在变化。 阅读更多。
Home

用 Java 创建一个简单的 Web 服务器 (2) - HTTPS 服务器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (4投票s)

2015年10月24日

CPOL

2分钟阅读

viewsIcon

52110

downloadIcon

1602

使用 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 颁发的,因此浏览器无法识别它。 因此,我们得到了一个安全警报。 单击继续,我们将看到服务器状态。

您可以测试其他请求处理程序,例如 echoHeaderechoGet、echoPost(有关处理程序的详细信息,请参阅上一篇文章)。

测试 echoHeader 处理程序

测试 echoGet 处理程序

历史

  • 2015年10月24日:第一个版本
© . All rights reserved.