基于Vertx的SSL通信

Vert.x是一个基于netty的使用异步非阻塞开发模型构建响应式和分布式系统的工具包。

本文基于Vert.x开发一个server及client, cleint通过ssl方式与server通信。

一、准备工作

1. 下载Vertx包

     我是在windows上开发、运行这个示例的,所以直接下载vert.x-3.8.1-full.zip,解压就行。

基于Vertx的SSL通信_第1张图片

    官网下载地址: https://vertx.io/download/

然后再windows环境变量path中加入:D:\zj\apptool\vertx\bin  (指向解压的实际目录

可以再cmd中执行vertx查看版本指令,有如下输出则说明配置OK

2. 准备一个开发用的IDE,eclipse或IDEA都可以

 

二、编写server端及client端

1. 创建示例项目vertx,目录结构如下

基于Vertx的SSL通信_第2张图片

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
                        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

基于Vertx的SSL通信_第3张图片

3 再打开一个CMD,同样进入项目目录下的target\classes目录(比如,D:\git\study\vertx\target\classes)

4 用vertx启动client

客户端连服务端成功,接收到了从服务端响应的消息

 

5 抓包检验是否SSL连接通信

基于Vertx的SSL通信_第4张图片

通过抓包可以看到,server与client直接是通过SSL方式传递应用数据的。

 

      至此,基于vertx的SSL server与client通信Demo就完成了。在验证过程中,有一坑,生成服务端keystore文件时,keystore的密码与证书密码必须一样,否则启动server会失败。

你可能感兴趣的:(vertx)