日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Java安全套接字編程以及keytool使用最佳實(shí)踐分析

這篇文章將為大家詳細(xì)講解有關(guān)Java安全套接字編程以及keytool使用最佳實(shí)踐分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

成都創(chuàng)新互聯(lián)公司云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)13年的服務(wù)器租用、德陽(yáng)電信服務(wù)器托管、云服務(wù)器、虛擬空間、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn),已先后獲得國(guó)家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專(zhuān)業(yè)提供云主機(jī)、虛擬空間、域名與空間、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。

概述

利用 Java 的 JSSE(Java Secure Socket Extension)技術(shù),我們可以方便的編寫(xiě)安全套接字程序,關(guān)于 JSSE 的介紹,可以參閱 Oracle         網(wǎng)站提供的 JSSE         指導(dǎo)。程序編寫(xiě)過(guò)程中,我們需要將數(shù)字證書(shū)應(yīng)用到代碼中。通常在正式的產(chǎn)品開(kāi)發(fā)中,我們可以支付一定的費(fèi)用,向正規(guī)認(rèn)證機(jī)構(gòu),例如:Verisign、Geotrust、Thawte         等申請(qǐng)。

如果只是為了實(shí)驗(yàn),我們還可以使用 Java 自帶的 keytool 工具來(lái)制作證書(shū)。keytool 是密鑰和證書(shū)管理工具,生成的密鑰或證書(shū),存放在 jks(Java Key         Store) 格式的文件里。從用途上來(lái)說(shuō),jks 格式的文件常用于:

1) 存儲(chǔ)非對(duì)稱(chēng)密鑰對(duì)以及數(shù)字證書(shū)的證書(shū)庫(kù);

2) 存儲(chǔ)信任證書(shū)列表的信任庫(kù)。

注意:不同版本的 Java 自帶的 keytool 命令行參數(shù)可能會(huì)略有不同。相比于 Java6,在 Java7 中 keytool         工具有如下改動(dòng):

-export 選項(xiàng)改名為 -exportcert

-genkey 選項(xiàng)改名為 -genkeypair

-import 選項(xiàng)改名為 – importcert

-keyclone 選項(xiàng)被廢棄

-identitydb 選項(xiàng)被廢棄

-selfcert 選項(xiàng)被廢棄

下面將以 Java7 中的 keytool 為例,對(duì)常見(jiàn)的用法進(jìn)行說(shuō)明。

使用 keytool 制作證書(shū)庫(kù)以及信任庫(kù)

生成非對(duì)稱(chēng)密鑰以及自簽發(fā)證書(shū)

命令:keytool -genkeypair -alias TEST_ROOT -keystore test_root.jks

解釋?zhuān)?/strong>生成一對(duì)密鑰以及一個(gè)自簽發(fā)證書(shū),其中私鑰和證書(shū)以別名 TEST_ROOT 存儲(chǔ)在 test_root.jks 文件中。

注意:使用上述命令時(shí),命令行會(huì)交互的需要手動(dòng)填寫(xiě)密碼、CN、OU 等信息。也可以直接在命令行指定這些參數(shù),詳情見(jiàn) 參考資料中列出的 keytool 使用幫助。

生成證書(shū)請(qǐng)求文件

命令:keytool -certreq -file test_server.csr -alias TEST_SERVER -keystore         test_server.jks

解釋?zhuān)?/strong>將別名為 TEST_SERVER 的公鑰和一些個(gè)人信息從 test_server.jks 文件中導(dǎo)出,作為證書(shū)請(qǐng)求文件。

簽發(fā)證書(shū)

命令:keytool -gencert -infile test_server.csr -outfile test_server.cer         -alias TEST_ROOT -keystore TEST_ROOT.jks

解釋?zhuān)?/strong>使用別名為 TEST_ROOT 的私鑰為 test_server.csr 簽發(fā)證書(shū),并保存到 test_server.cer 文件中。

從 jks 文件中導(dǎo)出證書(shū)

命令:keytool -exportcert -alias TEST_ROOT -file test_root.cer -keystore         test_root.jks

解釋?zhuān)?/strong>從 test_root.jks 文件中導(dǎo)出別名為 TEST_ROOT 的證書(shū)并存放在 test_root.cer 文件中。

導(dǎo)入信任證書(shū)到 jks 文件

命令:keytool -importcert -alias TEST_ROOT -file test_root.cer -keystore         TEST_SERVER.jks

解釋?zhuān)?/strong>將證書(shū) test_root.cer 以別名 TEST_ROOT 導(dǎo)入 TEST_SERVER.jks 中。

注意:這里的目標(biāo) jks 文件里不含有指定的別名,此時(shí)的導(dǎo)入條目才會(huì)以 trustedCertEntry         信任證書(shū)的形式保存。

導(dǎo)入簽發(fā)證書(shū)到 jks 文件 ( 更新證書(shū) )

命令:keytool -importcert -alias TEST_SERVER -file         test_server.cer -keystore TEST_SERVER.jks

解釋?zhuān)?/strong>將證書(shū) test_server.cer 更新到已存在別名 TEST_SERVER 的         TEST_SERVER.jks 文件中

注意:這里的命令和上述導(dǎo)入信任證書(shū)的命令在形式上完全一樣,但作用不同。

1. 這里的目標(biāo) jks 文件里要含有指定的別名,這樣 keytool 工具才會(huì)理解命令為更新證書(shū),并以 PrivateKeyEntry 的形式保存。

2. 在更新被簽發(fā)證書(shū)之前,一定要先將相應(yīng)的 CA 證書(shū),導(dǎo)入進(jìn) jks 文件,否則會(huì)報(bào)錯(cuò)“keytool 錯(cuò)誤 : java.lang.Exception:         無(wú)法從回復(fù)中建立鏈”。

打印證書(shū)內(nèi)容

命令:keytool – printcert – v – file test_server.cer

解釋?zhuān)?/strong>將證書(shū) test_server.cer 的內(nèi)容打印出來(lái)

注意:也可以使用 -sslserver ip:port 的參數(shù),直接從網(wǎng)絡(luò)上打印出某個(gè) ssl server 提供的證書(shū)的內(nèi)容,詳情見(jiàn) 參考資料中列出的 keytool 使用幫助。

顯示 jks 文件里的內(nèi)容

命令:keytool – list – v – keystore test_server.jks

解釋?zhuān)?/strong>顯示 test_server.jks 里存儲(chǔ)的所有條目

注意:這里會(huì)要求提供 jks 文件的密碼,如果不輸入,也可以顯示出所有條目信息,但會(huì)提示“存儲(chǔ)在密鑰庫(kù)中的信息的完整性尚未得到驗(yàn)證!”

從 jks 文件刪除條目

命令:keytool -delete -alias TEST_ROOT -keystore test_server.jks

解釋?zhuān)?/strong>從 test_server.jks 中刪除別名為 TEST_ROOT 的條目

安全套接字程序編寫(xiě)的方法

使用 Java 編寫(xiě)安全套接字程序,可以遵循一定的方法,如圖 1 所示,展示了相關(guān)的各個(gè)類(lèi)之間的關(guān)系。其中         Keystore、KeyManagerFactory、TrustManagerFactory、SSLContext 可以稱(chēng)之為“引擎類(lèi)”(engine         class),對(duì)它們指定特定的參數(shù) ( 例如:協(xié)議、算法等 ),就可以產(chǎn)生符合我們要求的,用于編程的對(duì)象實(shí)例。

圖 1. 相關(guān)類(lèi)之間的關(guān)系

Java安全套接字編程以及keytool使用最佳實(shí)踐分析

(注:圖片引自 《 Java™ Secure Socket Extension (JSSE) Reference Guide 》)

編程的步驟可以簡(jiǎn)單的小結(jié)為以下幾步:

1. 使用 Keystore 類(lèi)將證書(shū)庫(kù)或信任庫(kù)文件加載進(jìn)來(lái);

2. 使用 KeyManagerFactory 和加載了證書(shū)庫(kù)的 Keystore 實(shí)例,產(chǎn)生 KeyManager 實(shí)例數(shù)組;

