根据预先获得的自签名证书副本对SSL服务器进行身份验证

Medinoc

我正在尝试使用C#客户端和服务器之间进行通信SslStream但是,我的服务器的证书是自签名的。

客户端拥有服务器证书的公共部分的副本,假定该副本是通过防篡改(但不是侦听)通道传输的。

我可以安全地使用它来对服务器进行身份验证吗,并且要这样做,我应该在客户端SslStream或其服务器中放置什么RemoteCertificateValidationCallback到目前为止,由于缺乏信任,我使用验证的所有尝试均以失败告终,而我的回调函数现在所做的只是比较名称和指纹。

如果可以接受,我如何让客户“信任”其公共证书副本以进行验证?

迈克尔·J·格雷

第一个解决方案很简单,但仍然存在漏洞。那只是检查密钥指纹是否匹配。但是,任何中间人都可以建立中间连接并创建自己的密钥交换,然后制作与之匹配的密钥,然后共享加密密钥。

根本问题是您没有适当的基础架构。这并不是您在使用本身的自签名证书,而是在使用来自同一“ CA”的自签名证书。您需要为您的证书颁发机构(您自己)创建一个根证书,然后从该密钥中批准要使用的软件的CSR。这意味着所有远程计算机都需要信任您的根证书,并将其作为证书颁发机构安装在其计算机中。通过这样做,可以避免应用程序使用的证书在中游或类似情况下受到损害的问题。但这仅适用于您可以以保证防篡改的方式将该根CA证书提供给用户的情况。

解决您的问题的另一种方法却更为严格,实际上是放弃SSL或对该证书的有效性进行带外身份验证。客户端可以验证证书,因为服务器能够解密客户端的消息并做出适当的响应。这样的质询响应方案可以用数学/密码学方法证明服务器具有预期的证书,或者至少一方具有对应的私钥:

Client generates a 256 bit random nonce (RNGCryptoServiceProvider), K_C
Server generates a 256 bit random nonce, K_S
Client encrypts K_C with server's assumed public key, now K_B
Server digitally signs K_S, K_A
Server transmits K_A to client
Client transmits K_B to server
Server decrypts K_B, now N_S
Client verifies K_A using server's assumed public key, if invalid disconnect
Client computes K_A XOR K_C, now Z_C
Server computes N_S XOR K_A, now Z_S
Server transmits Z_S to client
Client verifies Z_S matches Z_C
Client transmits Z_C to server, encrypted using the server's public key
Server decrypts Z_C and verifies that it matches Z_S

如果一切都完成了,那么挑战就完成了,您可以保证服务器拥有您拥有的公钥的私钥。您也不能只是通过快捷方式将此快捷方式并将服务器的公共密钥的数字签名副本发送给客户端,因为任何中间人都可以在任一侧创建两个会话。该方案可防止中间人建立两个会话,因为客户端已经拥有了公钥,并通过使用服务器的公钥对他们的现时进行加密直接挑战了有效性。对此的最佳攻击是中间观察者中的一个人,他可以在不利用所使用的非对称算法的弱点的情况下篡改数据。

此方案的另一个好处是,由于您已独立进行身份验证,因此此时您可以完全避免使用SSL。现在,您实际上可以利用Z_S == Z_C自己的优势,并考虑将Z_SZ_C(它们相同)作为您同意的对称密钥进行进一步的通信。

不久前,我就类似的计划写了一篇论文,并在一些地方发表。您可能会以“具有挑战性的身份验证协议协议(CAAP)”的名称找到它,该名称是2007年或2010年修订的,以我的名字命名。有代码示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据预先获得的自签名证书副本对SSL服务器进行身份验证

来自分类Dev

使用自签名证书从Winforms客户端向SSL安全的WCF服务进行身份验证

来自分类Dev

本地主机上的客户端和服务器的自签名证书客户端身份验证

来自分类Dev

根据自签名证书颁发机构验证服务器证书

来自分类Dev

用于具有 Azure 身份验证的私有 Web 服务器的 SSL 证书

来自分类Dev

无法对身份服务器 SSL 握手错误进行身份验证

来自分类Dev

Java-SSL-使用gmail的SMTP服务器进行身份验证

来自分类Dev

Java HTTPS服务器:相互SSL身份验证

来自分类Dev

用于SSL身份验证的自签名证书和客户端密钥库

