java https:// localhost(SSL) - 可能没有在客户端上安装证书?

时间:2017-12-12 23:24:42

标签: java ssl https kotlin

阅读以下内容后,我仍然坚持制作最小的 https :// localhost独立安装免费的webserver java应用程序。它需要无库,使用Java 8,并接受来自浏览器的连接,而无需先安装任何特殊的客户端证书。我不清楚这是否完全可以使用自签名证书,因为它只能用于“localhost”。

到目前为止,我已经使用

生成了一些关键文件
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文件吗?甚至可以在客户端浏览器上安装证书的情况下完成这项工作吗?

1 个答案:

答案 0 :(得分:2)

通过HTTPS获取客户端(浏览器)和服务器之间的安全连接有两种常见方法:

  1. 您可以为默认情况下由用户的Web浏览器信任的根证书颁发机构(CA)签名的服务器获取SSL证书。

  2. 您可以生成自签名SSL证书,并让用户将其作为受信任的证书导入其Web浏览器。

  3. 到目前为止,您所做的似乎是生成一个服务器端密钥库,其中包含自签名证书,并且(或多或少)配置了Kotlin服务器以使用它。问题是客户端(浏览器)。没有用户或用户的系统管理员的参与,没有安全的方法让浏览器信任自签名证书。 (安全......对用户来说是安全的!)

    并且合法的CA不应该为" localhost&#34 ;;颁发SSL证书。例如https://www.ssl2buy.com/wiki/how-to-get-ssl-certificate-for-web-applications-that-runs-on-localhost

    僵局。

    好的,让我们退后一步。使用HTTPS / SSL的目的是确保:

    1. 用户的网络浏览器正在与正确的服务器通信,而不是模仿它的其他服务器。

    2. 浏览器与服务器之间的连接已加密,因此任何第三方都无法窥探流量。

    3. 但您正尝试为localhost连接执行此操作。 localhost IP地址是环回地址。除非操作系统内核受到损害,否则可以保证通过环回连接发送的网络数据包不会离开主机。

      1. 你可以解雇"模仿"问题。假设用户的机器没有受到损害,那么其他任何人都无法启动"假的"用户机器上的服务器。

      2. 你可以解雇" snooping"问题。假设用户的机器没有受到损害:

        • 数据包不会离开主机,因此无法在任何"外部"网络。
        • 唯一可以"窥探"环回网络上的数据包是他/她自己。
      3. 所以,解决方案很简单。使用" http"为你的" localhost"连接。它应该是安全的......假设用户的机器没有受到损害。

        注意:如果用户的计算机已被盗用,那么坏人有其他方法可以拦截SSL无法防范的流量。