我有Windows服务,可在最终用户的计算机上监听https请求,在这种情况下,是否存在一种接受的创建或分发私钥的方法?我应该打包专门为本地主机请求创建的真实 key (例如local.mydomain.com),还是生成一个自签名 key 并在安装时添加受信任的根CA?
如果有关系,该服务将使用Nancy Self Host处理请求,并在SYSTEM用户上运行。我们有一个运行在https之上的Web应用程序,它将对服务发出CORS请求,用户将在标准Web浏览器(> = IE10)上使用它。只有安装了该服务的计算机才会向其发出请求。
谢谢。
最佳答案
我为您提供2种选择,以正确的方式进行操作,而不是完全不执行操作。
正确的方式
(警告:它花费很多)
假设您的应用程序托管在kosunen.fi
下的云中。主要部分由https://www.kosunen.fi
从云中提供。
购买该域的DNS委派。将localhost-a7b3ff.kosunen.fi
解析为127.0.0.1 / ::1
或实际客户端的本地IP地址10.0.0.63 / fe80::xxxx
购买subCA或获取大量证书购买协议(protocol),为每个localhost-a7b3ff.kosunen.fi
按需颁发证书(较早)或获得颁发的证书(后期)。这些证书将来自受信任的全局CA,因此受所有浏览器的信任。每个证书只能由一台PC使用。
为*.kosunen.fi
设置CORS/XSRF/etc位。
完毕。
不做
意识到localhost流量在实践中是相当安全的。浏览器通常拒绝http://localhost
和http://127.0.0.1
URL(以防止JS加载到Internet来探测本地服务器)。
您仍然至少需要一个DNS条目,即localhost.kosunen.fi
解析为127.0.0.1 / ::1
,即使主机名解析为http://localhost.kosunen.fi
,浏览器也会愉快地接受127.0.0.1
。
有什么风险?
有人在客户端计算机上运行Wireshark-如果有人拥有特权,则无论如何您的模型都已完成。
有人劫持或毒化DNS-对其进行设置,以便www.kosunen.fi
解析为正确的ip,但localhost.kosunen.fi
解析为其互联网ip。他们窃取用户浏览器的请求,并且可以包含JS。
临时缓解-仅提供来自本地主机的数据,而不提供脚本中的数据。设置限制性CORS/XSRF/CSRF。
您仍然可以通过CORS获得HTTP x HTTPS
的解决方案。
超简单的CORS
在4040
和5050
这两个端口之间,这与不同主机(localhost与your.com)或协议(protocol)(HTTPS与HTTP)之间的区别一样。这是云服务器:
import bottle
@bottle.route("/")
def foo():
return """
<html><head></head>
<body><p id="42">Foobar</p>
<script>
fetch("http://localhost:5050/").then(
function(response) {
console.log("status " + response.status);
response.json().then(
function(data) {
console.log(data);
}
);
}
);
</script>
</body></html>""".strip()
bottle.run(host="localhost", port=4040, debug=True)
这是本地主机服务器:
import bottle
@bottle.route("/")
def foo():
bottle.response.headers["Access-Control-Allow-Origin"] = "*" # usafe!
bottle.response.headers["Access-Control-Allow-Methods"] = "HEAD, GET, POST, PUT, OPTIONS"
bottle.response.headers["Access-Control-Allow-Headers"] = "Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token"
return """{"foo": 42}"""
bottle.run(host="localhost", port=5050, debug=True)
将其设为安全(r):在本地服务器中,读取请求
Origin
,对其进行验证,例如starswith("https://your.com/")
,然后返回与请求Allow-Origin
相同的Origin
。 IMO确保兼容的浏览器仅将本地主机内容提供给your.com
上下文中加载的JS。当然,损坏的浏览器或任何在同一计算机上运行的程序都可能会欺骗您的服务器。关于ssl - 如何管理自托管HTTPS的SSL key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34791532/