2011-09-28 106 views
0

這裏有多個分開的服務器通信是情景:Tomcat作爲客戶端通過SSL

  • 我現在已經在本地運行多個應用服務器(應該在不同的主機上運行) - >各自不同的端口上偵聽(在本地主機)。
  • 我有一個運行在Tomcat上的客戶端應用程序。
  • 啓動Tomcat時,請以不同用戶的詳細信息登錄並遠程連接到不同的(上述)服務器。

我的問題是:

  • 首先,我啓動Tomcat和登錄的用戶A,那麼它成功地連接到serverA的(本地主機:1000)。
  • 然後我退出了。
  • 按照用戶B重新登錄,它沒有按預期連接到serverB(localhost:1001);相反,它給出了異常 「javax.net.ssl.SSLHandshakeException:收到致命警報:certificate_unknown」
  • 但是,如果我重新啓動Tomcat,並以userB先登錄,它將成功連接到serverB。

有誰知道這個問題是什麼? 我真的很感激任何建議:)

代碼客戶端的Tomcat:

SetupClientKeystore(); 
SetupServerKeystore(); 
SSLContext context = SetupSSLContext(); 
SSLSocketFactory socketFactory = sslContext.getSocketFactory(); 
SSLSocket socket = (SSLSocket) socketFactory.createSocket(hostname, portNo); 
GZIPOutputStream gZipOut = new GZIPOutputStream(socket.getOutputStream()); // no trust certificate found throws here 

代碼ServerA和B:

setupClientKeyStore(); 
setupServerKeystore(); 
setupSSLContext(); 
server = new ServerSocket(portNo); 
SSLServerSocketFactory socketFactory = sslContext.getServerSocketFactory(); 
serverSocket = (SSLServerSocket) socketFactory.createServerSocket(portNo); 
serverSocket.setNeedClientAuth(true); 
while (true) 
{ 
    Socket client = serverSocket.accept(); 
inStream = client.getInputStream(); 
    BufferedInputStream bufferedIn = new BufferedInputStream(inStream); //unknown_certificate throws here 
    //do something here..... 
} 
+0

你是什麼意思的'連接',你做類似的Web服務調用從Tomcat到ServerA和ServerB? – home

+0

感謝您的及時答覆,通過「連接」我的意思是「打開與serverA的sslsocket連接並通過它發送/接收的東西」 – Jacey

+0

你能告訴我們調用外部服務器的代碼嗎? – home

回答

0

「javax.net.ssl.SSLHandshakeException:收到致命alert: certificate_unknown「

這通常表示服務器的證書不可信。
是否可以這樣:當您以userA身份登錄時,加載serverA的可信證書並連接,然後當您嘗試連接到serverB時,嘗試使用ServerA的證書來認證serverB(在以userA身份登錄時加載)?
因此,SSL握手失敗。
因此,當您重新啓動並以userB身份登錄時,相應的證書(即ServerB)已加載並且連接成功了嗎?
您的帖子中沒有代碼,但如果您按照我的說法操作,則可以解釋該例外情況。

+0

我曾經想過但仍然無法調試它。我剛纔發現那個bug。感謝您的幫助:) – Jacey

+0

這就是問題所在?您沒有重新加載信任庫? – Cratylus