我正在编写一个 Chrome 应用程序,它需要一个带有客户端身份验证的 SSL 套接字。我以前在 Java 中使用同一组信任库和 keystore 完成过此操作。
这是我在 Chrome(Mac 和 Chromebook)上所做的:
将客户端 key (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);
});
});
});
我的问题是:
- Chrome API 是否支持使用证书进行客户端身份验证?
- 如果支持,我该如何向 chrome 提供证书?
最佳答案
Chrome API 确实支持通过 tcp.secure
进行客户端身份验证,但有一个非常重要的警告 - 用于 SSL 支持的原始 feature request 是这样说的:
Using the built-in TLS stack. Sorry, no ability to add/manage certs here, just use the existing configuration.
因此,正如您所建议的,您需要手动将证书添加到 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 密码套件(尽管这些功能计划在 roadmap 上) .
关于google-chrome - 在 Chrome 应用程序中使用证书进行 SSL 客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911137/