来自分类Dev

Firebase向后端服务器进行身份验证

来自分类Dev

Firebase向后端服务器进行身份验证

来自分类Dev

服务器不要求密钥进行身份验证

来自分类Dev

进行身份验证时如何在码头服务器中获取客户端证书

来自分类Dev

无论服务器身份验证如何,都对Git存储库进行身份验证

来自分类Dev

无法使用Windows身份验证向SMTP服务器进行身份验证

来自分类Dev

使用Google身份验证在SSH服务器上进行两因素身份验证

来自分类Dev

相互身份验证并将用户证书限制为服务器上的特定证书

来自分类Dev

相互身份验证并将用户证书限制为服务器上的特定证书

来自分类Dev

使用服务帐户进行GCP服务器到服务器的身份验证

来自分类Dev

如何连接Python IMAP4_SSL和自签名服务器SSL证书?

来自分类Dev

Chromecast是否随附允许简单的Web服务器身份验证/验证的证书捆绑包?

来自分类Dev

如何对 Google Drive Api 进行服务器到服务器身份验证?

来自分类Dev

Keycloak服务器身份验证

来自分类Dev

使用QSqlDatabase以“证书”身份验证方法连接到PostgreSQL服务器

来自分类Dev

使用QSqlDatabase以“证书”身份验证方法连接到PostgreSQL服务器

来自分类Dev

在HTTPS上的双向身份验证/双向ssl中,每次调用时客户端证书是否每次都传递给服务器?

来自分类Dev

在身份服务器中使用cookie和令牌进行共享身份验证

来自分类Dev

检查用户是否使用 PHP 在服务器上通过 Firebase 身份验证进行身份验证?

来自分类Dev

在Jetty服务器中,当需要进行客户端身份验证时,如何获取使用的客户端证书?

Related 相关文章

  1. 1

    根据预先获得的自签名证书副本对SSL服务器进行身份验证

  2. 2

    使用自签名证书从Winforms客户端向SSL安全的WCF服务进行身份验证

  3. 3

    本地主机上的客户端和服务器的自签名证书客户端身份验证

  4. 4

    根据自签名证书颁发机构验证服务器证书

  5. 5

    用于具有 Azure 身份验证的私有 Web 服务器的 SSL 证书

  6. 6

    无法对身份服务器 SSL 握手错误进行身份验证

  7. 7

    Java-SSL-使用gmail的SMTP服务器进行身份验证

  8. 8

    Java HTTPS服务器:相互SSL身份验证

  9. 9

    用于SSL身份验证的自签名证书和客户端密钥库

  10. 10

    Firebase向后端服务器进行身份验证

  11. 11

    Firebase向后端服务器进行身份验证

  12. 12

    服务器不要求密钥进行身份验证

  13. 13

    进行身份验证时如何在码头服务器中获取客户端证书

  14. 14

    无论服务器身份验证如何,都对Git存储库进行身份验证

  15. 15

    无法使用Windows身份验证向SMTP服务器进行身份验证

  16. 16

    使用Google身份验证在SSH服务器上进行两因素身份验证

  17. 17

    相互身份验证并将用户证书限制为服务器上的特定证书

  18. 18

    相互身份验证并将用户证书限制为服务器上的特定证书

  19. 19

    使用服务帐户进行GCP服务器到服务器的身份验证

  20. 20

    如何连接Python IMAP4_SSL和自签名服务器SSL证书?

  21. 21

    Chromecast是否随附允许简单的Web服务器身份验证/验证的证书捆绑包?

  22. 22

    如何对 Google Drive Api 进行服务器到服务器身份验证?

  23. 23

    Keycloak服务器身份验证

  24. 24

    使用QSqlDatabase以“证书”身份验证方法连接到PostgreSQL服务器

  25. 25

    使用QSqlDatabase以“证书”身份验证方法连接到PostgreSQL服务器

  26. 26

    在HTTPS上的双向身份验证/双向ssl中,每次调用时客户端证书是否每次都传递给服务器?

  27. 27

    在身份服务器中使用cookie和令牌进行共享身份验证

  28. 28

    检查用户是否使用 PHP 在服务器上通过 Firebase 身份验证进行身份验证?

  29. 29

    在Jetty服务器中,当需要进行客户端身份验证时,如何获取使用的客户端证书?

热门标签

归档