JWT RS256:通过https获取公钥是否安全?

时间:2016-09-13 13:54:23

标签: security https rsa jwt public-key

我正在使用RS256算法签署JWT。要在客户端验证这些令牌,我需要访问公钥。

当我设置一个不受保护的API路由('/ api / certificate')来返回包含公钥的证书时,是否存在安全问题(欺骗,...)。我是否需要进行任何额外的安全措施?

1 个答案:

答案 0 :(得分:4)

有几个概念经常混淆,也许不适合你,但让我试着解释一下这个答案中的一些事情。

不对称加密显然需要公钥和私钥,两者基本上只是数字。私钥是保密的,公众是公共的,任何人都可以拥有它。签名时,您使用私钥进行签名,然后任何人都可以使用公钥验证签名是由拥有相应私钥的人(即您)制作的。

但问题是如何分发您的公钥,或者在您的jwt示例中,如何分发您的公钥。正如您在问题中正确指出的那样,仅仅通过不安全的渠道下载公钥是不够的,因为攻击者可以用他自己的公钥替换它,导致攻击者能够签署令牌。

对此的一个解决方案可能是如你所提议的那样通过https获取,这实际上意味着使用第二组公共 - 私有密钥对(网络服务器的密钥)来保护发送第一组。理论上的问题仍然是相同的,它只是在后台为您固有解决:浏览器如何知道它在连接时从服务器接收的公钥实际上属于服务器。他们之间还没有安全通道。

输入证书。

证书是一个基本上将公钥与其所有者绑定的文档,这正是您想要的。当浏览器连接到网站时,服务器发送其公钥以及它的证书,以便浏览器可以验证公钥实际上属于发送它的服务器(在这种情况下是域名)。如何验证它超出了本文的范围,重点是证书是由另一个公钥签名的,证书可以由另一个公钥签名等,并且链由一个列表终止您的操作系统/浏览器供应商已经为您的计算机和/或浏览器设置了受信任的根证书。

你也应该用同样的方式验证公钥。你甚至不需要担心SSL(https)传输的负担,验证公钥是否属于特定主题是证书的主要目的。

所以你所要做的就是不只是从API中获取公钥,而是将其与证书一起使用。您可能已经这样做了,很少使用裸公钥。您很可能已经从服务器接收了pfx或cer或crt或其他任何内容。根据您正在开发的技术堆栈,您可以确保使用内置机制来完全验证证书并确保其有效。请不要实施您自己的验证,因为这是一项棘手的业务,很难做到正确。如果证书通过验证,您可以相信您从API收到的公钥是真实的并且属于它声称属于的任何内容。可能有一些警告(例如,确保超出基本验证,您可以检查证书中其他人不能拥有的字段组合。)

作为一项额外的安全措施,您还可以实施证书锁定,通过在客户端中提供有效证书的指纹列表,使其更安全,防止某些类型的攻击(在浏览器客户端,但概念仍然相同)。

编辑(在通过一般的到期验证后,要在证书中检查哪些字段等):

在一般情况下,取决于签署证书的人员以及证书的类型。

由真实证书颁发机构(CA)签名的服务器证书只能将服务器域作为其公用名(CN)字段,真正的CA通常不会签署任何其他内容,并且它们也不会签署证书for yourdomain.com除非你能证明你控制yourdomain.com。因此,在这种情况下,在证书通过验证后检查CN可能就足够了。您确实需要检查CN,因为任何人都可以拥有来自GlobalSign或Thawte或其他可信CA的有效证书,它只需花钱。他们不能拥有的是yourdomain.com的证书。

如果您签署自己的证书,您也不会为任何人签署任何内容,因此在这种情况下,检查发行人(您签署的)和CN(针对谁)就足够了。如果证书以其他方式通过验证(意味着受信任的根证书签名),那么它应该没问题,因为攻击者通常无法将您的CA证书作为您计算机上的受信任证书。

一般来说,你要检查别人不能拥有的东西。如果你依赖真正的CA,它会更容易,通常最好检查指纹。