添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
细心的毛巾  ·  sqlite str to int-掘金·  1 年前    · 
狂野的西装  ·  如何用perl ...·  1 年前    · 

示例工程及测试用的证书文件: 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还提供了一些方法来获取会话信息,如远程主机的证书和协商的加密算法。 使用NettySSL/TLS加密功能能够有效地提高网络通信的安全性。通过配置SSLContext和添加SslHandler,我们可以方便地实现对网络通信的加密和解密。无论是在客户端还是服务器端,都可以使用NettySSL/TLS加密功能来保护数据的安全性。