`
sundoctor
  • 浏览: 325399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在mina中实现TSL/SSL双向认证连接(3)

    博客分类:
  • mina
阅读更多
现在介绍第三种实现方式: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,除了采用证书方式不同,基本与第二种方式一样,具体参见源码。
分享到:
评论
3 楼 xieyanhua 2012-08-09  
sundoctor 写道
其他格式证书可以参考http://sundoctor.iteye.com/blog/584927


呵呵,抱歉,之前没有搞过证书这部分的。我之前也看过了您发的那篇文章,但是我还是不太理解怎么用openSSL生成对应的客户端?因为感觉您那篇是单独通过openSSL工具来生成。

我先说说现在的情况:
现在的服务器用的是mina2,测试客户端用的也是mina写的,对于SSL,用第三方的openSSL来统一认证服务器端和客户端的证书。

我现在的程序,基本是按您这篇文章《在mina中实现TSL/SSL双向认证连接(3)》的步骤生成服务器端和java客户端的证书,访问也没有问题,连接通信没有问题:

1、首先用openSSL生成证书和key文件:
   openssl-ca.crt 和 openssl-ca.key
2、生成mina端的证书,用java的keytool以及openSS生成服务器证书及签名等工作:
   mina server端的证书:mina-server.csr,mina-server.crt 和 mina-server.jks 三个文件

   mina 服务器端 的key文件和信任文件都用了同一个mina-serer.jks
3、生成客户端(java)的证书,与第二步类似:
   mina 客户端(java)的证书:mina-client1.csr,mina-client1.crt 和 mina-client1.jks 三个文件
   mina 客户端 的key文件和信任文件都用了同一个mina-client1.jks

至此,java客户端和java服务器端之间的程序,可以通过认证,连接通讯都没有问题。(测试程序我方便就用java直接写了)


问题在于下面,客户端是用C写的嵌入式程序,需要与minaserver进行SSL通信,但是C客户端只人pem格式的,但是如果通过上述文件生成合适的pem文件呢?比如证书验证,签名什么的,我不太会。

4、生成其他语言的客户端(如C/C++),只认pem格式:这里不知道

-- 我想,如果我用一些工具,比如:portecle工具(keytool的可视化工具),通过该工具也可以将证书或者keystore文件转换为相应的pem格式,那么如果我通过前面第3步生成的java客户端的证书文件(mina-client1.csr,mina-client1.crt 和 mina-client1.jks)中的任意一个转化为响应的pem格式,然后将该该文件比如c-client.pem给C的客户端用,那么它是否可以连接上来并通过认证?

能否给个例子或者步骤,谢谢?
2 楼 sundoctor 2012-08-08  
其他格式证书可以参考http://sundoctor.iteye.com/blog/584927
1 楼 xieyanhua 2012-08-06  
您好!正好用到MINA 的SSL,现在java端对java端没有问题,但是怎么生成其他语言的客户端呢?

比如我们现在用的,server端是MINA程序,而客户端是C/C++写的程序,客户端不认java的证书格式jks,只认pem格式的文件,我如何通过openssl工具生成相应的pem格式的证书呢?

谢谢!

相关推荐

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...

    Mina实现长连接和短连接实例

    在这个实例中,我们将探讨如何使用Mina实现长连接和短连接。 首先,理解长连接和短连接的概念至关重要。在TCP/IP通信中,短连接(Short Connection)是指一次数据传输完成后立即关闭连接,而长连接(Long ...

    MINA长连接框架实现通讯

    综上所述,MINA长连接框架在实现服务器与Android客户端通讯时,涉及到网络编程、数据传输协议、异常处理、过滤器机制、长连接维护等多个技术要点,开发者需要根据实际需求进行合理的架构设计和优化。通过MINA提供的...

    mina sslfilter大用法

    在Mina中,`SslFilter`实现了SSL/TLS协议,它可以添加到I/O处理器的过滤链中,对进出的数据进行加密解密。`SslFilter`需要配置SSL上下文(SSLContext),该上下文包含了证书、密钥和信任管理器等信息。 **3. 创建...

    基于Apache Mina实现的TCP长连接和短连接实例

    在本文档中,我们将通过具体实例,详细介绍如何使用Apache Mina 2.0实现TCP协议下的长连接与短连接。 #### 二、系统概述 ##### 2.1 系统架构 本系统主要由两个服务端程序与两个客户端程序构成,其中: - **长...

    mina连接 mina心跳连接 mina断线重连

    在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina连接"。在Mina中,连接是指客户端与服务端之间建立的通信链路。它支持多种传输协议,如TCP/IP(Socket)...

    mina server开发服务端/客户端代码

    在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接请求。Acceptor会处理连接建立、数据传输和连接关闭等网络事件。服务端的核心组件是IoHandler,它定义了对网络事件的处理方法,如...

    mina双向通信已测试

    **mina双向通信已测试** ...在实际项目中,开发者可以利用Mina实现更复杂的服务,如分布式系统中的通信、实时数据传输等。这个测试项目不仅可以帮助提升技能,还可以作为基础模块,为后续的开发工作提供便利。

    mina实现登录功能

    在这个场景中,我们将讨论如何使用MINA来实现一个简单的登录功能。 首先,理解MINA的基本工作原理至关重要。MINA的核心是IoSession对象,它代表了服务器和客户端之间的持久连接。当客户端连接到服务器时,MINA会...

    使用MINA实现长连接

    MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专门设计用于构建高性能、高可用性的网络...无论是在游戏服务器、实时聊天应用还是其他需要持续连接的服务中,MINA都是一个强大的工具。

    Mina长连接短连接实例

    它利用Java NIO库,实现了异步、非阻塞的通信模式,可以在单一线程中处理多个并发连接,大大提升了服务器的并发能力。Minaclient和MinaHost工程正是展示了如何在实际项目中应用这些概念。 在Minaclient工程中,我们...

    基于MINA2实现的UDP双向通信源码

    本源码是《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》一文的服务端实现(MINA2版),详见:http://www.52im.net/thread-378-1-1.html

    socket通信,mina长连接通信

    在实际项目中,将MINA库引入,结合业务逻辑编写相应的处理代码,即可实现长连接通信。 总结来说,Socket通信是网络编程的基础,而MINA长连接则是Socket通信的一种优化实现,尤其适合需要高效处理大量并发连接和实时...

    使用mina框架实现cmpp2.0服务端

    2. **会话建立**:实现CMPP连接的认证机制,包括基于IP地址、端口号或特定的CMPP协议报文的认证过程。 3. **协议解析**:设计CMPP2.0协议的解码器(Decoder)和编码器(Encoder),将原始的字节流转换为业务对象,...

    通信层使用Mina框架实现双机通讯

    在实现双机通讯时,我们通常会使用TCP协议,因为其具有面向连接、可靠传输的特点,适合于需要稳定数据交换的场景。 要使用Mina实现双机通讯,我们首先要创建一个服务器端(Server)和一个或多个客户端(Client)。...

    Mina+Socket通信

    在Mina与Socket通信的实现中,服务端通常使用Mina来创建一个Acceptor,监听特定端口,等待客户端的连接请求。一旦有连接建立,Mina会自动触发相应的事件处理器,开发者可以在其中处理数据读写。以下是一个基本的...

    JAVA NIO MINA2调用大宝CA密码安全套件实现国密SSL安全通道,1.0.1版本,含通信示例代码

    使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书

    mina 实现简单通讯

    在这个“mina 实现简单通讯”的项目中,我们看到了一个基于MINA的基本通信实现,涵盖了服务端和客户端的交互。 首先,MINA的核心组件包括`IoSession`,它是网络连接的抽象,包含了与特定连接相关的所有信息,如输入...

    mina 长连接 客户端+服务端

    在这个"mina 长连接 客户端+服务端"的示例中,我们将探讨如何使用Mina实现长连接以及收发消息的功能。 长连接是网络通信中的一种模式,与短连接相对。短连接在每次通信后都会关闭连接,而长连接则保持连接状态,...

Global site tag (gtag.js) - Google Analytics