我的计划让我的服务器更难模仿如下:
客户端创建一个随机字符串,String random;
然后将此字符串加密并发送到服务器。然后服务器对其进行解密并将其发回,如果发回的一个与随机相同,则它们连接到正确的服务器(而不是带有diff私钥的假服务器)。
如何使每个客户端拥有公钥并且服务器拥有私钥?不是线索。
编辑 -
因为我不希望客户端必须有公钥的额外文件,我可以允许它们在运行时下载公钥吗?如果我把它放在服务器上并像序列化一样?怎么样?
答案 0 :(得分:1)
在a之间使用公钥和私钥加密是否明智? 客户端服务器模型?
总之一句话?不,至少不是你描述它的方式。
您可以按照描述使其工作,但您将创建安全影院而不是有效的安全性。
因为我不希望客户端必须有额外的文件 公钥,我可以允许他们在运行时下载公钥吗?如果 我把它放在服务器上,就像序列化一样?怎么样?
如果使用CA签名证书(来自内部或外部CA),则可以从目标服务器动态获取证书。您需要存储的唯一内容是Trust Store中的签名者链以及Subject Distinguished Name和Issuer Distinguished Name的可接受值。远程证书不会验证签署者证书是否不在Trust Store中,因此中间的人不能只使用正确的可分辨名称替换任何证书。一旦验证到您的Trust Store,您对可分辨名称的检查将确定您是否拥有正确的证书和服务器。
最后,问题根本没有提到撤销。如果您使用来自商业CA的CA签名证书或至少具有一定健壮性的内部CA,则可以在运行时检查证书吊销列表或使用在线证书状态协议。同样,这些内置于 TLS协议中,在任何JSSE标准提供程序中实现。