




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
这几天被SSL和证书搞得头昏脑胀的。不过还好终于把这个SSL搞定了。用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器不验证客户机的证书。而连接网上银行时使用的U盾就是用来存储进行双向验证所需要的客户端证书的)。JDK里面内置了一个数字证书生产工具:keytool。但是这个工具只能生成自签名的数字证书。所谓自签名就是指证书只能保证自己是完整的,没有经过非法修改的。但是无法保证这个证书是属于谁的。其实用这种自签名的证书也是可以进行双向验证的(用keytool生成的自签名证书进行双向验证请看这里,向这位仁兄致意:/stone2083/archive/2007/12/20/169015.html),但是这种验证有一个缺点:对于每一个要链接的服务器,都要保存一个证书的验证副本。而且一旦服务器更换证书,所有客户端就需要重新部署这些副本。对于比较大型的应用来说,这一点是不可接受的。所以就需要证书链进行双向认证。证书链是指对证书的签名又一个预先部署的,众所周知的签名方签名完成,这样每次需要验证证书时只要用这个公用的签名方的公钥进行验证就可以了。比如我们使用的浏览器就保存了几个常用的CA_ROOT。每次连接到网站时只要这个网站的证书是经过这些CA_ROOT签名过的。就可以通过验证了。但是这些共用的CA_ROOT的服务不是免费的。而且价格不菲。所以我们有必要自己生成一个CA_ROOT的密钥对,然后部署应用时,只要把这个CA_ROOT的私钥部署在所有节点就可以完成验证了。要进行CA_ROOT的生成,需要OpenSSL(/)。你也可以在/products/Win32OpenSSL.html找到Windows下的版本安装好OpenSSL以后就可以生成证书链了,我写了一个BAT解决这些东西: echo offset Cset PWD_SERVER_KS=serverksset PWD_SERVER_KEY=serverkeyset PWD_CLIENT_KS=clientksset PWD_CLIENT_KEY=clientkeyif not exist ca.key ( echo Generating a ca root key file. openssl req -new -x509 -keyout ca.key -out ca.crt -config %CONFIG%) else ( echo ca.key already exists.)if not exist server.keystore ( echo Generating servers private key. keytool -genkey -alias logon_server_private_key -validity 365 -keyalg RSA -keysize 1024 -keystore server.keystore -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS%) else ( echo server.keystore already exits.)if not exist client.keystore ( echo Generating clients private key. keytool -genkey -alias ipclient_private_key -validity 365 -keyalg RSA -keysize 1024 -keystore client.keystore -keypass %PWD_CLIENT_KEY% -storepass %PWD_CLIENT_KS%) else ( echo client.keystore already exits.)echo =Finished key generation=if not exist logon_server_private_key.csr ( echo Generating servers singature request file. keytool -certreq -alias logon_server_private_key -sigalg MD5withRSA -file logon_server_private_key.csr -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% -keystore server.keystore) else ( echo logon_server_private_key.csr already exits.)if not exist ipclient_private_key.csr ( echo Generating clients singature request file. keytool -certreq -alias ipclient_private_key -sigalg MD5withRSA -file ipclient_private_key.csr -keypass %PWD_CLIENT_KEY% -storepass %PWD_CLIENT_KS% -keystore client.keystore) else ( echo ipclient_private_key.csr already exits.)if not exist logon_server_private_key.crt ( openssl ca -in logon_server_private_key.csr -out logon_server_private_key.crt -cert ca.crt -keyfile ca.key -notext -config %CONFIG%) else ( echo logon_server_private_key.crt already exits.)if not exist ipclient_private_key.crt ( openssl ca -in ipclient_private_key.csr -out ipclient_private_key.crt -cert ca.crt -keyfile ca.key -notext -config %CONFIG%) else ( echo ipclient_private_key.crt already exits.)echo =Finished ca root signaturing=echo Importing ca root certs into keystore.keytool -import -v -trustcacerts-alias ca_root -file ca.crt -storepass %PWD_SERVER_KS% -keystore server.keystorekeytool -import -v -trustcacerts-alias ca_root -file ca.crt -storepass %PWD_CLIENT_KS% -keystore client.keystoreecho Importing signatured keys.keytool -import -v -alias logon_server_private_key -file logon_server_private_key.crt -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% -keystore server.keystorekeytool -import -v -alias ipclient_private_key -file ipclient_private_key.crt -keypass %PWD_CLIENT_KEY% -storepass %PWD_CLIENT_KS% -keystore client.keystoreecho All done!运行这个批处理,期间需要回答一些问题,然后就可以得到一些文件其中client.keystore是需要在客户端部署的,server.keystore是在服务器部署的。ca.*是root_ca的密钥文件。然后可以用下面的代码测试: /* Copyrights (C) 2008 Bearice (BeariceG)* Release under GNU/GPL Version 2.*/package cn.bearice.ipcontroller.ccserver;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.security.KeyStore;import java.security.cert.X509Certificate;import java.util.logging.Level;import java.util.logging.Logger;import .ssl.KeyManagerFactory;import .ssl.SSLContext;import .ssl.SSLPeerUnverifiedException;import .ssl.SSLServerSocket;import .ssl.SSLServerSocketFactory;import .ssl.SSLSession;import .ssl.SSLSocket;import .ssl.SSLSocketFactory;import .ssl.TrustManagerFactory;/* author Bearice*/public class NewClass extends Thread Override public void run() try sleep(100); SSLContext ctx = SSLContext.getInstance(SSL); KeyManagerFactory kmf = KeyManagerFactory.getInstance(SunX509); TrustManagerFactory tmf = TrustManagerFactory.getInstance(SunX509); KeyStore ks = KeyStore.getInstance(JKS); /KeyStore tks = KeyStore.getInstance(JKS); ks.load(new FileInputStream(e:/certs/client.keystore), clientks.toCharArray(); /tks.load(new FileInputStream(e:/certs/tclient.keystore), clientks.toCharArray(); kmf.init(ks, clientkey.toCharArray(); tmf.init(ks); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); SSLSocketFactory factory = ctx.getSocketFactory(); SSLSocket socket = (SSLSocket) factory.createSocket(, 4433); showCerts(socket.getSession(); PrintWriter pw = new PrintWriter(socket.getOutputStream(); pw.println(GET /index.html HTTP/1.0); pw.println(Server: ); pw.println(Connection: close); pw.println(); pw.flush(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(); String ln; while (ln = in.readLine() != null) System.err.println(ln); catch (Exception ex) Logger.getLogger(NewClass.class.getName().log(Level.SEVERE, null, ex); public static void showCerts(SSLSession session) X509Certificate cert = null; try cert = (X509Certificate) session.getPeerCertificates()0; catch (SSLPeerUnverifiedException e) e.printStackTrace(); System.err.println(session.getPeerHost() + did not present a valid certificate); /System.exit(1); return; System.out.println(session.getPeerHost() + has presented a certificate belonging to + + cert.getSubjectDN() + n + The certificate was issued by: t + + cert.getIssuerDN() + ); public static void main(String args) throws Exception SSLContext ctx = SSLContext.getInstance(SSL); KeyManagerFactory kmf = KeyManagerFactory.getInstance(SunX509); TrustManagerFactory tmf = TrustManagerFactory.getInstance(SunX509); KeyStore ks = KeyStore.getInstance(JKS); /KeyStore tks = KeyStore.getInstance(JKS); ks.load(new FileInputStream(e:/certs/server.keystore), serverks.toCharArray(); /tks.load(new FileInputStream(e:/certs/tserver.keystore), serverks.toCharArray(); kmf.init(ks, serverkey.toCharArray(); tmf.init(ks); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); SSLServerSocketFactory factory = ctx.getServerSocketFactory(); SSLServerSocket serverSocket = (SSLServerSocket) factory.createServerSocket(4433); serverSocket.setNeedClientAuth(true); new NewClass().start(); SSLSocket socket = (SSLSocket) serverSocket.accept(); try
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州贵阳机场股份公司质量安全部呼叫中心96967实习生招聘1人笔试历年参考题库附带答案详解
- 2025贵州毕节市水务投资集团有限责任公司及所属金沙弘禹供水有限责任公司招聘笔试历年参考题库附带答案详解
- 2025安徽芜湖市鸠江区招聘区属国有企业领导人员拟聘用人员考前自测高频考点模拟试题及答案详解(网校专用)
- 2025福建南平委党校教师招聘8人模拟试卷及一套答案详解
- 2025浙江省衢州市衢江区国有企业春季引才活动笔试人员等笔试历年参考题库附带答案详解
- 2025广东韶关市新丰县招聘暨选聘公办教师30人(编制)考前自测高频考点模拟试题含答案详解
- 2025广东广州花都城投西城经济开发有限公司第二次招聘项目用工人员23人笔试历年参考题库附带答案详解
- 2025江苏无锡市锡山区卫生健康系统招聘事业编制卫生人才15人(校园招聘)考前自测高频考点模拟试题带答案详解
- 2025广东肇庆市怀集县卫生健康局赴高校招聘卫生专业技术人员52人考前自测高频考点模拟试题完整参考答案详解
- 2025年吉安市青原区两山人力资源服务有限公司面向社会公开招聘临聘人员的模拟试卷及完整答案详解
- 教育培训机构合作培训协议
- 苹果电脑macOS效率手册
- 职称英语A级词汇大全
- 某光伏发电工程EPC总承包投标文件技术文件
- (正式版)JBT 2603-2024 电动悬挂起重机
- JJG(交通) 133-2023 落锤式弯沉仪
- 工厂主管人员值班表
- 消防安全周巡查记录表
- 第三章 护理伦理学基本原则规范和范畴
- 能源化学与能源化工概论-第一章 能源简介
- FZ/T 52058-2021低熔点聚乳酸(LMPLA)/聚乳酸(PLA)复合短纤维
评论
0/150
提交评论