使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序



《使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序》由会员分享,可在线阅读,更多相关《使用Java进行双向认证的SSL链接及使用OpenSSL生产证书链附源程序(7页珍藏版)》请在装配图网上搜索。
1、这几天被和证书搞得头昏脑胀的。不过还好终于把这个搞定了。 用进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的时采用的是单向验证,客户机只验证服务器的证书,服务器不验证客户机的证书。而连接网上银行时使用的盾就是用来存储进行双向验证所需要的客户端证书的)。 里面内置了一个数字证书生产工具:t但是这个工具只能生成自签名的数字证 书。所谓自签名就是指证书只能保证自己是完整的,没有经过非法修改的。但是无法保证这个证书是属于谁的。其实用这种自签名的证书也是可以进行双向验证的用生成的 自签名证书进行双向验证请看这里,向这
2、位仁兄致意〜: ),但是这种验证有一个缺点:对于每一个要链接的服务器,都要保存一个证书的验证副本。而且一旦服务器更换证书,所有客户端就需要重新部署这些副本。对于比较大型的应用来说,这一点是不可接受的。所以就需要证书链进行双向认证。证书链是指对证书的签名又一个预先部署的,众所周知的签名方签名完成,这样每次需要验证证书时只要用这个公用的签名方的公钥进行验证就可以了。比如我们使用的浏览器就保存了几个常用的R每次连接到网站时只要 这个网站的证书是经过这些签名过的。就可以通过验证了。 但是这些共用的的服务不是免费的。而且价格不菲。所以我们有必要自己生成一个 的密钥对,然后部署应用时,只要把这个的
3、私钥部署在所有节点就可以完 成验证了。要进行的生成,需要()。你也可 以在找到下的版本 安装好以后就可以生成证书链了,我写了一个解决这些东西: @echooff setC setPWD_SERVER_KS=serverks setPWD_SERVER_KEY=serverkey setPWD_CLIENT_KS=clientks setPWD_CLIENT_KEY=clientkey ifnotexistca.key( echoGeneratingacarootkeyfile... opensslreq-new-x509-keyoutca.key-outca.crt-c
4、onfig%CONFIG% )else( echoca.keyalreadyexists... ifnotexistserver.keystore(echoGeneratingserver'sprivatekey... keytool-genkey-aliaslogon_server_private_key-validity365-keyalgRSA-keysize1024 SERVER_KS% -keystoreserver.keystore-keypass%PWD_SERVER_KEY%-storepass%PWD)else( echoserver.keystorealrea
5、dyexits... ) ifnotexistclient.keystore( echoGeneratingclient'sprivatekey... keytool-genkey-aliasipclient_private_key-validity365-keyalgRSA-keysize1024-keystoreclient.keystore-keypass%PWD_CLIENT_KEY%-storepass%PWD_CLIENT_KS%)else( echoclient.keystorealreadyexits... ) echo========Finishedkeygen
6、eration========= ifnotexistlogon_server_private_key.csr( echoGeneratingserver'ssingaturerequestfile... keytool-certreq-aliaslogon_server_private_key-sigalgMD5withRSA-filelogon_server_private_key.csr-keypass%PWD_SERVER_KEY%-storepass%PWD_SERVER_KS%-keystoreserver.keystore )else( echologon_server
7、_private_key.csralreadyexits... ) ifnotexistipclient_private_key.csr( echoGeneratingclient'ssingaturerequestfile... keytool-certreq-aliasipclient_private_key-sigalgMD5withRSA-fileipclient_private_key.csr-keypass%PWD_CLIENT_KEY%-storepass%PWD_CLIENT_KS%-keystoreclient.keystore )else( echoipclie
8、nt_private_key.csralreadyexits... ) ifnotexistlogon_server_private_key.crt( opensslca-inlogon_server_private_key.csr-outlogon_server_private_key.crt-certca.crt-keyfileca.key-notext-config%CONFIG% )else( echologon_server_private_key.crtalreadyexits... ) ifnotexistipclient_private_key.crt( o
9、pensslca-inipclient_private_key.csr-outipclient_private_key.crt-certca.crt-keyfileca.key-notext-config%CONFIG% )else( echoipclient_private_key.crtalreadyexits... ) echo=========Finishedcarootsignaturing========== echoImportingcarootcertsintokeystore... keytool-import-v-trustcacerts-aliasca_roo
10、t-fileca.crt-storepass%PWD_SERVER_KS%-keystoreserver.keystore keytool-import-v-trustcacerts-aliasca_root-fileca.crt-storepass%PWD_CLIENT_KS%-keystoreclient.keystore echoImportingsignaturedkeys... keytool-import-v-aliaslogon_server_private_key-filelogon_server_private_key.crt-keypass%PWD_SERVER_KE
11、Y%-storepass%PWD_SERVER_KS%-keystoreserver.keystorekeytool-import-v-aliasipclient_private_key-file ipclient_private_key.crt-keypass%PWD_CLIENT_KEY%-storepass%PWD_CLIENT_KS%-keystoreclient.keystoreechoAlldone! 运行这个批处理,期间需要回答一些问题,然后就可以得到一些文件其中 的密钥文件。 是需要在客户端部署的,是在服务器部署的。是 然后可以用下面的代码测试: /* *Co
12、pyrights(C)2008Bearice(Bearice@G) *ReleaseunderGNU/GPLVersion2. */ packagecn.bearice.ipcontroller.ccserver; importjava.io.BufferedReader; importjava.io.FileInputStream; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.security.KeyStore; importjava.security.cert.X509Cer
13、tificate; importjava.util.logging.Level; importjava.util.logging.Logger; .ssl.KeyManagerFactory; .ssl.SSLContext; .ssl.SSLPeerUnverifiedException; .ssl.SSLServerSocket; .ssl.SSLServerSocketFactory; .ssl.SSLSession; .ssl.SSLSocket; .ssl.SSLSocketFactory; .ssl.TrustManagerFactory; /** *
14、*@authorBearice */ publicclassNewClassextendsThread{ @Override publicvoidrun(){ try{ sleep(100); SSLContextctx=SSLContext.getInstance("SSL"); KeyManagerFactorykmf=KeyManagerFactory.getInstance("SunX509"); TrustManagerFactorytmf=TrustManagerFactory.getInstance("SunX509"); KeyStoreks=KeyStor
15、e.getInstance("JKS"); //KeyStoretks=KeyStore.getInstance("JKS"); ks.load(newFileInputStream("e:/certs/client.keystore"),"clientks".toCharArray()); //tks.load(newFileInputStream("e:/certs/tclient.keystore"),"clientks".toCharArray()); kmf.init(ks,"clientkey".toCharArray()); tmf.init(ks); ctx.ini
16、t(kmf.getKeyManagers(),tmf.getTrustManagers(),null); SSLSocketFactoryfactory=ctx.getSocketFactory(); SSLSocketsocket=(SSLSocket)factory.createSocket("127.0.0.1",4433); showCerts(socket.getSession()); PrintWriterpw=newPrintWriter(socket.getOutputStream()); pw.println("GET/index.htmlHTTP/1.0");
17、pw.println("Server:"); pw.println("Connection:close"); pw.println(); pw.flush(); BufferedReaderin=newBufferedReader(new InputStreamReader(socket.getInputStream())); Stringln; while((ln=in.readLine())!=null){ System.err.println(ln); } }catch(Exceptionex){ Logger.getLogger(NewClass.class.ge
18、tName()).log(Level.SEVERE,null,ex); } } publicstaticvoidshowCerts(SSLSessionsession){ X509Certificatecert=null; try{ cert=(X509Certificate)session.getPeerCertificates()[0]; }catch(SSLPeerUnverifiedExceptione){ e.printStackTrace(); System.err.println(session.getPeerHost()+"didnotpresentavali
19、dcertificate"); //System.exit(1); return; } System.out.println(session.getPeerHost()+"haspresentedacertificatebelongingto"+"["+cert.getSubjectDN()+"]\n"+"Thecertificatewasissuedby:\t"+"["+cert.getIssuerDN()+ } publicstaticvoidmain(String[]args)throwsException{ SSLContextctx=SSLContext.get
20、Instance("SSL"); KeyManagerFactorykmf=KeyManagerFactory.getInstance("SunX509"); TrustManagerFactorytmf=TrustManagerFactory.getInstance("SunX509"); KeyStoreks=KeyStore.getInstance("JKS"); //KeyStoretks=KeyStore.getInstance("JKS"); ks.load(newFileInputStream("e:/certs/server.keystore"),"serverks"
21、.toCharArray()); //tks.load(newFileInputStream("e:/certs/tserver.keystore"),"serverks".toCharArray()); kmf.init(ks,"serverkey".toCharArray()); tmf.init(ks); ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null); SSLServerSocketFactoryfactory=ctx.getServerSocketFactory(); SSLServerSocketse
22、rverSocket=(SSLServerSocket)factory.createServerSocket(4433); serverSocket.setNeedClientAuth(true); newNewClass().start(); SSLSocketsocket=(SSLSocket)serverSocket.accept(); try{socket.startHandshake(); }catch(Exceptionex){System.out.println("Handshakefailed:"+ex); } showCerts(socket.getSessio
23、n()); socket.startHandshake(); PrintWriterout=newPrintWriter(socket.getOutputStream()); BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream())); Stringln; while((ln=in.readLine())!=null){System.out.println(ln);if(ln.equals("")){break; } } out.println("HTTP/1.1200OK"
24、); out.println("Cache-Control:no-cache"); out.println("Pragma:no-cache"); out.println("Expires:Fri,01Jan199000:00:00GMT"); out.println("Content-Type:text/html;charset=UTF-8"); out.println("Date:Tue,01Jul200811:56:42GMT"); out.println("Server:BWS"); out.println("X-Powered-By:BWS"); out.println(); out.println("
helloworld
"); out.close(); socket.close(); } }- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。