在mina中实现TSL/SSL双向认证连接(3)
现在介绍第三种实现方式: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证书
2)生成证书签名请求
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,除了采用证书方式不同,基本与第二种方式一样,具体参见源码。 1 楼 xieyanhua 2012-08-06 您好!正好用到MINA 的SSL,现在java端对java端没有问题,但是怎么生成其他语言的客户端呢?
比如我们现在用的,server端是MINA程序,而客户端是C/C++写的程序,客户端不认java的证书格式jks,只认pem格式的文件,我如何通过openssl工具生成相应的pem格式的证书呢?
谢谢! 2 楼 sundoctor 2012-08-08 其他格式证书可以参考http://sundoctor.iteye.com/blog/584927 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的客户端用,那么它是否可以连接上来并通过认证?
能否给个例子或者步骤,谢谢?