authentication - 客户端证书认证

标签 authentication ssl https ssl-certificate x509

我是 SSL 和证书的新手。我一直在研究客户端证书身份验证。我已阅读thiswiki

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

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

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

最佳答案

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

假设客户端 X 从公共(public) 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 列表有其自身的复杂性)。

关于authentication - 客户端证书认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30954727/

相关文章:

ios - Apple 是否将电子邮件限制为 Facebook 登录中的必填字段?

authentication - 限制特定仪表板中的某些 kibana 用户

ssl - 在 GCE/GKE 上启用 HTTPS

Android Webview 客户端证书、相互身份验证、SSL over Webview

java - ReSTLet HTTP 到 HTTPS(非默认端口)重定向

ssl - 如何在 Cloudfront 中使用 Amazon ACM 证书?

django - 用户没有属性 session -> Django

ajax - OpenId 是否支持 Ajax 登录?

java - 上传到谷歌云存储随机抛出 SunCertPathBuilderException

ssl - 如何在 Go 中建立到 memsql 的基于 ssl 的 tcp 连接