3. 使用 TrustManagerFactory 和加載了信任庫(kù)的 Keystore 實(shí)例,產(chǎn)生 TrustManager 實(shí)例數(shù)組;

4. 使用 SSLContext 初始化 KeyManager 實(shí)例數(shù)組和 TrustManager 實(shí)例數(shù)組,從而設(shè)定好通信的環(huán)境。

5. 利用 SSLContext 產(chǎn)生的 SSLSocket 或 SSLServerSocket 進(jìn)行通信。

在編寫(xiě)具體程序之前,我們需要利用前文對(duì)keytool 工具的知識(shí)介紹,準(zhǔn)備如下 jks 文件:

1. test_root.jks:該文件中存有自簽發(fā)的證書(shū),用作 CA 來(lái)簽發(fā)證書(shū);

2. test_server_cert.jks:該文件中存有 CA 簽名的證書(shū),用于 SSL/TSL 通信的服務(wù)端;

3. test_server_trust.jks:該文件中存有信任客戶端的證書(shū),用于 SSL/TSL 通信的服務(wù)端;

4. test_client_cert.jks:該文件中存有 CA 簽名的證書(shū),用于 SSL/TSL 通信的客戶端;

5. test_client_trust.jks:該文件中存有信任服務(wù)端的證書(shū),用于 SSL/TSL 通信的客戶端。

假定每個(gè) jks 文件的密碼都設(shè)定為“Testpassw0rd”,都存放在“D:”盤(pán)下。

通過(guò)系統(tǒng)屬性指定證書(shū)庫(kù)和信任庫(kù)

這種編寫(xiě)方式比較簡(jiǎn)單直觀,可以通過(guò)給 JVM 傳遞參數(shù),或者在代碼中使用 System.setProperty() 方法,來(lái)指定通信需要的 jks 文件。

服務(wù)端程序

要運(yùn)行如清單 1 所示的程序,可以在命令行添加如下虛擬機(jī)參數(shù),指定服務(wù)端程序要使用的證書(shū)庫(kù)和密碼:

-Djavax.net.ssl.keyStore="D:/test_server_cert.jks"

-Djavax.net.ssl.keyStorePassword="Testpassw0rd"

注意到程序中 setNeedClientAuth(false),表示不需要驗(yàn)證客戶端身份。如果這里設(shè)置為 true,則我們這里還需要指定信任庫(kù)和密碼:

-Djavax.net.ssl.trustStore="D:/test_server_trust.jks"

-Djavax.net.ssl.trustStorePassword="Testpassw0rd"

清單 1. 簡(jiǎn)單的 SSL 通信服務(wù)端程序

