从无到有,Netty基于SSL实现信息传输过程中双向加密验证

一、前提:

感谢以下博客给到的启发,完成了这篇内容
netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》
Netty SSL双向验证
Error while creating a CSR
netty中实现双向认证的SSL连接
OpenSSL主配置文件openssl.cnf

二、正文

2.1 SSL

首先了解什么是SSL,SSL(安全套接字层)是一种标准安全协议,用于在在线通信中建立Web服务器和浏览器之间的加密链接。
对于这个概念的理解,让我印象深刻的是下面这幅图
image

翻译版
image.png

这是SSL工作的大致过程。
知道这些就足够了进行下面的工作了

2.2 使用openssl生成客户端私钥公钥和服务端私钥公钥

这一步也是最容易卡壳的一步,网上很多文章有的介绍太详细让人云里雾里,有的太粗略不知道啥玩意儿
这里只讲最简单的一种,并罗列了实践时碰到的问题:

2.2.1 下载Windows版openssl

下载地址:windows版openssl
image.png
为什么不使用linux版的openssl?
配置比较复杂,可能搞晕新手

2.2.2 选择一个目录进行安装

image.png

2.2.3 点击openssl.exe打开软件

image.png

2.2.4 自建CA

先说明接下来的步骤打开是

自建CA-->生成服务端和客户端私钥-->根据key生成csr文件-->根据ca证书server.csr、client.csr生成x509证书-->将key文件进行PKCS#8编码

为什么会进行上面这些操作
因为实际应用中,CA是一个机构。而我们本地测试就没必要去进行申请的,所以自己建立一个CA。

CA 拥有一个证书(内含公钥私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。
如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。 -----------百度百科

建立CA之后,我们要
创建client和server的证书,然后client和server的证书都有了,导入程序中就实现了双向认证,如果只是对server进行颁发证书的话,那就是单项认证的SSL。

在打开的openssl.exe中执行

req -new -x509 -keyout ca.key -out ca.crt -days 36500

image.png

此时,会产生文件ca.key,ca.crt

2.2.5 生成服务端和客户端私钥

服务端

genrsa -des3 -out server.key 1024

客户端

genrsa -des3 -out client.key 1024

2.2.6 根据key生成csr文件

注意,如果生成server.csr 后再 client.csr提示错误,关闭当前窗口,然后重新打开openssl.exe进行执行
服务端

req -new -key server.key -out server.csr 

客户端

req -new -key client.key -out client.csr

2.2.7 根据ca证书server.csr、client.csr生成x509证书

如果上面没有生成ca.key,ca.crt,这里就会报错,提示找不到文件
服务端

x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

客户端

 x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

2.2.8 将key文件进行PKCS#8编码

服务端

pkcs8 -topk8 -in server.key -out pkcs8_server.key -nocrypt

客户端

pkcs8 -topk8 -in client.key -out pkcs8_client.key -nocrypt

2.2.9 最终将bin文件夹下,如下文件复制出来

这里需要注意的是sercer端和client端使用的ca.crt使用的是同一个,意味着同一个CA进行颁发的证书

server端:ca.crt、server.crt、pkcs8_server.key
client端:ca.crt、client.crt、pkcs8_client.key

三、导入代码

打开netty官网的使用手册,提供了很多的例子可以执行
https://netty.io/wiki/index.html
以图中这个安全聊天室为例
image.png
将代码拷贝到开发工具中
image.png
image.png

3.1 以服务端server为例

将之前的SslContext替换为如下代码,路径为之前生成文件的路径,可以先用两个文件夹进行区分
image.png

3.1.1 代码

File certChainFile = new File("F:\\blog\\nettySsl\\server\\server.crt");
File keyFile = new File("F:\\blog\\nettySsl\\server\\pkcs8_server.key");
File rootFile = new File("F:\\blog\\nettySsl\\server\\ca.crt");
SslContext sslCtx = SslContextBuilder.forServer(certChainFile, keyFile).trustManager(rootFile).clientAuth(ClientAuth.REQUIRE).build();

如下图所示
image.png

3.2客户端同样

image.png

四、运行

先启动服务端,然后启动2个客户端
服务端日志:
image.png
客户端日志:
image.png
其中一个客户端输入文字
image.png
另一个客户端可以看到发送的文字
image.png
完成

# Netty  ssl 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×