javascript - 该解决方案可以安全地通过 webSoket 通信在网络上访问用户的私有(private)证书吗?

标签 javascript ssl websocket certificate digital-certificate

我们正在开发一个使用 https 协议(protocol)(双向)的网页。

我们需要访问用户的私有(private)证书,因为我们需要通过用户的证书签署文件,所以我们开发了一个Java应用程序,通过websoket与网络通信。

此应用程序将调用自网络以来的协议(protocol)调用(与从浏览器在 Acrobat Reader 上打开 pdf 时相同)。

因此我们必须确保我们的网络正在调用 native 应用程序(仅我们的网络)。我们希望开发一个系统来确保这一点。我们的想法:

  1. 将公钥、由服务器私有(private)证书签名的 token 和对称 key (用于加密 websocket 通信)发送到 native 应用程序。
  2. 接下来,我们将在 native 应用程序中检查 token 是否适用于服务器的 Web 服务。
  3. 之后,我们需要打开原生应用和网络之间的websocket,并通过这种方式发送原生应用签名的文档。
  4. 然后将文档发送到服务器。

此实现安全吗?夹在中间的人我们会安全吗?

欢迎就此解决方案提出任何建议,因为我没有看到任何弱点,但我不是安全专家。

我知道这个问题的其他解决方案,例如小程序、JavaFX 或 Chrome 上的 native 消息,但我只想知道这些解决方案是否安全。

在此先感谢大家,如果我的英语不是最好的话,我深表歉意:P,

最佳答案

我看到了以下问题

  1. Send a public key and a signed token by the server's private certificate to the native application.

您正在通过协议(protocol)调用本地应用程序。例如 mylocalapp://sign?securitytoken=...。您无法控制在本地 PC 上安装哪个应用程序来响应 mylocalapp://。浏览器显示丑陋的警告,因为您要离开安全环境。攻击者可以替换默认应用程序,模拟流程并获取所有签名文档。

2.Next, we will Check in the native application that the token it is OK with a web service to the server.

要验证服务器的身份并避免 ManInTheMiddel 附加,您还需要使用服务器证书为您的应用程序设置一个信任库

您的服务器还需要验证客户端的身份。您是否也打算以两种方式使用 TLS?

  1. After, we will have to open the websocket between the native app and the web, and send the signed document by the native app by this way.

您不需要网络套接字。只需使用 URL 连接即可下载和上传文档。


当 chrome 决定削减 NPAPI 支持并且签名小程序开始失败时,西类牙经济部使用了此解决方案。现在,他们以这种方式重建了系统

  1. 在用户的 PC 上安装本地 Java 应用程序。应用程序监听端口,例如 5678

  2. 在您的页面中,javascript 以 http://127.0.0.1:5678/sign 的形式连接到应用程序并发送数据进行签名。

  3. 应用程序是本地的,使用操作系统 keystore 没有问题,其中包括驱动程序 PKCS#11。进行数字签名并将结果发送给服务器

  4. 页面的javascript周期性查询结果,准备就绪时取回

安全问题基本相同,但在本地安装服务器比替换本地默认应用程序更难。

这个解决方案叫做@firma,我猜你可能知道。它是开源的,你可以使用它

关于javascript - 该解决方案可以安全地通过 webSoket 通信在网络上访问用户的私有(private)证书吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38657279/

相关文章:

javascript - 使用 cypress 获取数组的索引会返回 "-1"

javascript - Angular Rails 模板无法正常工作

javascript - 点击视频替换图片

java - 如何为 Karate 框架指定 SNI header

javascript - 如何使用 async/await 语法重写此请求?

php - 使用 IE7 IE8 通过 SSL 从 PHP Web 应用程序间歇性下载错误

android - java.security.cert.CertPathValidatorException : Could not validate certificate

tcp - 如何为多个消费者重用服务器端 TCP 端点?

ajax - 断开Grails中的 Atmosphere socket

java - 私有(private)消息 spring websocket