Java的HTTPS://本地主机(SSL) – 可能没有在客户端上安装证书?

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

  • 如何让SSL服务器套接字在java中同时支持http和https?
  • 我简单的java HTTPS服务器只适用于本地主机
  • 简单的Java HTTPS服务器

到目前为止,我已经使用一些关键的文件

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

我已经拼凑出最低限度的Kotlin设置function

 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. 您可以解除“窥探”问题。 假设用户的机器没有被盗用:

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

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

    注意:如果用户的机器已经被盗用 ,那么坏人有其他的方法来拦截SSL不能防止的流量。