簡體   English   中英

java https://localhost (SSL) - 可能無需在客戶端安裝證書?

[英]java https://localhost (SSL) - possible without installing certs on client?

閱讀以下內容后,我仍然堅持制作最低限度的https ://localhost 獨立安裝免安裝網絡服務器 java 應用程序。 它需要無庫,使用 Java 8,並接受來自瀏覽器的連接,而無需先安裝任何特殊的客戶端證書。 我不清楚這是否可以使用自簽名證書,因為它只需要為“本地主機”工作。

到目前為止,我已經使用生成了一些關鍵文件

openssl genrsa -aes128 -out privkey.pem 2048  # makes privkey.pem
openssl req -new -x509 -key privkey.pem # makes cert.crt

我拼湊了最低限度的 Kotlin 設置功能

private fun ssl():SSLServerSocketFactory {
    val password = "MYPASSWORD".toCharArray()
    val kmf = KeyManagerFactory.getInstance("SunX509")
    val tmf = TrustManagerFactory.getInstance("SunX509")
    val sslContext = SSLContext.getInstance("TLS")

    // initialise the keystore
    KeyStore.getInstance("JKS").let { ks->
        FileInputStream("lig.keystore").use {
            ks.load(it, password)
        }
        kmf.init(ks, password)
        tmf.init(ks)
    }

    // setup the HTTPS context and parameters
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null)
    return sslContext.serverSocketFactory
}
ssl().createServerSocket().use { serverSocket ->
            serverSocket.reuseAddress = true
            serverSocket.bind(InetSocketAddress(port))
            logger.info { "WebServer ready and listening on ${serverSocket.localPort}" }

但是我在如何完成它時遇到了麻煩:我需要制作一個lig.keystore文件嗎? 這甚至可以在客戶端瀏覽器上不安裝證書的情況下完成嗎?

有兩種常見的方法可以通過 HTTPS 在客戶端(瀏覽器)和服務器之間建立安全連接:

  1. 默認情況下,您可以為由用戶 Web 瀏覽器信任的根證書頒發機構 (CA) 簽署的服務器獲取 SSL 證書。

  2. 您可以生成自簽名 SSL 證書,並讓用戶將其作為受信任的證書導入他們的 Web 瀏覽器。

到目前為止,您所做的似乎是生成一個帶有自簽名證書的服務器端密鑰庫,並且(或多或少)配置了 Kotlin 服務器以使用它。 問題是客戶端(瀏覽器)。 在沒有用戶或用戶系統管理員參與的情況下,沒有安全的方法讓瀏覽器信任自簽名證書。 (安全......對用戶來說是安全的!)

任何合法的 CA 都不應該為“localhost”頒發 SSL 證書; 例如https://www.ssl2buy.com/wiki/how-to-get-ssl-certificate-for-web-applications-that-runs-on-localhost

僵局。

好的,讓我們退后一步。 使用 HTTPS / SSL 的目的是確保:

  1. 用戶的 Web 瀏覽器正在與正確的服務器通信,而不是其他一些冒充它的服務器。

  2. 瀏覽器和服務器之間的連接是加密的,因此沒有第三方可以窺探流量。

但是您正在嘗試為localhost連接執行此操作。 localhost IP 地址是一個環回地址。 除非操作系統內核受到損害,否則您可以保證通過環回連接發送的網絡數據包不會離開主機。

  1. 您可以忽略“模擬”問題。 假設用戶的機器沒有受到損害,其他人就無法在用戶的機器上啟動“假”服務器。

  2. 您可以忽略“窺探”問題。 假設用戶的機器沒有被入侵:

    • 數據包不會脫離主機,因此無法在任何“外部”網絡上窺探它們。
    • 唯一可以“窺探”環回網絡上的數據包的人是用戶他/她自己。

所以,解決方法很簡單。 對“localhost”連接使用“http”。 它應該是安全的......假設用戶的機器沒有受到損害。

注意:如果用戶的機器已被入侵,那么壞人有其他方法來攔截 SSL 無法防御的流量。

另一個具體案例:

我正面臨一個來自 https 的網絡應用程序,它將在 http://localhost 加載本地數據

Safari Web 瀏覽器由於安全流 (https) 中的不安全通信 (http) 而被阻止。

可以討論這種行為,但在那種情況下,本地主機的自簽名證書會有所幫助。即使 Safari 瀏覽器發出警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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