从无到有,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服务器和浏览器之间的加密链接。 对于这个概念的理解,让我印象深刻的是下面这幅图
翻译版
这是SSL工作的大致过程。 知道这些就足够了进行下面的工作了
2.2 使用openssl生成客户端私钥公钥和服务端私钥公钥
这一步也是最容易卡壳的一步,网上很多文章有的介绍太详细让人云里雾里,有的太粗略不知道啥玩意儿 这里只讲最简单的一种,并罗列了实践时碰到的问题:
2.2.1 下载Windows版openssl
下载地址:windows版openssl 为什么不使用linux版的openssl? 配置比较复杂,可能搞晕新手
2.2.2 选择一个目录进行安装
2.2.3 点击openssl.exe打开软件
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
此时,会产生文件 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 以图中这个安全聊天室为例 将代码拷贝到开发工具中
3.1 以服务端server为例
将之前的SslContext替换为如下代码,路径为之前生成文件的路径,可以先用两个文件夹进行区分
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();
如下图所示
3.2客户端同样
四、运行
先启动服务端,然后启动2个客户端 服务端日志: 客户端日志: 其中一个客 户端输入文字 另一个客户端可以看到发送的文字 完成