小编Pet*_*ter的帖子

使用自签名证书和SSLEngine(JSSE)进行SSL握手

我的任务是实现一个可以在同一端口上处理SSL和非SSL消息的自定义/独立Java Web服务器.

我已经实现了一个NIO服务器,它非常适用于非SSL请求.我对SSL片段感到非常兴奋,并且可以使用一些指导.

这是我到目前为止所做的.

为了区分SSL和非SSL消息,我检查入站请求的第一个字节以查看它是否是SSL/TLS消息.例:

   byte a = read(buf);
   if (totalBytesRead==1 && (a>19 && a<25)){
       parseTLS(buf);
   }
Run Code Online (Sandbox Code Playgroud)

在parseTLS()方法中,我实例化一个SSLEngine,如下所示:

   java.security.KeyStore ks = java.security.KeyStore.getInstance("JKS");
   java.security.KeyStore ts = java.security.KeyStore.getInstance("JKS");

   ks.load(new java.io.FileInputStream(keyStoreFile), passphrase);
   ts.load(new java.io.FileInputStream(trustStoreFile), passphrase);

   KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
   kmf.init(ks, passphrase);

   TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
   tmf.init(ts);

   SSLContext sslc = SSLContext.getInstance("TLS");     
   sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);


   SSLEngine serverEngine = sslc.createSSLEngine();
   serverEngine.setUseClientMode(false);
   serverEngine.setEnableSessionCreation(true);
   serverEngine.setWantClientAuth(true);
Run Code Online (Sandbox Code Playgroud)

一旦SSLEngine被实例化,我使用unwrap/wrap方法使用直接来自官方JSSE Samples的代码处理入站数据:

   log("----");

   serverResult = serverEngine.unwrap(inNetData, inAppData);
   log("server unwrap: ", serverResult);
   runDelegatedTasks(serverResult, serverEngine);

   log("----");

   serverResult = serverEngine.wrap(outAppData, outNetData);
   log("server wrap: ", …
Run Code Online (Sandbox Code Playgroud)

java nio jsse sslengine

8
推荐指数
1
解决办法
9442
查看次数

标签 统计

java ×1

jsse ×1

nio ×1

sslengine ×1