验证客户证书

时间:2019-01-16 14:25:45

标签: asp.net-core .net-core

在我的项目中,我需要针对每个用户的请求检查并验证客户端证书,然后为他们提供调用我的API的权限。我的用户是机器(其他API或库)。他们将证书附加到他们的请求中,并将其发送到我的托管API。 我实现了自定义身份验证处理程序,并成功检索了客户端证书。现在,我将客户证书与appsetting.json中的有效证书列表(缩略图,颁发者和序列号)进行比较。 如果这三个属性均与客户端证书相同,则返回return Task.FromResult(AuthenticateResult.Success(ticket));,否则返回 return Task.FromResult(AuthenticateResult.Fail("certificate is not valid"));

一切正常,但是我对验证客户证书的方式并不满意。我想知道是否有一种简便的方法来验证客户端证书,而不是在 ASP.NET CORE 中使用我的解决方案。

1 个答案:

答案 0 :(得分:1)

颁发者和序列号可由攻击者控制,因此不适合进行验证。

缩略图是SHA1 of multiple properties of the certificate,包括颁发者,序列号,公共密钥。到目前为止,这可能还可以,并且.NET不能更改它,因为它是Windows的功能,但是指纹仅供参考,而不是安全性。

更好的方法是比较证书的Signature和哈希值,并对SHA256或更高版本的哈希值设置最低的质量。 cert.SignatureAlgorithm.Value;将为您提供该算法作为OID,然后您可以使用它来新建一个System.Security.Cryptography.Oid并使用FriendlyName属性获取文本中的算法,但获取实际签名不是受支持,您必须还原到BouncyCastle之类的第三方。所以可能已经出来了,因为对此依赖是很愚蠢的。

这真的可以归结为您如何注册客户端证书。我要做的就是索取证书(或在某个地方进行注册,例如nuget用于签名证书),将其放入X509Certificate2类中,然后创建RawData属性的SHA256哈希并将其添加到允许列表中。然后对传入的客户端证书执行相同的操作,并将入站证书中的原始数据的SHA256与允许的列表进行比较。当然,现在您必须应对证书过期...