我正在编写需要具有客户端身份验证的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);
});
});
});
我的问题是:
答案 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已经有了一个这样的实现。您可以使用forge
与chrome.sockets.tcp
here一起查看示例。这种方法提供了更细粒度的控制,可以实现证书固定等功能,但不支持,但请注意,forge还不支持TLS 1.2或ECDHE密码套件(尽管这些功能是在{{ 3}})。