阅读以下内容后,我仍然坚持制作最低限度的 https://localhost 独立的免安装网络服务器 java 应用程序。它需要无库,使用 Java 8,并且无需先安装任何特殊的客户端证书即可接受来自浏览器的连接。我不清楚这是否完全有可能使用自签名证书,因为它只需要为“本地主机”工作。
- How make SSL server socket support both http & https in java?
- My simple java HTTPS server only works for localhost
- Simple Java HTTPS server
到目前为止,我已经使用
生成了一些关键文件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 在客户端(浏览器)和服务器之间建立安全连接:
您可以获得由根证书颁发机构 (CA) 签名的服务器的 SSL 证书,默认情况下用户的网络浏览器信任该证书。
您可以生成一个自签名 SSL 证书,并让用户将其作为受信任的证书导入到他们的网络浏览器中。
到目前为止,您所做的似乎是生成一个服务器端 keystore ,其中包含自签名证书,并(或多或少)配置 Kotlin 服务器以使用它。问题是客户端(浏览器)。如果没有用户或用户的系统管理员的参与,没有安全的方法可以让浏览器信任自签名证书。 (安全......对用户来说是安全的!)
并且任何合法的 CA 都不应该为“本地主机”颁发 SSL 证书;例如https://www.ssl2buy.com/wiki/how-to-get-ssl-certificate-for-web-applications-that-runs-on-localhost
僵局。
好的,让我们退后一步。使用 HTTPS/SSL 的目的是确保:
用户的 web 浏览器正在与正确的服务器通信,而不是与其他模拟它的服务器通信。
浏览器和服务器之间的连接是加密的,因此任何第三方都无法窥探流量。
但是您正在尝试为 localhost
连接执行此操作。 localhost
IP 地址是一个环回地址。除非操作系统内核受到威胁,否则您可以保证通过环回连接发送的网络数据包不会离开主机。
您可以忽略“模拟”问题。假设用户的机器没有受到损害,没有其他人可以在用户的机器上启动“假”服务器。
您可以忽略“窥探”问题。假设用户的机器没有被破坏:
- 数据包不会脱离主机,因此无法在任何“外部”网络上窥探。
- 唯一可以“窥探”环回网络上的数据包的人是他/她自己。
所以,解决方法很简单。使用“http”作为“localhost”连接。它应该是安全的......假设用户的机器没有受到损害。
注意:如果用户的机器已被入侵,那么坏人有其他方法可以拦截 SSL 无法防御的流量。
关于java https ://localhost (SSL) - possible without installing certs on client?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783200/