import java.io.BufferedReader;   import java.io.IOException;   import java.io.InputStreamReader;   import java.net.Socket;    import javax.net.ssl.SSLServerSocket;   import javax.net.ssl.SSLServerSocketFactory;   import javax.net.ssl.SSLSocket;     public class Simple_SSLServerSocket{    // 定義了監(jiān)聽(tīng)端口號(hào)   private final static int LISTEN_PORT=54321;     public static void main(String args[]) throws IOException{      SSLServerSocket serverSocket=null;      SSLSocket clientSocket=null;      // 使用默認(rèn)方式獲取套接字工廠實(shí)例     SSLServerSocketFactory ssf=(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();     try{        serverSocket=(SSLServerSocket)ssf.createServerSocket(LISTEN_PORT);        // 設(shè)置不需要驗(yàn)證客戶端身份       serverSocket.setNeedClientAuth(false);       System.out.println("SSLServer is listening on "+LISTEN_PORT+" port");        // 循環(huán)監(jiān)聽(tīng)端口,如果有客戶端連入就新開(kāi)一個(gè)線程與之通信       while(true){          // 接受新的客戶端連接         clientSocket=(SSLSocket)serverSocket.accept();          ClientConnection clientConnection=new ClientConnection(clientSocket);          // 啟動(dòng)一個(gè)新的線程         Thread clientThread=new Thread(clientConnection);          System.out.println("Client "+clientThread.getId()+" is connected");          clientThread.run();        }      }catch(IOException ioExp){        ioExp.printStackTrace();      }catch(Exception e){        e.printStackTrace();      }finally{        serverSocket.close();      }    }   }    class ClientConnection implements Runnable{    private Socket clientSocket=null;    public ClientConnection(SSLSocket sslsocket){      clientSocket=sslsocket;    }    public void run(){      BufferedReader reader=null;      // 將接收到的來(lái)自客戶端的文字打印出來(lái)     try{        reader=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));        while(true){          String line=reader.readLine();          if(line==null){            System.out.println("Communication end.");            break;          }          System.out.println("Receive message: "+line);        }        reader.close();        clientSocket.close();      }catch(IOException ioExp){        ioExp.printStackTrace();      }catch(Exception e){        e.printStackTrace();      }    }   }

客戶端程序

對(duì)應(yīng)于清單 1 所示的服務(wù)端程序,清單 2 是客戶端程序,需要在命令行添加如下虛擬機(jī)參數(shù),指定信任庫(kù)和密碼:

-Djavax.net.ssl.trustStore="D:/test_client_trust.jks"

-Djavax.net.ssl.trustStorePassword="Testpassw0rd"

如果服務(wù)端程序 setNeedClientAuth(true) 要求驗(yàn)證客戶端身份,則我們還需要指定證書(shū)庫(kù)和密碼:

-Djavax.net.ssl.keyStore="D:/test_client_cert.jks"

-Djavax.net.ssl.keyStorePassword="Testpassw0rd"

清單 2. 簡(jiǎn)單的 SSL 通信客戶端程序

import java.io.BufferedReader;   import java.io.IOException;   import java.io.InputStreamReader;   import java.io.OutputStreamWriter;   import java.io.Writer;   import javax.net.ssl.SSLSocket;   import javax.net.ssl.SSLSocketFactory;     public class Simple_SSLSocket{    // 定義要連接的

通過(guò) SSLContext 指定證書(shū)庫(kù)和信任庫(kù)

前文描述的,通過(guò)系統(tǒng)參數(shù)指定證書(shū)庫(kù)和信任庫(kù)的方法,雖然簡(jiǎn)單易用,但是缺點(diǎn)也是顯而易見(jiàn)的,整個(gè)程序的環(huán)境都得使用同樣的 jks 文件。如果程序里有不同的 SSL/TSL         通信,則需要使用不同的 jks 文件,該怎么做呢?

可以使用 SSLContext 來(lái)指定 jks 文件,只需要把清單 3 的代碼片段替換到清單 1 的“SSLServerSocketFactory ssf”生成處;把清單 4         的代碼片段替換到清單 2 的“SSLSocketFactory sf”生成處,再稍作代碼調(diào)整即可。

(注:實(shí)際上,在使用 SSLSocketFactory.getDefault() 或者         SSLServerSocketFactory.getDefault() 創(chuàng)建套接字的時(shí)候,程序內(nèi)部已經(jīng)使用了默認(rèn)的 context,其參數(shù)就是通過(guò)系統(tǒng)屬性指定的 )

清單 3. SSLContext 指定證書(shū)庫(kù)

// 相關(guān)的 jks 文件及其密碼定義  private final static String CERT_STORE="D:/test_server_cert.jks";   private final static String CERT_STORE_PASSWORD="Testpassw0rd";  // 載入 jks 文件  FileInputStream f_certStore=new FileInputStream(CERT_STORE);   KeyStore ks=KeyStore.getInstance("jks");   ks.load(f_certStore, CERT_STORE_PASSWORD.toCharArray());   f_certStore.close();    // 創(chuàng)建并初始化證書(shū)庫(kù)工廠  String alg=KeyManagerFactory.getDefaultAlgorithm();   KeyManagerFactory kmFact=KeyManagerFactory.getInstance(alg);   kmFact.init(ks, CERT_STORE_PASSWORD.toCharArray());    KeyManager[] kms=kmFact.getKeyManagers();    // 創(chuàng)建并初始化 SSLContext 實(shí)例  SSLContext context=SSLContext.getInstance("SSL");   context.init(kms, null, null);   SSLServerSocketFactory ssf=(SSLServerSocketFactory)context.getServerSocketFactory();

清單 4. SSLContext 指定信任庫(kù)

// 相關(guān)的 jks 文件及其密碼定義  private final static String TRUST_STORE="D:/test_client_trust.jks";   private final static String TRUST_STORE_PASSWORD="Testpassw0rd";  // 載入 jks 文件  FileInputStream f_trustStore=new FileInputStream(TRUST_STORE);   KeyStore ks=KeyStore.getInstance("jks");   ks.load(f_trustStore, TRUST_STORE_PASSWORD.toCharArray());   f_trustStore.close();    // 創(chuàng)建并初始化信任庫(kù)工廠  String alg=TrustManagerFactory.getDefaultAlgorithm();   TrustManagerFactory tmFact=TrustManagerFactory.getInstance(alg);   tmFact.init(ks);    TrustManager[] tms=tmFact.getTrustManagers();    // 創(chuàng)建并初始化 SSLContext 實(shí)例  SSLContext context=SSLContext.getInstance("SSL");   context.init(null, tms, null);   SSLSocketFactory sf=context.getSocketFactory();

當(dāng)然,如果要在服務(wù)端或者客戶端同時(shí)使用證書(shū)庫(kù)和信任庫(kù),可將清單 3 和清單 4 的代碼用在同一處 context.init() 的地方。

這里需要說(shuō)明的是,如果 context.init() 的第一個(gè) KeyManager[] 參數(shù)為 null,則表示不提供證書(shū);如果第二個(gè) TrustManager[] 參數(shù)為         null,則會(huì)尋找系統(tǒng)默認(rèn)提供的信任庫(kù) ( 例如:JRE 安裝目錄下的 lib/security/cacerts)。

使用 X509 證書(shū)信任管理器

X509TrustManager 接口擴(kuò)展了 TrustManager 接口,使用 TrustManager         接口,我們已經(jīng)可以在程序中自定義信任庫(kù)了,但如果對(duì)方的證書(shū)不在信任庫(kù)中,則通信會(huì)直接宣告失敗。

如果希望能自定義信任庫(kù)的一些行為 ( 例如:檢驗(yàn)對(duì)方證書(shū),針對(duì)異常做一些處理 ),我們可以使用 X509TrustManager 接口,實(shí)現(xiàn)自己的方法。

如清單 5 所示,假定我們要在客戶端程序使用 X509TrustManager,那么就可以在 checkServerTrusted()         函數(shù)里做一些事情,檢測(cè)到服務(wù)端證書(shū)異常的話,就可以做一些自己的處理。CheckClientTrusted() 則是用于服務(wù)端檢測(cè)客戶端的證書(shū)情況。

將清單 5 的代碼替換到清單 4 的 TrustManager[] tms 的生成處,并對(duì)代碼稍作調(diào)整即可。

清單 5. X509TrustManager 的使用

// 使用自定義的 MyTrustManager 產(chǎn)生信任庫(kù)  TrustManager[] tms=new TrustManager[]{new MyTrustManager()};  …… ……  class MyTrustManager implements X509TrustManager{    // 相關(guān)的 jks 文件及其密碼定義   private final static String TRUST_STORE="D:/test_client_trust.jks";    private final static String TRUST_STORE_PASSWORD="Testpassw0rd";    X509TrustManager xtm;      public MyTrustManager() throws Exception {      // 載入 jks 文件     KeyStore ks = KeyStore.getInstance("JKS");      ks.load(new FileInputStream(TRUST_STORE),TRUST_STORE_PASSWORD.toCharArray());      TrustManagerFactory tmf =TrustManagerFactory.getInstance("SunX509", "SunJSSE");      tmf.init(ks);     TrustManager[] tms = tmf.getTrustManagers();     // 篩選出 X509 格式的信任證書(shū)     for (int i = 0; i < tms.length; i++) {        if (tms[i] instanceof X509TrustManager) {          xtm = (X509TrustManager) tms[i];          return;        }      }    }   // 服務(wù)端檢驗(yàn)客戶端證書(shū)的接口   public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException{    }  // 客戶端檢驗(yàn)服務(wù)端證書(shū)的接口   public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException{      try{        xtm.checkServerTrusted(chain, authType);      }catch(CertificateException excep){        System.out.println(excep.getMessage());        throw excep;      }    }   // 獲取可接受的發(fā)行者   public X509Certificate[] getAcceptedIssuers() {     //return xtm.getAcceptedIssuers();      return null;    }   }

注意:

1. 當(dāng)服務(wù)端代碼 setNeedClientAuth(False) 時(shí),客戶端的 MyTrustManager 實(shí)現(xiàn)了 X509TrustManager 后,如果         checkServerTrusted() 方法的實(shí)現(xiàn)為空,則無(wú)論服務(wù)端使用什么證書(shū),客戶端都會(huì)默認(rèn)接受;如果要對(duì)服務(wù)端證書(shū)進(jìn)行檢查,還需要像清單 5         中的代碼片段那樣,捕捉異常并處理。

2.getAcceptedIssuers() 方法通常不需要具體實(shí)現(xiàn),但是當(dāng)服務(wù)端要求檢驗(yàn)客戶端身份,也即 setNeedClientAuth(True) 時(shí),服務(wù)端需也需要具體實(shí)現(xiàn)         X509TrustManager,且 getAcceptedIssuers() 方法要如清單 5 中注釋部分代碼那樣實(shí)現(xiàn)。

調(diào)試 SSL/TSL 程序

打開(kāi)調(diào)試開(kāi)關(guān)觀察通信日志

圖 2 描述了 SSL/TSL 通信的握手過(guò)程。在實(shí)際編寫(xiě)程序的時(shí)候,可能會(huì)在這些環(huán)節(jié)遇到問(wèn)題,導(dǎo)致無(wú)法通信,排查起來(lái)往往令人無(wú)從下手。這個(gè)時(shí)候我們可以將 SSL/TSL         通信的握手日志開(kāi)關(guān)打開(kāi),進(jìn)行觀察。

圖 2.SSL 通信協(xié)議握手過(guò)程

Java安全套接字編程以及keytool使用最佳實(shí)踐分析

(注:圖片引自 《Java™ Secure Socket Extension (JSSE) Reference Guide》)

打開(kāi)日志開(kāi)關(guān)的方法同樣是通過(guò)設(shè)定系統(tǒng)屬性,可以從命令行添加虛擬機(jī)參數(shù):

-Djavax.net.debug=ssl,handshake

當(dāng)然也可以使用 System.setProperty() 方法在代碼中打開(kāi)該開(kāi)關(guān)。

打開(kāi)日志開(kāi)關(guān)后,可以搜索“ClientHello”、“ServerHello”等關(guān)鍵字;或者搜索“*** ”( 三個(gè)星號(hào)和一個(gè)空格 )         ——這是握手階段每一個(gè)步驟日志打印的開(kāi)始標(biāo)志。通過(guò)閱讀日志來(lái)定位問(wèn)題。更詳細(xì)的開(kāi)關(guān)信息,請(qǐng)參閱 JSSE 指導(dǎo)中的“Debugging Utilities”章節(jié):

選擇通信的 Cipher Suites

有的時(shí)候?yàn)榱俗鰧?shí)驗(yàn),我們會(huì)選用特定的 Cipher Suites,我們可以使用 SSLServerSocket 或 SSLSocket 的         getEnabledCipherSuites() 觀察到默認(rèn)支持的所有加密套件的信息,然后使用 setEnabledCipherSuites() 進(jìn)行設(shè)置。

清單 6 展示了從服務(wù)端過(guò)濾掉所有的匿名加密套件的代碼。

清單 6. 過(guò)濾所有的匿名加密套件

String enabled[]=serverSocket.getEnabledCipherSuites();  Set filter = new LinkedHashSet();  for(int i = 0; i < enabled.length; i++) {  if(enabled[i].indexOf("anon")<0){  filter.add(enabled[i]);  }  }  serverSocket.setEnabledCipherSuites(filter.toArray(new String[filter.size()]));

關(guān)于Java安全套接字編程以及keytool使用最佳實(shí)踐分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


分享名稱(chēng):Java安全套接字編程以及keytool使用最佳實(shí)踐分析
文章起源:
http://www.dlmjj.cn/article/goiehg.html