我们正在开发一个使用https协议的网页(双向)。
我们需要访问用户的私人证书,因为我们需要通过用户的证书来签署文档,所以我们开发了一个Java应用程序,通过网络经纪人与网络通信。
此应用程序将从web开始使用协议调用进行调用(与从浏览器在Acrobat Reader上打开pdf时相同)。
因此,我们必须确保我们的web正在调用本机应用程序(只有我们的web)。我们希望开发一个系统来确保这一点。我们的想法:
- 向本机应用程序发送公钥、由服务器的专用证书签名的令牌和对称密钥(用于加密websocket通信)
- 接下来,我们将在本机应用程序中检查服务器的web服务的令牌it是否正常
- 之后,我们将不得不打开本地应用程序和web之间的websocket,并通过这种方式由本地应用程序发送签名文档
- 然后将文档发送到服务器
这种实施安全吗?我们会不会被一个男人夹在中间?
任何关于这个解决方案的建议都会很好,因为我没有看到任何弱点,但我不是安全专家。
我知道这个问题的其他解决方案,比如小程序、JavaFX或Chrome上的本地消息,但我只想知道这些解决方案是否安全。
提前感谢所有人,如果我的英语不是最好的,很抱歉:p,
我看到以下问题
- 通过服务器的专用证书向本机应用程序发送公钥和签名令牌
您正在按协议调用本地应用程序。例如CCD_ 1。您无法控制本地PC上安装的哪个应用程序响应mylocalapp://
。浏览器显示了一个丑陋的警告,因为您正在离开安全的环境。攻击者本可以替换默认应用程序,模拟流并获取所有签名文档。
2.接下来,我们将在本机应用程序中检查到服务器的web服务的令牌it是否正常。
为了验证服务器的身份并避免ManInTheMiddel连接,您还需要使用服务器证书为您的应用程序设置信任库
您的服务器还需要验证客户端的身份。您是否也计划以两种方式使用TLS?
- 之后,我们将不得不打开本地应用程序和web之间的websocket,并通过这种方式由本地应用程序发送签名文档
您不需要网络套接字。只需使用URL连接即可下载和上传文档。
当chrome决定削减对NPAPI的支持,签名小程序开始失败时,西班牙经济部就使用了这个解决方案。现在,他们以这种方式重建了系统
-
在用户的PC上安装本地Java应用程序。该应用程序在端口上侦听,例如5678
-
在您的页面中,javascript连接到表单中的应用程序http://127.0.0.1:5678/sign并发送数据进行签名。
-
该应用程序是本地的,使用包括驱动程序PKCS#11的操作系统密钥库没有问题。执行数字签名并将结果发送到服务器
-
页面的javascript定期查询结果,并在准备好时检索结果
安全问题基本相同,但在localhost中安装服务器比替换本地默认应用程序更难。
这个解决方案叫@firma,我想你可能知道。它是开源的,你可以使用它