Vert.x是一个基于netty的使用异步非阻塞开发模型构建响应式和分布式系统的工具包。
本文基于Vert.x开发一个server及client, cleint通过ssl方式与server通信。
一、准备工作
1. 下载Vertx包
我是在windows上开发、运行这个示例的,所以直接下载vert.x-3.8.1-full.zip,解压就行。
官网下载地址: https://vertx.io/download/
然后再windows环境变量path中加入:D:\zj\apptool\vertx\bin (指向解压的实际目录)
可以再cmd中执行vertx查看版本指令,有如下输出则说明配置OK
2. 准备一个开发用的IDE,eclipse或IDEA都可以
二、编写server端及client端
1. 创建示例项目vertx,目录结构如下
2 pom.xml文件
4.0.0
com.study
vertx
1.0-SNAPSHOT
io.vertx
vertx-core
3.8.1
io.netty
netty-tcnative-boringssl-static
2.0.25.Final
src/main/resources/*.jcs
maven-compiler-plugin
3.1
1.8
3. 实现server
import io.vertx.core.Promise;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerOptions;
import io.vertx.core.net.JksOptions;
public class Server extends AbstractVerticle{
@Override
public void start(Promise startPromise) {
HttpServer server =
vertx.createHttpServer(new HttpServerOptions().setSsl(true).setKeyStoreOptions(
new JksOptions().setPath("serverKeystore.jks").setPassword("server")
));
server.requestHandler(req -> {
req.response().putHeader("content-type", "text/plain").end("Hello from vert.x");
}).listen(4443,http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on http://localhost:4443");
} else {
startPromise.fail(http.cause());
}
});
}
}
服务的监听端口为本机4443,启用SSL通信(keystore相关的,详见4中介绍)。启动成功后在控制台打印:HTTP server started on http://localhost:4443
这个server比较简单,对接收到的任何client端请求,都回应:Hello from vert.x
4. 实现client
package com.study.vertx;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpClientOptions;
import io.vertx.core.net.JksOptions;
public class Client extends AbstractVerticle {
@Override
public void start(Promise startPromise){
vertx.createHttpClient(new HttpClientOptions().setSsl(true)
.setTrustStoreOptions(new JksOptions().setPath("clientTruststore.jks").setPassword("client")))
.getNow(4443, "localhost", "/", resp -> {
System.out.println("Got response " + resp.statusCode());
resp.bodyHandler(body -> System.out.println("Got data " + body.toString("utf-8")));
vertx.close();
});
}
}
客户端建立到服务端的连接,也启用SSL(keystore相关的,详见4中介绍),连接成功后读取服务端的响应代码及消息并打印到控制台,然后退出。
5. keystore文件
在项目目录中,resources目录下有2个resource文件,在server及client的代码中用到了。
5.1 生成服务包含Public key和Private Key的keystore文件,命名为serverKeystore.jks:
keytool -genkey -alias server -keystore serverKeystore.jks -keypass server -storepass server -keyalg RSA -keysize 2048 -validity 3650 -v -dname "CN = localhost,O = IT,L=SH, ST=SH, C=CN,OU = Company"
注意:CN提供的服务器IP或域名(客户端连接时必须一致),本示例中由于是在本机测试,所以用的是localhost
server代码中需要用到serverKeystore.jks及密码server
5.2 从jks文件中提取证书文件,命名为server.cer
keytool -export -alias server -keystore serverKeystore.jks -storepass server -file server.cer
5.3 生成客户端keystore文件,并将服务证书导入进去。
keytool -import -alias trustServer -file server.cer -keystore clientTruststore.jks -storepass client
客户端keystore文件名为clientTruststore.jks,密码为:client。client代码中需要用到clientTruststore.jks及密码client
三、运行
1 打开CMD, 进入项目目录下的target\classes目录(比如,D:\git\study\vertx\target\classes)
注意:要确保serverKeystore.jks和clientTruststore.jks文件再classes目录下
2 用vertx启动server
3 再打开一个CMD,同样进入项目目录下的target\classes目录(比如,D:\git\study\vertx\target\classes)
4 用vertx启动client
客户端连服务端成功,接收到了从服务端响应的消息
5 抓包检验是否SSL连接通信
通过抓包可以看到,server与client直接是通过SSL方式传递应用数据的。
至此,基于vertx的SSL server与client通信Demo就完成了。在验证过程中,有一坑,生成服务端keystore文件时,keystore的密码与证书密码必须一样,否则启动server会失败。