2012-04-10 103 views
0

我有一個在GlassFish 3.x上運行的應用程序。它通過https與遠程服務器通信。在我的cacerts文件中,我添加了服務器證書。在我的keystore.jks中,我添加了運行遠程服務器的公司發給我的私鑰。這對Glassfish 2.x非常有用,但是在3.x中,他們遠程服務器不斷抱怨我擁有的密鑰無效。我的應用程序如何知道使用什麼私鑰

如果我從密鑰庫中刪除密鑰,則會得到相同的錯誤。這是因爲如果它甚至沒有加載密鑰,這已經讓我不知道如何應用程序/容器知道我需要哪些關鍵

我的連接代碼如下所示:

public class SSLSocket { 

private static Logger logger = LoggerFactory.getLogger(SSLSocket.class); 
private ConnectionProperties connectionProperties; 

public TuSSLSocket(ConnectionProperties connectionProperties) { 
    this.connectionProperties = connectionProperties; 
} 

public SSLSocket getSSLSocket() throws Exception{ 
    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    SSLSocket socket = (SSLSocket) factory.createSocket(connectionProperties.getHost(), connectionProperties.getPort()); 
    socket.setSoTimeout(90000); 

    return socket; 
} 

} 

我設置的主機和端口相應地,但沒有我說的地方去在密鑰庫中尋找這個別名。所以...應用程序如何知道別名是什麼?

+1

只是爲了澄清「在我的keystore.jks中,我添加了運行遠程服務器的公司發給我的私鑰」並未發生。沒有人會給你他們的私鑰。你有什麼是他們的公鑰。 – 2012-04-11 01:23:08

+0

可能是...... keytool -list等......說這是一個私鑰。 – Preston 2012-04-11 02:50:14

+0

如果確實是來自別處的私鑰,則應立即調用安全性。由於不止一方知道私鑰,所以私鑰是毫無價值的。它不能用來唯一標識您的意圖,並且所得到的事務在您的部分是不可批准的,所以它不會爲遠程服務器公司提供任何級別的安全性。您應該生成您自己的私鑰和證書,並獲取由CA簽名的證書。 – EJP 2012-04-11 06:16:34

回答

0

解釋雙向ssl和爵士樂正在耗盡。我會盡力找到一個有用的鏈接。但是,對於部署在glassfish中的應用程序作爲客戶端通過SSL與服務器通信(例如通過SSL端口配置的LDAP服務器領域)進行通信的情況,爲了您的信息,它將使用glassfish服務器的身份證書(來自其密鑰庫)作爲其客戶端證書。

但是,如果您明確地編寫了SSL握手代碼,則客戶端應用程序負責選擇密鑰庫並將證書作爲握手的一部分進行呈現。

由於它在以前版本的Glassfish中工作,相同的代碼應該適合您。您的問題很可能與配置有關。我有點困惑,你已經添加到服務器的keystore.jks一般其他服務器的證書添加到信任存儲什麼cacerts.jks

一個useful glassfish ssl example

SSL Socket client example

Example of choosing keystore in client.

+0

感謝您的例子。這些都沒有顯示應用程序如何找到別名。 – Preston 2012-04-11 15:41:50

0

有兩種方法完成此操作 第一個:

從admi打開以下路徑n控制檯頁面。

  • 配置
  • 羣集/實例配置。
  • JVM設置
  • JVM選項
  • ,你會發現這條線一些地方在項目列表 -Dcom.sun.enterprise.security.httpsOutboundKeyAlias =爲s1as

更改爲s1as價值的要使用的證書別名。其他選項是將系統屬性添加到您的代碼中 System.setProperty(「com.sun.enterprise.security.httpsOutboundKeyAlias」,「your certificate alias」);

相關問題