上一章用内置的jetty搭建了web服务,主要是加载容器和选择通道,这次我们来搭建一个支持安全协议SSL的web服务,即https。
我们先来复习两种加密的方式,一种是对称加密,另一种是非对称加密。
对称加密就是解密和加密的秘钥是一样的,代表性的为AES算法。这种传输的效率要高一些,但是保密性较差,因为秘钥的保管十分重要。
非对称加密就是加密的秘钥和解密的秘钥不相等,也就是分为公钥和私钥。这样可以保证安全性,但是传输的效率会低一些,代表性为RSA算法,因此在一般的加密情况下我们采用非对称加密的方式去传输对称加密的秘钥,然后采用AES传输主要的数据。

1、我们首先使用JDK自带的加密工具生成秘钥:

keytool -keystore keystore -alias jetty -genkey -keyalg RSA

输入相应的秘钥,需要输入两个秘钥,,分别输入password1,password2。
这样生成keystore文件,存放在webapp下面。
2、让后导出证书:

keytool -export -alias jetty -file jetty.crt -keystore keystore

3、生成OBA文件:

java -cp jetty-util-9.3.8.v20160314.jar org.eclipse.jetty.util.security.Password <your password>

PS:jar包对应自己的版本。密码填写自己的密码。

启动代码

private static int PORT = 8089;
public static void main(String[] args) {
		startJettyByHttps();
	}
public static void startJettyByHttps() {
		Server server = new Server();

		HttpConfiguration https_config = new HttpConfiguration();
		https_config.setSecureScheme("https");

		SslContextFactory sslContextFactory = new SslContextFactory();
		sslContextFactory.setKeyStorePath("./webapp/keystore");
		// 私钥
		sslContextFactory.setKeyStorePassword("password1");
		// 公钥
		sslContextFactory.setKeyManagerPassword("password2");

		ServerConnector httpsConnector = new ServerConnector(server,
		        new SslConnectionFactory(sslContextFactory,"http/1.1"),
		        new HttpConnectionFactory(https_config));
		        // 设置访问端口
		httpsConnector.setPort(PORT);
		httpsConnector.setIdleTimeout(IDLE_THREAD_NUM);
		server.addConnector(httpsConnector);

		WebAppContext webApp = new WebAppContext();
		webApp = new WebAppContext();
		webApp.setContextPath("/");
		webApp.setResourceBase("./webapp");
		server.setHandler(webApp);

		try {
			server.start();
			server.join();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		finally {
			httpsConnector.close();
		}
}

启动访问:https://localhost:8089/ 提示不安全证书,信任即可访问。

看了此篇文章是不是感觉收获蛮大

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