现在介绍第三种实现方式:Server端和Client端各自拥有可信认的第三方认证机构(CA)签名私有密钥证书,通过CA互相信认对方证书。
在第二种实现方式中,使用keytool生成的数字证书只能是自签名的。谓自签名就是指证书只能保证自己是完整的,没有经过非法修改的。但是无法保证这个证书是属于谁的。这种验证有一个缺点:对于每一个要链接的服务器,都要保存一个证书的验证副本。而且一旦服务器更换证书,所有客户端就需要重新部署这些副本。对于比较大型 的应用来说,这一点是不可接受的。所以就需要证书链进行双向认证。证书链是指对证书的签名又一个预先部署的,众所周知的签名方签名完成,这样每次需要验证证书时只要用这个公用的签名方的公钥进行验证就可以了。比如我们使用的浏览器就保存了几个常用的CA_ROOT。每次连接到网站时只要这个网站的证书是经过这些CA_ROOT签名过的。就可以通过验证了。但是这些共用的CA_ROOT的服务不是免费的。而且价格不菲。所以我们有必要自己生成一个CA_ROOT的密钥对,然后部署应用时,只要把这个CA_ROOT的私钥部署在所有节点就可以完成验证了。要进行CA_ROOT的生成,需要OpenSSL(http://www.openssl.org/)。
安装好OpenSSL后就可以生成证书链。
1.在当前目录下建立几个文件和文件夹,有./demoCA/ ./demoCA/newcerts/ ./demoCA/index.txt ./demoCA/serial,在serial文件中写入第一个序列号“01”
2.生成CA证书
引用
openssl req -new -x509 -keyout ca.key -out ca.crt -days 3650
3.生成server端证书:
1)生成KeyPair生成密钥对
引用
keytool -genkey -alias server -keysize 1024 -validity 3650 -keyalg RSA -dname "CN=ZengWenfeng, OU=Development,O=Techstar.com, L=BeiJing, S=BeiJing, C=CN" -keypass 123456 -storepass 123456 -keystore server.jks
2)生成证书签名请求
引用
keytool -certreq -alias server -sigalg MD5withRSA -file server.csr -keypass 123456 -storepass 123456 -keystore server.jks
3)用CA私钥进行签名,也可以到权威机构申请CA签名
引用
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -notext
4)导入信任的CA根证书到keystore
引用
keytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass 123456 -keystore server.jks
5)把CA签名后的server端证书导入keystore
引用
keytool -import -v -alias server -file server.crt -keypass 123456 -storepass 123456 -keystore server.jks
4.生成Client证书
1)生成KeyPair生成密钥对
引用
keytool -genkey -alias client -keysize 1024 -validity 3650 -keyalg RSA -dname "CN=ZengWenfeng, OU=Development,O=Techstar.com, L=BeiJing, S=BeiJing, C=CN" -keypass 123456 -storepass 123456 -keystore client.jks
2)生成证书签名请求
引用
keytool -certreq -alias client -sigalg MD5withRSA -file client.csr -keypass 123456 -storepass 123456 -keystore client.jks
3)用CA私钥进行签名,也可以到权威机构申请CA签名
引用
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -notext
4)导入信任的CA根证书到keystore
引用
keytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass 123456 -keystore client.jks
5)把CA签名后的server端证书导入keystore
引用
keytool -import -v -alias client -file client.crt -keypass 123456 -storepass 123456 -keystore client.jks
这里与第二种方式不同的地方是初始化客户端和服务端的SSLContext时KeyManager、TrustManager分别采用相同的client.jks和server.jks,除了采用证书方式不同,基本与第二种方式一样,具体参见源码。
分享到:
相关推荐
在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...
在这个实例中,我们将探讨如何使用Mina实现长连接和短连接。 首先,理解长连接和短连接的概念至关重要。在TCP/IP通信中,短连接(Short Connection)是指一次数据传输完成后立即关闭连接,而长连接(Long ...
综上所述,MINA长连接框架在实现服务器与Android客户端通讯时,涉及到网络编程、数据传输协议、异常处理、过滤器机制、长连接维护等多个技术要点,开发者需要根据实际需求进行合理的架构设计和优化。通过MINA提供的...
在Mina中,`SslFilter`实现了SSL/TLS协议,它可以添加到I/O处理器的过滤链中,对进出的数据进行加密解密。`SslFilter`需要配置SSL上下文(SSLContext),该上下文包含了证书、密钥和信任管理器等信息。 **3. 创建...
在本文档中,我们将通过具体实例,详细介绍如何使用Apache Mina 2.0实现TCP协议下的长连接与短连接。 #### 二、系统概述 ##### 2.1 系统架构 本系统主要由两个服务端程序与两个客户端程序构成,其中: - **长...
在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina连接"。在Mina中,连接是指客户端与服务端之间建立的通信链路。它支持多种传输协议,如TCP/IP(Socket)...
在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接请求。Acceptor会处理连接建立、数据传输和连接关闭等网络事件。服务端的核心组件是IoHandler,它定义了对网络事件的处理方法,如...
**mina双向通信已测试** ...在实际项目中,开发者可以利用Mina实现更复杂的服务,如分布式系统中的通信、实时数据传输等。这个测试项目不仅可以帮助提升技能,还可以作为基础模块,为后续的开发工作提供便利。
在这个场景中,我们将讨论如何使用MINA来实现一个简单的登录功能。 首先,理解MINA的基本工作原理至关重要。MINA的核心是IoSession对象,它代表了服务器和客户端之间的持久连接。当客户端连接到服务器时,MINA会...
MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专门设计用于构建高性能、高可用性的网络...无论是在游戏服务器、实时聊天应用还是其他需要持续连接的服务中,MINA都是一个强大的工具。
它利用Java NIO库,实现了异步、非阻塞的通信模式,可以在单一线程中处理多个并发连接,大大提升了服务器的并发能力。Minaclient和MinaHost工程正是展示了如何在实际项目中应用这些概念。 在Minaclient工程中,我们...
本源码是《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》一文的服务端实现(MINA2版),详见:http://www.52im.net/thread-378-1-1.html
在实际项目中,将MINA库引入,结合业务逻辑编写相应的处理代码,即可实现长连接通信。 总结来说,Socket通信是网络编程的基础,而MINA长连接则是Socket通信的一种优化实现,尤其适合需要高效处理大量并发连接和实时...
2. **会话建立**:实现CMPP连接的认证机制,包括基于IP地址、端口号或特定的CMPP协议报文的认证过程。 3. **协议解析**:设计CMPP2.0协议的解码器(Decoder)和编码器(Encoder),将原始的字节流转换为业务对象,...
在实现双机通讯时,我们通常会使用TCP协议,因为其具有面向连接、可靠传输的特点,适合于需要稳定数据交换的场景。 要使用Mina实现双机通讯,我们首先要创建一个服务器端(Server)和一个或多个客户端(Client)。...
使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书
在这个“mina 实现简单通讯”的项目中,我们看到了一个基于MINA的基本通信实现,涵盖了服务端和客户端的交互。 首先,MINA的核心组件包括`IoSession`,它是网络连接的抽象,包含了与特定连接相关的所有信息,如输入...
在Mina与Socket通信的实现中,服务端通常使用Mina来创建一个Acceptor,监听特定端口,等待客户端的连接请求。一旦有连接建立,Mina会自动触发相应的事件处理器,开发者可以在其中处理数据读写。以下是一个基本的...
在这个"mina 长连接 客户端+服务端"的示例中,我们将探讨如何使用Mina实现长连接以及收发消息的功能。 长连接是网络通信中的一种模式,与短连接相对。短连接在每次通信后都会关闭连接,而长连接则保持连接状态,...