簡體   English   中英

Java RMI SSL poss密鑰庫/信任庫錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM