使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序转_第1页
使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序转_第2页
使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序转_第3页
使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序转_第4页
使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序转_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、v1.0 可编辑可修改这几天被 SSL和证书搞得头昏脑胀的。不过还好终于把这个SSL 搞定了。用 SSL 进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证, 保证这是经过授权的才能够连接 (我们链接一般的 SSL 时采用的是单向验证, 客 户机只验证服务器的证书, 服务器不验证客户机的证书。 而连接网上银行时使用的 U 盾就是 用来存储进行双向验证所需要的客户端证书的)。JDK里面内置了一个数字证书生产工具: keytool 。但是这个工具只能生成自签名的数字证 书。所谓自签名就是指证书只能保证自己是完整的, 没有经过非法修改的。 但是无法保证这 个证书是属于

2、谁的。其实用这种自签名的证书也是可以进行双向验证的 ( 用 keytool 生成的 自签名证书进行双向验证请看这里,向这位仁兄致意:),但是这种验证有一个缺点:对 于每一个要链接的服务器, 都要保存一个证书的验证副本。 而且一旦服务器更换证书, 所有 客户端就需要重新部署这些副本。 对于比较大型的应用来说, 这一点是不可接受的。 所以就 需要证书链进行双向认证。 证书链是指对证书的签名又一个预先部署的, 众所周知的签名方 签名完成, 这样每次需要验证证书时只要用这个公用的签名方的公钥进行验证就可以了。 比 如我们使用的浏览器就保存了几个常用的CA_ROO。T每次连接到网站时只要这个网站的证书是

3、经过这些 CA_ROOT签名过的。就可以通过验证了。但是这些共用的 CA_ROO的T 服务不是免费的。 而且价格不菲。 所以我们有必要自己生成一个 CA_ROOT的密钥对,然后部署应用时,只要把这个 CA_ROOT的私钥部署在所有节点就可以完 成验证了。要进行 CA_ROO的T 生成,需要 OpenSSL()。你也可以在找到 Windows 下的版本 安装好 OpenSSL以后就可以生成证书链了,我写了一个BAT解决这些东西:echo offset Cset PWD_SERVER_KS=serverksset PWD_SERVER_KEY=serverkeyset PWD_CLIENT_KS=

4、clientksset PWD_CLIENT_KEY=clientkeyif not exist (echo Generating a ca root key file.openssl req -new -x509 -keyout -out -config %CONFIG%) else (echo already exists.)v1.0 可编辑可修改if not exist (echo Generating servers private key.keytool -genkey -alias logon_server_private_key -validity 365 -keyalg RSA

5、-keysize 1024 -keystore -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% ) else (echo already exits.)if not exist (echo Generating clients private key.keytool -genkey -alias ipclient_private_key-validity 365 -keyalgRSA -keysize 1024 -keystore -keypass%PWD_CLIENT_KEY-s%to repass %PWD_CLIENT_KS%)

6、else (echo already exits.)echo =Finished key generation=if not exist (echo Generating servers singature request file.keytool -certreq -alias logon_server_private_key -sigalg MD5withRSA -file -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% -keystore ) else (echo already exits.)if not exist (echo

7、 Generating clients singature request file.keytool -certreq -alias ipclient_private_key-sigalg MD5withRSA-file-keypass %PWD_CLIENT_KEY% -storepass %PWD_CLIENT_KS% -keystore) else (echo already exits.)v1.0 可编辑可修改if not exist ( openssl ca -in -out -cert -keyfile -notext -config %CONFIG%) else ( echo a

8、lready exits.)if not exist ( openssl ca -in -out -cert -keyfile -notext -config %CONFIG%) else ( echo already exits.)echo =Finished ca root signaturing=echo Importing ca root certs into keystore.keytool -import -v -trustcacerts-alias ca_root -file-storepass %PWD_SERVER_KS% -keystorekeytool -import -

9、v -trustcacerts-alias ca_root -file-storepass %PWD_CLIENT_KS% -keystoreecho Importing signatured keys.keytool -import -v -alias logon_server_private_key -file-keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% -keystorekeytool -import -v -aliasipclient_private_key -file -keypass %PWD_CLIENT_KEY% -s

10、torepass %PWD_CLIENT_KS% -keystoreecho All done!运行这个批处理, 期间需要回答一些问题, 然后就可以得到一些文件其中是需要在客户端部 署的,是在服务器部署的。 ca.* 是 root_ca 的密钥文件。v1.0 可编辑可修改然后可以用下面的代码测试: /* Copyrights (C) 2008 Bearice ()* Release under GNU/GPL Version 2. */ packageimport import import import import import import import import import im

11、port import import import import import import* author Bearice*/Thread public class NewClass extendsOverridepublic void run() try v1.0 可编辑可修改sleep ( 100);SSLContext ctx = ( SSL );KeyManagerFactory kmf = ( SunX509 );TrustManagerFactory tmf = ( SunX509 );KeyStore ks = ( JKS ); oCharArray ();oCharArray

12、();(ks, clientkey . toCharArray ();(ks);(), (),null );SSLSocketFactory factory= ();SSLSocket socket = ( SSLSocket ) ( , 4433);showCerts ();PrintWriter pw = new PrintWriter ();(GET / HTTP/ );( Server: );( Connection: close);();();BufferedReader in = new BufferedReader (newInputStreamReader ();String

13、ln ;while ( ln = () !=null ) catch ( Exception ex ) null , ex);v1.0 可编辑可修改public static voidshowCerts ( SSLSession session ) X509Certificate cert = null ;try cert = ( X509Certificate ) () 0; catch ( SSLPeerUnverifiedException e ) ();+ did not present a valid certificate);oCharArray ();oCharArray();(

14、 ks, serverkey . toCharArray ();( ks);(), (),null );SSLServerSocketFactory factory = ();SSLServerSocket serverSocket= ( SSLServerSocket ) ( 4433);( true );new NewClass(). start ();SSLSocket socket = ( SSLSocket ) ();try (); catch ( Exception ex ) Handshake failed: + ex);showCerts ();();v1.0 可编辑可修改PrintWriter out= new PrintWriter ();BufferedReader in= new BufferedReader( new InputStreamReader ();String ln ;while ( ln = () !=null ) if ( ) break ;( HTTP/ 200 OK );( Cach

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论