基于Vertx的SSL通信

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

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.study</groupId>
    <artifactId>vertx</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

    <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-core</artifactId>
        <version>3.8.1</version>
    </dependency>

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-tcnative-boringssl-static</artifactId>
        <version>2.0.25.Final</version>
    </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources/*.jcs</directory>
            </resource>
        </resources>
        <pluginManagement>
            <plugins>
                <!-- We specify the Maven compiler plugin as we need to set it to Java 1.8 -->
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

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<Void> 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<Void> 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会失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值