netty中实现双向认证的SSL连接

1. 前期准备工作

        双向证书认证的双方称为client和server,首先为client和server生成证书。由于仅仅是自己学习使用,因此可以在本地自建一个CA,然后用CA的证书分别签发client和server的证书。CA的创建和签发使用OpenSSL。 
在windows环境上安装OpenSSL,然后依据OpenSSL目录下的openssl.cnf中[ CA_default ]的配置创建相应的文件夹和文件 

demoCA/ —- CA的根目录 
|– newcerts/—- CA签发出去的证书 
|– private/ —- CA自己的私钥,默认名称是cakey.pem 
|– serial —- 存放证书序列号的文件 
|– index.txt —- 签发过的证书的记录,文本文件

        serial这个文件中可以初始写入一行记录,包含两个字符01,表示下一个签发的证书采用的序列号是01 
接下来生成CA自己的公私钥(public/private key),生成证书签名请求(CSR, Certificate Signing Request)文件并对该请求进行自签名 
在openssl的根目录下运行 

openssl genrsa -out ./demoCA/private/cakey.pem 2048 
genrsa —- 同时生成public key和private key 
很多人将genrsa解释为只生成private key,这是不对的。可以用下面的命令从文件中解出公钥 
openssl rsa -in cakey.pem -pubout > capublickey.pub

注意最后的数字2048表示生成的RSA公私钥的长度

JDK7中对证书检查要求公钥的长度最少为1024位,否则会抛出异常 

java.security.cert.CertPathValidatorException: Algorithm constraints check failed 
该长度限制是可以配置的,配置文件路径是JAVA_HOME/jre/lib/security/java.security 
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 


然后用上面生成的公私钥文件创建一个证书签名请求文件 

openssl req -new -key ./demoCA/private/cakey.pem -out careq.pem 

req —- 创建CSR或者证书 
-key —- openssl从这个文件中读取private key 
careq
Netty实现双向心跳机制,通常涉及到两个方向的交互:服务器向客户端发送心跳以及客户端响应服务器。以下是基本的步骤: 1. **服务器向客户端发送心跳**: - 在`HeartbeatHandler`,除了接收心跳外,还应该有一个发送心跳的功能,比如每间隔一段时间(比如60秒): ```java class HeartbeatHandler extends ChannelInboundHandlerAdapter { private final int heartbeatInterval; // 定义心跳间隔 @Scheduled(cron = "*/60 * * * *") // 每分钟发送一次心跳 void sendHeartbeat(Channel channel) { ByteBuf content = Unpooled.copiedBuffer("Heartbeat", StandardCharsets.UTF_8); channel.writeAndFlush(content).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); } } ``` 2. **客户端响应心跳**: - 客户端需要监听心跳包,一旦收到就回复确认,同时维持一个心跳计时器,防止超时后关闭连接: ```java class ClientHandler extends SimpleChannelInboundHandler<Object> { private boolean alive = true; @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { if (msg instanceof String && msg.equals("Heartbeat")) { ByteBuf response = Unpooled.copiedBuffer("Received heartbeat", StandardCharsets.UTF_8); ctx.writeAndFlush(response); // 回应心跳 ctx.channel().eventLoop().schedule(() -> sendHeartbeat(), heartbeatInterval, TimeUnit.SECONDS); } } private void sendHeartbeat() { if (!alive) return; ByteBuf content = Unpooled.copiedBuffer("Heartbeat ACK", StandardCharsets.UTF_8); ctx.writeAndFlush(content); } } ``` 3. **异常处理和超时管理**: - 在上述代码,已经设置了关闭连接的监听器。当某个方向无法正常通信时,可以设置超时机制,比如超时后主动关闭连接。 这样,你就实现双向的心跳机制,双方都会定期交换心跳以验证连接是否正常。注意实际应用可能还需要考虑错误处理和异常恢复。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值