使用HTTPS进行客户端与服务器之间的通信

4
我想使用HTTPS来保护客户端和服务器之间的通信。第一次加密通信将用于用户身份验证,即检查他/她的用户名和密码。
在服务器成功检查用户凭证之后,我希望能够在随后的请求中获取一些数据。但是,服务器如何确定后续请求是由已经通过凭证检查的用户发送的呢?
由于TCP连接可能在登录和随后的HTTPS请求之间关闭,这意味着SSL上下文必须被服务器释放,因此需要建立新的TCP连接并进行新的SSL(TLS)握手(即双方必须交换新的共享加密密码等)。
为此,我认为服务器需要在初始身份验证请求的200 OK响应中向客户端发送一些随机生成的nonce(有效时间内),我将在每个随后的请求中包含它,以便服务器可以基于这些随机生成的nonce检测出哪个用户发出了请求,并检查该用户是否已经登录。我的理解正确吗?
非常感谢您的回复。
2个回答

2
最简单的方法是要求所有通信都通过HTTPS进行(因此数据是保密的;除了客户端和服务器之外,没有人能看到它),并在该安全连接内的每个请求上使用简单的用户名和密码。实际上这很容易做到(用户名和密码实际上作为HTTP头传输,这在这里是可以的,因为我们使用HTTPS),服务器可以每次检查用户是否被允许。您不需要担心SSL握手;那是SSL / HTTPS层的责任(这就是为什么HTTPS / SSL 好用)。
或者,登录可以使用任何方法,并生成某种魔数(例如UUID或随机数和用户名称的加密哈希),该魔数存储在会话cookie中。后续请求只需检查魔数是否是从会话开始就认识的(并且自发行以来时间不会太长);注销只是在服务器端忘记魔数(并要求客户端也忘记)。实现这一点需要更多的工作,但仍然不难,而且有服务器端库来处理繁琐的工作。
第一种选项特别适用于编写供其他程序使用的内容,因为它非常容易实现。第二个选项更适合客户端是Web浏览器的情况,因为它使用户对其浏览器何时得到授权有更多的控制(程序API不需要那种东西)。每当客户端将是浏览器时,您都需要小心防范其他类型的攻击(例如各种类型的请求伪造),但这几乎与其他所有内容无关。

嗨,非常感谢您的评论!所有通信都通过HTTPS进行 - 没有例外。我也在考虑同样的问题 - 要么在每个请求中发送用户名/密码,要么让服务器用一些魔法回复第一个请求,然后我将在每个请求中使用它来代替重复的用户名/密码(我的客户端不是浏览器,而是自定义应用程序)。我认为这两种方法或多或少相同,但第二种需要在服务器上完成更多的工作。我可以问一下业界标准是什么吗? HTTPS应用程序是否以在每个请求中重新发送用户名/密码的方式制作?谢谢,敬礼STeN - STeN
@STeN:根据您的实际需求,有几个“行业标准”。我列出了两个非常常见的标准,它们具有不同的常见使用模式。还有其他标准(例如SSL级别的客户端证书),但它们不太常见,您更有可能在获取可移植实现或良好部署方面遇到问题。 - Donal Fellows

0
在您的情况下发明自定义身份验证机制非常危险 - 很容易犯错误,从而让很多错误行为得以实现。因此,我认为正确的方法是使用HTTPS并在每个请求中传递用户凭据。

嗨,我将仅使用HTTPS。但服务器仍然需要知道谁在访问它。通信必须是安全的,但用户也必须进行身份验证才能访问系统。正如下面评论中Donal Fellows先生建议的那样-最简单的方法是在每个请求中包含用户名和密码...感谢您的评论。 - STeN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接