阅读以下内容后,我仍然坚持制作最小的 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
文件吗?甚至可以在客户端浏览器上安装证书的情况下完成这项工作吗?
答案 0 :(得分:2)
通过HTTPS获取客户端(浏览器)和服务器之间的安全连接有两种常见方法:
您可以为默认情况下由用户的Web浏览器信任的根证书颁发机构(CA)签名的服务器获取SSL证书。
您可以生成自签名SSL证书,并让用户将其作为受信任的证书导入其Web浏览器。
到目前为止,您所做的似乎是生成一个服务器端密钥库,其中包含自签名证书,并且(或多或少)配置了Kotlin服务器以使用它。问题是客户端(浏览器)。没有用户或用户的系统管理员的参与,没有安全的方法让浏览器信任自签名证书。 (安全......对用户来说是安全的!)
并且合法的CA不应该为" localhost&#34 ;;颁发SSL证书。例如https://www.ssl2buy.com/wiki/how-to-get-ssl-certificate-for-web-applications-that-runs-on-localhost
僵局。
好的,让我们退后一步。使用HTTPS / SSL的目的是确保:
用户的网络浏览器正在与正确的服务器通信,而不是模仿它的其他服务器。
浏览器与服务器之间的连接已加密,因此任何第三方都无法窥探流量。
但您正尝试为localhost
连接执行此操作。 localhost
IP地址是环回地址。除非操作系统内核受到损害,否则可以保证通过环回连接发送的网络数据包不会离开主机。
你可以解雇"模仿"问题。假设用户的机器没有受到损害,那么其他任何人都无法启动"假的"用户机器上的服务器。
你可以解雇" snooping"问题。假设用户的机器没有受到损害:
所以,解决方案很简单。使用" http"为你的" localhost"连接。它应该是安全的......假设用户的机器没有受到损害。
注意:如果用户的计算机已被盗用,那么坏人有其他方法可以拦截SSL无法防范的流量。