![](/img/trans.png)
[英]RMI over SSL, How do I integrate truststore and keystore into application?
[英]Java RMI SSL poss keystore / truststore error?
使用以下代碼測試通過RMI的SSL連接:
public class HelloImpl extends UnicastRemoteObject implements Hello {
public HelloImpl() throws RemoteException {
super(0, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory());
}
public String sayHello() {
return "Hello World!";
}
public static void main(String args[]) throws Exception {
// Get reference to the RMI registry running on port 3000 in the local host
Registry registry = LocateRegistry.getRegistry(null, 3000);
// Bind this object instance to the name "HelloServer"
HelloImpl obj = new HelloImpl();
registry.bind("HelloServer", obj);
System.out.println("HelloServer bound in registry");
}
}
其余的是相當通用的(從此處獲取一些代碼: http : //blogs.oracle.com/lmalventosa/entry/using_the_ssl_tls_based ),基本上是嘗試進行僅服務器身份驗證以使SSL正常工作。 但是,出現此令人討厭的錯誤:
RMI RenewClean-[146.169.51.86:60013,javax.rmi.ssl.SslRMIClientSocketFactory@4a63d8], READ: TLSv1 Alert, length = 2
RMI RenewClean-[146.169.51.86:60013,javax.rmi.ssl.SslRMIClientSocketFactory@4a63d8], RECV TLSv1 ALERT: fatal, bad_certificate
RMI RenewClean-[146.169.51.86:60013,javax.rmi.ssl.SslRMIClientSocketFactory@4a63d8], called closeSocket()
RMI RenewClean-[146.169.51.86:60013,javax.rmi.ssl.SslRMIClientSocketFactory@4a63d8], Exception while waiting for close javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
RMI RenewClean-[146.169.51.86:60013,javax.rmi.ssl.SslRMIClientSocketFactory@4a63d8], handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
從調試轉儲中可以看出,它們確實嘗試進行一次握手,甚至可以交換對稱密鑰,但由於某種無法解釋的原因,它們在此期間會失敗。 在編譯期間,我們指定一個存儲在以下文件夾中的信任庫:
# $ java -Djavax.net.ssl.trustStore=truststore -Djavax.net.ssl.trustStorePassword=trustword HelloClient
任何幫助,不勝感激!
在我看來,HelloImpl服務器提供的證書存在問題,這可能意味着您啟動服務器的方式存在問題,或者密鑰/證書生成過程存在問題。 你可以跑步嗎
keytool -list -v -keystore keystore
在啟動HelloImpl服務器的密鑰庫上,也許使用-Djavax.net.debug = SSL啟動服務器和客戶端,以查看是否有可用的附加信息? (如果是這樣,請使用這些詳細信息來編輯您的問題)在不知道密鑰庫和信任庫的狀態以及創建它們的過程的情況下,很難從上面的內容中判斷出錯誤是什么。
編輯:
bad_certificate表示服務器的證書采用客戶端不理解或希望拒絕的格式。
除了獲得新的服務器證書外,您對前者無能為力。
但是,似乎還有些瀏覽器在SSL握手期間獲取的服務器證書過期,自簽名,主機名驗證失敗等情況下發送bad_certficate警報以關閉HTTPS連接。Firefox在以下情況下使用此警報來關閉HTTPS連接:它向用戶顯示一個頁面,詢問是否信任此證書。 如果用戶同意,則Firefox然后打開一個新的HTTPS連接,這次接受證書而不是發送bad_certificate警報。
大概是發送了警報,而不僅僅是關閉了連接,因此服務器可以記錄實際發生的情況,或者在握手階段中止連接,而不冒任何通過其發送數據的風險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.