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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vertx Modbus是一个运行在Vert.x平台上的Modbus协议实现。Modbus是一种用于工业自动化和通信通信协议,在工业控制系统中广泛使用。Vertx Modbus提供了一个高效、易于使用的方式来实现Modbus通信Vertx Modbus使用异步、非阻塞的方式处理通信请求,可以轻松地处理大量的并发请求,确保系统的高性能和可扩展性。它能够与不同的Modbus设备进行通信,包括Modbus TCP和Modbus RTU设备。此外,Vertx Modbus还支持多种功能码(Function Code)的操作,例如读取寄存器、写入寄存器、读取输入寄存器等。 Vertx Modbus还提供了一套灵活的API,使得开发者可以方便地创建Modbus客户端或服务器。使用Vertx Modbus,我们可以轻松地实现基于Modbus的工业自动化系统,例如数据采集、设备控制、数据监控等。 Vertx Modbus还支持Modbus协议的安全性,包括连接加密和用户认证。这确保了数据的安全传输和对系统的访问控制。 综上所述,Vertx Modbus是一个灵活、高性能、易于使用的Modbus协议实现。它使得开发者能够轻松地与Modbus设备进行通信,并实现各种工业自动化应用。无论是开发Modbus客户端还是服务器,Vertx Modbus都提供了强大的功能和可靠的性能。 ### 回答2: Vert.x Modbus 是基于 Vert.x 平台的一个 Modbus 协议库。Modbus 是一种通用的工业通信协议,用于将现场设备与监控系统进行数据交互。Vert.x Modbus 提供了 Modbus TCP 和 Modbus RTU 的实现,使得开发人员可以轻松地与 Modbus 设备进行通信。 Vert.x Modbus 的特点之一是支持异步非阻塞的编程模型。它使用了 Vert.x 平台的事件驱动和反应式编程模式,在处理 Modbus 通信时可以提供高性能和低延迟。开发者可以利用 Vert.x Modbus 的异步 API 来编写高效的、非阻塞式的 Modbus 应用程序。 Vert.x Modbus 提供了多种功能和实用工具,用于解析和构造 Modbus 协议消息。它支持多种常见的 Modbus 功能码,如读写线圈、读写寄存器等。开发者可以使用 Vert.x Modbus 提供的工具类来简化对 Modbus 数据的处理和解析。 另外,Vert.x Modbus 还提供了灵活的配置选项,可以方便地进行自定义设置和调整。开发者可以根据具体业务需求来配置 Modbus 访问参数、连接选项等。 总之,Vert.x Modbus 是一个功能强大、易于使用的 Modbus 协议库,它充分利用了 Vert.x 平台的优势,提供了高性能、低延迟的 Modbus 通信解决方案。无论是在工业自动化领域还是其他领域中,开发者都可以使用 Vert.x Modbus 来构建高效可靠的 Modbus 应用程序。 ### 回答3: Vert.x Modbus是一个基于Vert.x框架的开源Modbus协议库。Modbus是一种通信协议,用于在不同设备之间进行数据交换。Vert.x Modbus能够帮助开发者轻松地在Vert.x应用程序中实现Modbus协议的通信。 Vert.x是一个高性能、响应式的应用程序框架,可用于构建异步、可伸缩的应用程序。它提供了一种简单易用的方式来实现事件驱动的、非阻塞的应用程序。与传统的Java EE应用程序相比,Vert.x具有更高的性能和更好的可伸缩性。 使用Vert.x Modbus,开发者可以快速构建支持Modbus协议的应用程序。该库提供了一套API,可以用于从Modbus服务器读取数据、写入数据、监听数据变化等操作。开发者只需要简单地调用API,就可以实现与设备的通信。 Vert.x Modbus支持两种主要的Modbus通信方式:RTU(串行通信)和TCP(网络通信)。开发者可以根据实际需求选择合适的通信方式。此外,该库还支持多种数据类型,如整数、浮点数、字符串等,可以灵活地处理不同类型的数据。 总之,Vert.x Modbus是一个非常有用的工具,可以帮助开发者快速构建支持Modbus通信的应用程序。它结合了Vert.x框架的高性能和灵活性,以及Modbus协议的通信能力,为开发者提供了一种简单可靠的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值