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

标签 java ssl https kotlin

阅读以下内容后,我仍然坚持制作最低限度的 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. 您可以获得由根证书颁发机构 (CA) 签名的服务器的 SSL 证书,默认情况下用户的网络浏览器信任该证书。

  2. 您可以生成一个自签名 SSL 证书,并让用户将其作为受信任的证书导入到他们的网络浏览器中。

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

并且任何合法的 CA 都不应该为“本地主机”颁发 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. 您可以忽略“窥探”问题。假设用户的机器没有被破坏:

    • 数据包不会脱离主机,因此无法在任何“外部”网络上窥探。
    • 唯一可以“窥探”环回网络上的数据包的人是他/她自己。

所以,解决方法很简单。使用“http”作为“localhost”连接。它应该是安全的......假设用户的机器没有受到损害。

注意:如果用户的机器已被入侵,那么坏人有其他方法可以拦截 SSL 无法防御的流量。

关于java https ://localhost (SSL) - possible without installing certs on client?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783200/

相关文章:

android - BouncyCaSTLe 版本和 SSL 证书验收

php - 切换到HTTPS后无法登录PHPmyAdmin

google-chrome - 不同的浏览器如何处理混合/不安全的内容?

java - 为什么在 String.valueOf 中返回 "null"String 而不是 java null?

java - Thread.sleep 行为异常

python - peewee mysql SSL : CERTIFICATE_VERIFY_FAILED

docker - 如何在 Docker 容器中的 Tomcat 上启用 HTTPS?

java - 将 Future 转换为 Mono

java - Java EE规范的实现在Scala中能否更高效?

PHP Curl(带 NSS)在连接到 https 时可能使用 SSLv3 而不是 TLS