示例工程及测试用的证书文件:
https://download.csdn.net/download/zhangfls/12875187
openssl在window本地命令行生成证书的方式:
https://blog.csdn.net/zhangfls/article/details/108733072
1、双向加密认证首先要获取到证书,可以先自己生成证书用于测试(实际获取到的公网证书使用方式其实差不多
)
(1)可以通过openssl生成证书
(2)首先要生成一份CA根证书,再由该证书生成服务器和客户端的证书
(3)完成基本的SSL/TLS服务器和客户端的双向加密通讯,一共需要生成5份证书
①CA证书
②服务器证书
③服务器密钥
④客户端证书
⑤客户端密钥
(4)、一般证书有多种格式,这里我们用pem格式做示例(linux系统常用)
2、假设我们已经配置了证书,同时配置好了一个简单的nettyTCP连接的客户端和服务器,下面则需要重新配置netty服务器与客户端的SSL管道
(1)、配置netty的SSL可以通过添加pipeline的方式完成,将管道配置在ChannelInitializer实现类的最前面即可
public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {
private SslContext sslContext;
public MyChannelInitializer(SslContext sslContext) {
this.sslContext = sslContext;
@Override
protected void initChannel(SocketChannel channel) {
// 添加SSL安装验证
channel.pipeline().addFirst(sslContext.newHandler(channel.alloc()));
//直接解析原始HEX字节
channel.pipeline().addLast(new StringEncoder(StandardCharsets.ISO_8859_1));
//自定义解析数据handler
channel.pipeline().addLast(new MyServerHandler());
channel.pipeline().addLast(new ByteArrayEncoder());
(2)包含证书信息的SslContext可以由SslContextBuilder来生成,可以分别生成客户端及服务器的SSL验证protocol。例如下面的certChainFile 为客户端证书,keyFile为客户端密钥,rootFile为CA根证书,服务器的证书配置同理
//引入SSL安全验证
File certChainFile = new File("D:\\OpenSSL-Win64\\bin\\client\\client-cert.pem");
File keyFile = new File("D:\\OpenSSL-Win64\\bin\\client\\client-key.pem");
File rootFile = new File("D:\\OpenSSL-Win64\\bin\\ca\\ca-cert.pem");
SslContext sslCtx = SslContextBuilder.forClient().keyManager(certChainFile, keyFile).trustManager(rootFile).build();
3、一般做双向验证,服务器端可能还会需要客户端证书的详细信息,来确认客户端的身份。可以通过在连接握手完成时,读取SSLSession的信息,来获取到客户端证书的详细信息,如下:
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.pipeline().get(SslHandler.class).handshakeFuture().addListener(
new GenericFutureListener<Future<Channel>>() {
@Override
public void operationComplete(Future<Channel> future) throws Exception {
if(future.isSuccess()){
System.out.println("握手成功");
SSLSession ss = ctx.pipeline().get(SslHandler.class).engine().getSession();
System.out.println("cipherSuite:"+ss.getCipherSuite());
X509Certificate cert = ss.getPeerCertificateChain()[0];
String info = null;
// 获得证书版本
info = String.valueOf(cert.getVersion());
System.out.println("证书版本:" + info);
// 获得证书序列号
info = cert.getSerialNumber().toString(16);
System.out.println("证书序列号:" + info);
// 获得证书有效期
Date beforedate = cert.getNotBefore();
info = new SimpleDateFormat("yyyy/MM/dd").format(beforedate);
System.out.println("证书生效日期:" + info);
Date afterdate = (Date) cert.getNotAfter();
info = new SimpleDateFormat("yyyy/MM/dd").format(afterdate);
System.out.println("证书失效日期:" + info);
// 获得证书主体信息
info = cert.getSubjectDN().getName();
System.out.println("证书拥有者:" + info);
// 获得证书颁发者信息
info = cert.getIssuerDN().getName();
System.out.println("证书颁发者:" + info);
// 获得证书签名算法名称
info = cert.getSigAlgName();
System.out.println("证书签名算法:" + info);
}else{
System.out.println("握手失败");
SocketChannel channel = (SocketChannel) ctx.channel();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+" conn:");
System.out.println("IP:" + channel.localAddress().getHostString());
System.out.println("Port:" + channel.localAddress().getPort());
4、配置完成后,先启动服务器,再启动客户端,可以看到连接建立成功
1、双向加密认证首先要获取到证书,可以先自己生成证书用于测试(实际获取到的公网证书使用方式其实差不多)(1)可以通过openssl生成证书(2)首先要生成一份CA根证书,再由该证书生成服务器和客户端的证书(3)完成基本的SSL/TLS服务器和客户端的双向加密通讯,一共需要生成5份证书 ①CA证书 ②服务器证书 ③服务器密钥 ④客户端证书 ⑤客户端密钥(4)、一般证书有多种格式,这里我们用pem格式做示例(linux系统常用)2、假设...
一、证书准备
要使用ssl双向验证,就必须先要生成服务端和客户端的证书,并相互添加信任,具体流程如下(本人调试这个用例的时候,花了很多时间来验证证书是否正确,以及握手失败的原因,这里证书生成过程只要按流程走,本人能保证绝对没有问题)
现在打开cmd,在哪个目录下打开,证书就会放在哪个目录下:
第一步: 生成Netty服务端私钥和证书仓库命令
keytool -genk...
本案例要求为基于Postfix+Dovecot的邮件服务器提供加密通信支持,主要完成以下任务操作:
1)为SMTP服务(postfix)添加TLS/SSL加密通信支持
2)基于dovecot配置POP3s+IMAPS加密通信支持
3)客户端收发信测试,确保加密的邮件通信可用
使用两台RHEL6虚拟机,其中svr5作为CA服务器,而mail作为测试用的...
互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度。而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL TLS协议变得异常复杂。理清https原理与CA证书体系
互联网的通信安全,建立在SSL/TLS协议之上。
本文简要介绍SSL/TLS协议的运行机制。文章的重点是设计思想和运行过程,不涉及具体的实现细节。如果想了解这方面的内容,请参阅RFC文档。
为什么需要采用https加通信
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
ks -> kmf
tks -> tmf
sslContext.init(kmf.km, tkf.tkm) -> createSslEngine -> SslHandler(sslEngine)
#mermaid-svg-9ZeV2v6qn6Kz57Z5 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family
Netty是一款高性能的网络应用框架,支持SSL/TLS加密来保护网络通信的安全性。SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是网络通信中广泛使用的加密协议,用于在客户端和服务器之间建立安全的通信信道。
Netty提供了一些组件和类来实现SSL/TLS加密。首先,我们需要使用javax.net.ssl包中的类来创建SSLContext对象。SSLContext是SSL/TLS协议的入口点,它包含用于加密和解密数据的加密算法和密钥。我们需要为SSLContext对象配置密钥库和信任库,密钥库用于存储证书和私钥,而信任库用于存储可信的证书。
接下来,我们需要创建SslHandler对象,将其添加到Netty的ChannelPipeline中。SslHandler作为一个ChannelHandler,负责处理SSL/TLS握手过程和数据的加密解密。当建立连接时,SslHandler会自动执行握手过程,包括协商加密算法、验证证书以及生成会话密钥等。
一旦握手完成,SslHandler会将数据加密后发送到网络,并将接收到的密文解密成明文。这样可以确保在网络传输过程中的数据保密性和完整性。此外,SslHandler还提供了一些方法来获取会话信息,如远程主机的证书和协商的加密算法。
使用Netty的SSL/TLS加密功能能够有效地提高网络通信的安全性。通过配置SSLContext和添加SslHandler,我们可以方便地实现对网络通信的加密和解密。无论是在客户端还是服务器端,都可以使用Netty的SSL/TLS加密功能来保护数据的安全性。