当前位置: 首页 > 知识库问答 >
问题:

客户端证书身份验证

苏乐
2023-03-14

我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。

因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作

  1. 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。
  2. 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证
  3. 在握手期间,客户端会出示其证书并进行身份验证,因为服务器在其信任存储区中有证书副本,并且可以验证证书验证消息

我的问题是,它如何阻止任何人冒充我的客户。假设黑客X将经过认证的CA作为握手的一部分发送给服务器。然后服务器将自动信任它并授予访问权限。

共有2个答案

麹权
2023-03-14

我必须把你的问题分成两部分。

第一部分:< code >假设黑客X发送一个CA证书给服务器作为握手的一部分。那么服务器将自动信任它并授权访问。

如果 X 获取真实客户端的客户端证书,那也没关系。因为证书本身不包含任何机密。这些证书可以在任何地方发布而不会造成任何损害(除非您想对电子邮件地址保密,否则请尽量不要发布它。但它可能会在一段时间后出现。公司制作的X509证书扩展也不被考虑在内。

私钥是重要的密钥,必须由您的客户保密。如果X也获得私钥,X可以强制使用真实的客户端并登录您的系统。因此,客户必须保护这些私钥不被窃取!

这是因为在client-auth握手中,服务器不仅请求客户端证书。客户端还必须通过使用您引用的wiki中所述的私钥来证明他是证书的真正所有者:< code >客户端发送CertificateVerify消息,该消息是使用客户端证书的私钥对之前握手消息的签名。只有当客户端拥有属于证书的私钥时,才能进行这样的签名,正如wiki中所述:< code >这让服务器知道客户端可以访问证书的私钥,因此拥有证书。!

第二部分:如何建立初步的信任关系?

如果涉及到很多客户,这部分就很困难。这就是建立PKI的原因。你信任CA,CA应该对请求证书的客户进行身份检查。

对于自制解决方案,在这种情况下,您有自己的CA,或者您不信任CA,这部分取决于您。你必须确保你的服务只提供给真正的客户。如果你通过USB keys做这个,客户亲自交给你,那没问题。

如果您收到一封电子邮件,上面写着“你好,我是您在ABC的朋友XYZ,还记得吗?顺便说一句。这是我的证书”-检查两次。

卢阳泽
2023-03-14

基于客户端证书的身份验证实际上并不验证客户端连接是否在白名单中。

假设客户端 X 从公共 CA Y 获取证书,并且您在受信任列表中导入 Y 的证书,则来自 X 的连接将成功。

现在,如果入侵者Z从同一个CA Y购买证书(知道应用程序将信任的CA是一个复杂的部分),并尝试与应用程序进行身份验证,验证仍然会成功,因为它是来自受信任CA的有效证书。应用程序将继续向Z提供您不想要的内容。

因此,最好的方法是自签名客户端客户端证书(并将其部署在您信任的客户端上),在这种情况下,您将成为CA,从而限制入侵者获得访问权限。

这里有一些参考,

# Create the CA Key and Certificate for signing Client Certs
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

# Create the Client Key and CSR
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr

# Sign the client certificate with our CA cert.
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt

如果您只想允许几个已知的IP地址,那么基于网络的IP阻止/限制是首选方法(但是,它有自己的管理/更新IP列表的复杂性)。

 类似资料:
  • 授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用

  • 在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于: 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销

  • 如果客户端类型是机密的,客户端和授权服务器建立适合于授权服务器的安全性要求的客户端身份验证方法。授权服务器可以接受符合其安全要求的任何形式的客户端身份验证。 机密客户端通常颁发(或建立)一组客户端凭据用于与授权服务器进行身份验证(例如,密码、公/私钥对)。授权服务器可以与公共客户端建立客户端身份验证方法。然而,授权服务器不能依靠公共客户端身份验证达到识别客户端的目的。 客户端在每次请求中不能使用一

  • 有时需要对某些网络资源(如Servlet、JSP等)进行访问权限验证,也就是说,有访问权限的用户才能访问该网络资源。进行访问权限验证的方法很多,但通过HTTP响应消息头的WWW-Authenticate字段进行访问权限的验证应该是众多权限验证方法中比较简单的一个。 通过HTTP响应消息头的WWW-Authenticate字段可以使浏览器出现一个验证对话框,访问者需要在这个对话框中输入用户名和密码,

  • 问题内容: 我需要导入证书,以便向Spring Boot应用程序中的外部服务发出http请求。 我该如何设置Spring Boot来做到这一点? 那里有很多信息,但我发现所有这些都令人困惑。似乎我可能只需要创建类似“ truststore.jks”密钥库的内容并导入正确的证书,然后将一些条目添加到我的application.properties中即可。 问题答案: 打开您的终端或 回答所有问题。在

  • 整个周末我都在为这个问题苦苦挣扎,现在我跪下来希望你们中的一个天才能解决我的问题。 I short:我有一个ingress nginx控制器(图:nginx/nginx ingress:1.5.8),我正试图与之实现自签名的相互身份验证。 https方面工作正常,但我(我认为)遇到的问题是,入口控制器使用默认证书重新路由请求,入口使用默认CA进行验证(因为它找不到我的CA)。 所以…救命! 我在这