在我的项目中,我需要针对每个用户的请求检查并验证客户端证书,然后为他们提供调用我的API的权限。我的用户是机器(其他API或库)。他们将证书附加到他们的请求中,并将其发送到我的托管API。
我实现了自定义身份验证处理程序,并成功检索了客户端证书。现在,我将客户证书与appsetting.json
中的有效证书列表(缩略图,颁发者和序列号)进行比较。
如果这三个属性均与客户端证书相同,则返回return Task.FromResult(AuthenticateResult.Success(ticket));
,否则返回
return Task.FromResult(AuthenticateResult.Fail("certificate is not valid"));
一切正常,但是我对验证客户证书的方式并不满意。我想知道是否有一种简便的方法来验证客户端证书,而不是在 ASP.NET CORE 中使用我的解决方案。
答案 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与允许的列表进行比较。当然,现在您必须应对证书过期...