在Chrome应用中使用证书进行SSL客户端身份验证

3
我正在编写一个Chrome应用程序,需要使用SSL套接字进行客户端身份验证。我之前在Java中使用相同的信任库和密钥库完成了这个任务。
以下是我在Chrome(Mac和Chromebook)上的操作:
  • 向系统添加客户端密钥(p12)和CA(一个根CA,一个中间CA)。

  • 在Chrome应用程序中尝试使用传统的socket API和新的sockets.tcp API。

  • 始终收到错误ERR_SSL_CLIENT_AUTH_CERT_NEEDED。但我认为我已经在系统中拥有正确的客户端证书和CA。

传统socket API的代码:
chrome.socket.create('tcp',{},function(createInfo){
    mySocketId = createInfo.socketId;
    chrome.socket.connect(mySocketId,'host', 12345, function(connectResult){
        chrome.socket.secure(mySocketId,{},function(secureResult){
            console.log('secureResult '+secureResult);
        });
    });
});

我的问题是:

  1. Chrome API是否支持证书的客户端验证?
  2. 如果支持,我该如何向Chrome提供证书?
1个回答

2
Chrome API 支持通过 tcp.secure 进行客户端认证,但有一个相当重要的限制 - 关于 SSL 支持的原始功能请求如下所示:

使用内置的 TLS 栈。抱歉,在此无法添加/管理证书,只能使用现有的配置。

因此,正如您所建议的那样,您需要手动向 Chrome 添加证书。在“设置”->“显示高级设置”->“HTTPS/SSL”->“管理证书”中有导入和导出选项。在 tcp.secure 之前调用tcp.setPaused可能还需要解决这个 bug
但是,如果您需要比Chrome API提供的更精细的控制,您也可以在普通的Chrome TCP套接字API之上添加自己的JavaScript TLS实现。幸运的是,库forge已经有了这样的实现。您可以在此处here看到使用 forge 与 chrome.sockets.tcp 结合使用的示例。这种方法提供了更精细的控制,使得像证书固定等不受支持的功能成为可能,但请注意,Forge尚不支持TLS 1.2或ECDHE密码套件(虽然这些功能已计划在roadmap中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接