手动验证 SSL 自签名证书签名 - javascript [重复]

Posted

技术标签:

【中文标题】手动验证 SSL 自签名证书签名 - javascript [重复]【英文标题】:Manually verify SSL Self Signed certificate signature - javascript [duplicate] 【发布时间】:2018-06-18 13:28:31 【问题描述】:

我正在尝试手动验证自签名证书,但过程不清楚。 我使用自己创建的 ca.crt 文件创建了一个自签名证书 server.cert

我将 server.key + server.crt 提供给我的 SSL 服务器。

现在,客户端假设如何验证 server.cert(假设服务器发送它 server.cert)?

据我了解,在创建 server.crt 时,ca 应该使用 ca 的私钥对 Hash(server.cert) 进行加密,而整个事情(包括签名)就是服务器证书。那么我将如何验证证书。我想我需要在客户端使用 ca.cert 吗?因为 ca.cert 还包含 ca.public 密钥,但是我需要对 server.crt 做什么才能说签名是正确的?

【问题讨论】:

【参考方案1】:

服务器需要提供由任何权威机构签署的适当证书。那个权威可能是你自己,没关系。问题是客户端默认不信任“你”。客户端信任其他 CA 证书的原因是它带有一长串已知且受信任的 CA;而“你”不在那个名单上。要进入该列表并获得信任,您需要将 CA 证书添加到本地信任存储中。通常这是由操作系统管理的,如何向其添加证书的详细信息会有所不同,但每个单独的应用程序(例如浏览器)也可能有自己的信任库而不使用操作系统的。

【讨论】:

我明白,但我的简单问题仅仅是:假设我捕获了服务器的证书(在 SSL 握手期间),验证这个证书的过程是什么?我知道证书中有一个加密的哈希(由 CA 生成),我会将它与什么进行比较?我需要以某种方式验证哈希加密,顺便说一句,我在我的“客户端”中“安装”了 CA 证书(不是真的,我是手动做的)。 您想详细了解根据受信任的 CA 证书验证证书的算法是什么......?!你最好阅读规范。对于实际的日常用例,您根本不用担心那种详细程度。如果您需要手动验证证书,您可以使用实现该检查的库(可能是在幕后绑定到 openssl 的东西)并为其提供正确的证书。我仍然不确定您的确切用例是什么,以及您何时“捕获”node.js 中的服务器证书。 如果 server.crt 是自签名证书,客户端仅拥有 CA 证书来验证 server.crt 是否足够?如果是这样,这怎么可能? server.crt 是用 CA 私钥签名的,那么拥有 ca Cert 和它的公钥有什么意义呢?有什么好比较的?我不认为这是需要阅读规范的太多细节,它只是需要了解的 SSL 基础 =) 所以这与自签名证书完全没有关系;当您作为客户所看到的只是公钥,而不是用于签名的私钥时,您只想知道证书验证是如何工作的。 另见security.stackexchange.com/a/116268 和那里的类似帖子。

以上是关于手动验证 SSL 自签名证书签名 - javascript [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java:使用自签名证书的 SSL 客户端身份验证

MAC申请自签名的ssl证书

linux系统自签发免费ssl证书,为nginx生成自签名ssl证书

iOS 和 SSL:无法验证自签名服务器证书

ssl

自签名SSL证书介绍及其缺点