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

时间:2015-01-12 21:35:17

标签: google-chrome authentication ssl google-chrome-extension google-chrome-app

我正在编写需要具有客户端身份验证的SSL套接字的Chrome应用。我以前在Java中使用相同的信任存储和密钥存储区完成了这个。

以下是我在Chrome(Mac和Chromebook)上所做的事情:

  • 将客户端密钥(p12)和CA(一个根CA,一个中间CA)添加到系统。

  • 在Chrome应用中,尝试使用旧版socket API和新的sockets.tcp API。

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

旧版套接字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 个答案:

答案 0 :(得分:2)

Chrome API确实通过tcp.secure支持客户端身份验证,但有一个非常重要的警告 - SSL支持的原始feature request说明了这一点:

  

使用内置TLS堆栈。抱歉,无法在此处添加/管理证书,只需使用现有配置即可。

因此,正如您所建议的那样,您需要手动将证书添加到Chrome。设置中有导入和导出功能 - >显示高级设置 - > HTTPS / SSL - >管理证书。您可能还需要在this bug之前致电tcp.setPaused来解决tcp.secure

但另外,如果您需要比Chrome API提供的更细粒度的控制,您还可以在普通的Chrome TCP套接字API之上添加自己的javascript TLS实现。幸运的是,库forge已经有了一个这样的实现。您可以使用forgechrome.sockets.tcp here一起查看示例。这种方法提供了更细粒度的控制,可以实现证书固定等功能,但不支持,但请注意,forge还不支持TLS 1.2或ECDHE密码套件(尽管这些功能是在{{ 3}})。