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

This solution is safe to access to user's private certificate on a web with a webSoket communication?

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

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

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

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

  1. 将 public 密钥、服务器私有证书的签名令牌和对称密钥(用于加密 websocket 通信)发送到本机应用程序。
  2. 接下来,我们将在本机应用程序中检查令牌是否适用于服务器的 Web 服务。
  3. 之后我们还要打开原生app和web之间的websocket,通过这种方式发送原生app签名的文档。
  4. 然后将文档发送到服务器。

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

任何关于此解决方案的建议都将受到欢迎,因为我没有看到任何弱点,但我不是安全专家。

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

在此先感谢大家,如果我的英语不是最好的,请见谅:P,

我看到以下问题

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

您正在通过协议调用本地应用程序。例如 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.

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


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

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

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

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

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

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

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