2012-07-25 21 views
0

如何以編程方式創建私鑰並在SSL套接字中使用它?服務器存貨的關鍵代碼

我把一個註釋的異常下面,我試圖將密鑰添加到密鑰存儲區,但我沒有證書鏈。

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
    keyGen.initialize(1024, new SecureRandom()); 
    KeyPair keypair = keyGen.generateKeyPair(); 

    System.setProperty("javax.net.ssl.keyStore", System.getProperty("user.home") 
     + File.separator + 
      + "/keystore.jks"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "xyz"); 

    KeyManagerFactory keyManagerFactory = KeyManagerFactory 
      .getInstance("SunX509"); 
    KeyStore keyStore = KeyStore.getInstance("JKS"); 
    keyStore.load(null, "xyz".toCharArray()); 

    //setKeyEntry parameter 3 can not be null: 
    //IllegalArgumentException: Private key must be accompanied by certificate chain 
    keyStore.setKeyEntry("alias", keypair.getPrivate(), 
      "xyz".toCharArray(), null); 

    keyManagerFactory.init(keyStore, "xyz".toCharArray()); 
    // keyStore.load 
    SSLContext context = SSLContext.getInstance("TLS");// "SSLv3" 
    context.init(keyManagerFactory.getKeyManagers(), null, 
      new SecureRandom()); 
    ServerSocketFactory socketFactory = context.getServerSocketFactory(); 
    ServerSocket ssocket = socketFactory.createServerSocket(1443); 
    Socket socket = ssocket.accept(); 
+0

問題是什麼? – 2012-07-25 20:15:48

+0

我幾乎把它(keyStore.setKeyEntry( 「別名」,keypair.getPrivate(), \t \t \t \t 「XYZ」 .toCharArray(),NULL)),但是,最後一個參數是必需的證書鏈,但我不沒有證書鏈。 ...我不想額外的JAR,但我可能必須包含bouncycastle才能做到這一點:http://blog.thilinamb.com/2010/01/how-to-generate-self-signed.html – jcalfee314 2012-07-25 20:53:50

+0

HI Alen,問題是:如何以編程方式創建私鑰並將其用於SSL套接字? – jcalfee314 2012-07-25 20:57:33

回答

1

如何編程創建一個私有密鑰和一個SSL 插座使用它呢?

僅創建一個私鑰甚至只是一個私鑰/公鑰對都沒有意義。您需要在服務器上設置的是與此私鑰相關聯的證書。

基於ASN.1語法,X.509證書是相當複雜的結構。我強烈建議您使用BouncyCastle(或多或少地按照您鏈接到的博客文章中的描述)。手工操作並非易事。 (如果您不確定,請查看BouncyCastle類的源代碼。)

此外,動態創建此證書(及其關聯的私鑰)幾乎沒有意義。證書的要點是允許客戶端驗證它正在與之通話的服務器的身份。客戶端通過檢查服務器證書與其擁有的可信證書列表(使用PKI或通過與手動配置的特定服務器證書進行單獨比較)來執行此操作。

如果您動態生成自簽名證書,則客戶無法將其與預先知道的事項進行比較。如果您的服務器也是CA(適用於類似於MITM代理服務器的應用程序),它可能會很有用。

+0

如果我創建X.509並將其包含在程序中,該怎麼辦?沒有要求有一個獨特的x509,只是唯一的鍵。順便說一句,我會設計這個應用程序爲新用戶創建新的密鑰,然後讓他們鏈接一個比較指紋。每個新連接都需要兩個批准(每個連接一個)。他們將使用文字,電話等相互授權。所以,我使用哪個CA並不重要,這應該仍然非常安全。 – jcalfee314 2012-07-26 13:32:54

+0

如果您有外部驗證密鑰的方式,那很好。只是通過電話/文本獲得的指紋在可用性方面可能會有點長。請記住,證書也將一個身份與一個密鑰綁定(因此用戶還需要知道它的密鑰)。 X.509證書包含公鑰。您必須構建正確的DER結構並手動簽名(與[此答案]的第二部分相反(http://stackoverflow.com/a/10414727/372643),它驗證簽名)。從公鑰手動構建格式良好的DER結構可能很乏味(並且容易出現錯誤)。 – Bruno 2012-07-26 13:39:13

+0

原來我沒有SSL套接字的要求。我將直接與密碼流一起工作。謝謝你的幫助。我對證書鏈有了更好的理解。 – jcalfee314 2012-07-30 13:01:58