是的,将证书添加到用户的受信任证书列表中可以解决您的问题。只要您的服务器正确设置为服务器 CORS(根据您接受证书后的成功,看起来确实如此),证书就是您唯一的问题。
HTTPS 提供两个安全优势:
- 您知道您和正在与之交谈的任何人之间的通信通道是安全的(例如,当 Alice 与 Bob 交谈时,她知道没有其他人可以监听)
- 您知道 您正在与谁交谈确实是他们声称的身份(例如,当 Alice 与
bob.com 交谈时,她知道这确实是她所知道的服务器 bob.com 而不是冒名顶替者)
第一个好处是自动的。它由加密协议保证并且不能被剥离(除非对通常很快修复的安全漏洞进行非常复杂的攻击)。
第二个好处并不是严格意义上的技术好处:这是一个信任的问题。服务器使用证书将其公钥(授予第一个安全组件)与自己的身份相关联。这些公钥证书由称为证书颁发机构 (CA) 的用户信任机构签署。
当您尝试连接到bob.com 时,该站点会为您提供一个公钥来执行安全通信。你怀疑并说:“当然,这个公钥可以让我安全地与你交谈,但我怎么知道你是真的bob.com?”然后服务器会给你一个 CA 签名的证书,上面写着:
我们,VeriSign 证书颁发机构,在我们的调查中广受信任,在此证明以下公钥确实属于 bob.com:
公钥:ZGdlZGhydGhyaHJ0eWp5cmo...
经过验证的签名,
威瑞信
当且仅当它们可靠地验证公钥确实属于域名时,许多主要的证书颁发机构(被操作系统和浏览器)广泛信任才能颁发签名证书。由于您的操作系统已经信任这些签名,因此我们无需任何确认即可使用它们。
当您使用自签名证书时,没有受信任的 CA 验证您的证书确实属于您的域名。任何人都可以制作一份说明:
嘿,伙计,这 100% 绝对是 bob.com 的公钥:
公钥:WGdoZmpodHlqa2p1aXl1eWk...
相信我们,写这篇笔记的人,好吗?我们绝对确定这是关键。写这篇笔记的人是运行bob.com 的人。我们承诺。
签名,
写这篇笔记的人
这上面没有受信任的签名。用户必须决定是否愿意接受证书证明公钥确实属于bob.com。
做出有意义的决定是一个困难的过程——您需要检查证书并在某处找到公钥的预先存在的可信记录(或联系站点管理员或服务台代表)。实际上,您需要让您对证书的信任来自某处,因为它不是来自主要证书颁发机构的可信签名。
让 JavaScript 自动做出这种信任决定是没有意义的。重点是用户必须决定证书是否可信,然后对系统的证书存储进行适当的修改。
这可以假设为 Ajax 请求完成,但它不会很漂亮。您需要向用户显示一个浏览器 UI 屏幕,询问用户是否要信任脚本尝试访问的任何域的自签名证书。除了对浏览体验造成极大破坏之外,这可能会造成危险的混乱:如果我在 example.com 上,突然(由于我不知道的脚本的操作)我被要求信任证书对于bob.com,我可能会纯粹基于我对example.com的信任而接受它。
要么将证书添加到您系统的受信任证书列表中,要么让您的系统已经信任的 CA 对其进行签名。