我正在做一个服务器-客户端使用ssl注册和登录过程。
(and如果重要的话,这是为iPhone准备的)
我刚开始了解什么是ssl以及如何使用它,
看到在该过程中存在可以购买或自签名的证书。
如果我在Web服务器中使用自签名证书,Web浏览器将警告该证书是自签名的,我明白。
但是,如果我在常规的应用程序中使用自签名证书和tcp(而不是http),特别是iPhone,会发生什么呢?
我只是想使注册/登录信息(他们的密码)是安全的,
我希望使用自签名证书可以达到这个目的,但是我还需要确保在Web浏览器以外的应用程序中使用时,不会导致“不信任证书-警报”类型的中断。
- 修改
我知道“不受信任的证书警报”是说客户端不应该信任此服务器。
但在我的情况下,客户端不需要向服务器进行身份验证。
服务器只需要以一种安全的方式获取客户端的密码。
5条答案
按热度按时间bfrts1fy1#
要回答您的问题:你可以,但你不应该!
首先,只使用SSL进行身份验证是不安全的。身份验证过程可能会产生某种会话(例如cookie),然后在没有加密的情况下传输。因此,会话可能会被窃取(请参阅Session hijacking)。
第二,使用自签名证书允许man-in-the-middle attacks。因此,有人可以窃取用户的密码,他可能甚至不会注意到它。用户不知道当客户端收到你的自签名证书时弹出的警报和当攻击者使用自签名证书时弹出的警报之间的区别。
我的建议是:不要使用自签名证书。当攻击发生时,对你和你的客户都不好。
eqzww0vc2#
当您使用SSL联机以密码加密登入对话方块时,服务器会传送一个公开密钥(以凭证的形式)给从属端,从属端会产生一个单次使用的阶段作业密钥,使用服务器的公开密钥加密,然后传送给服务器。服务器接着可以解密阶段作业密钥,因为它有私密密钥。
然后,用户使用会话密钥加密其密码,并将其发送到服务器,服务器可以解密该密码,因为它知道会话密钥。
现在,如果没有PKI,如果攻击者想知道你的密码,他可以欺骗服务器。他会把他的公钥发给你,你会用通常的方式生成一个会话密钥,等等,然后把你的密码发给他,他可以解密,因为你会使用他的密钥,而不知道你是否可以信任它。
PKI通过要求将公钥作为证书分发来保护您免受此类攻击。如果您信任签署证书的CA,则可以判断公钥确实属于服务器,并且使用它来加密您的密码是安全的。如果您不使用证书--或者如果您使用不受信任的证书--您通常不知道要将密码发送给谁。
您没有给予有关您自己的特定使用案例的足够信息,无法确定您是否可以使用自签名证书...例如:这可能是因为你有一个固定的证书,它是由某个可信的渠道提前分发的,当你开始SSL会话时,你可以检查是否使用了正确的证书。如果是这样的话,那么你的客户端已经知道它有正确的公钥,不需要能够检查签名。但是,一般来说,您需要一个由可信CA签名的适当证书,否则您将没有安全性。
uujelgoq3#
这就是可信签名机构的全部意义--任何由其他人签名的东西 * 都应该 * 给予安全警报。所以,不,没有有效的方法来覆盖这一点(除非你对客户端计算机有控制权--例如,当你可以将自己的CA添加到客户端的列表中时,用于公司内部网站的自签名证书),无论是对Web浏览器还是其他任何东西。
使用自签名证书,用户如何知道证书是您的还是攻击者的?
如果您完全控制了进程的两端(服务器和客户端),当然可以指示客户端始终信任“来自尤金的指纹为A01 AABB 546 AC的证书”,但随后您需要构建自己的证书基础结构(过期/吊销)。
dxpyg8gm4#
使用自签名证书不会增加理论上的安全性,因为可能存在中间人。(您的客户端和服务器)将不具有关于谁在讲话或收听的附加信息,而这种加密的要点是确保在通信中只有两个参与者,并且其中至少一个的身份是已知的。
在您的情况下,密码不会安全地传输给您,因为您不知道它是否在传输过程中经过了第三方。同样,用户也不知道他将密码发送给谁。
在实践中,中间人攻击的设置会有一些工作,也许这个障碍是某种安全性,但与强迫用户接受后果不明确的安全警告的烦恼相比,这确实是“错误的安全感”的风险。
有些公司提供免费的证书,但验证的形式最低(他们只会检查你是否“拥有”电子邮件地址hostmaster@domain),这样你也就不必面对警告了。
除非有办法让你把你的证书或它的指纹和应用程序一起打包,正如皮斯克沃所说。
q0qdq0h25#
移动到答案-对于这种类型的事情,你应该是好的。唯一的事情,用户不会得到的是一个方法来确认证书的信任级别(就像你可以做的一个签名的证书在浏览器的例子),但根据你的评论@Piskvor这听起来不像一个问题:你不是用它来做这个的。