在Apache中不使用SSL的服务器之间发送加密数据


Sending encrypted data between servers without SSL in Apache

我有几个独立的PHP应用程序运行在几台服务器上。这些服务器都没有SSL,但我可以使用PHP包装器实现SSL。我想确保在服务器之间发送的所有数据都是安全的并已签名。我是否需要生成证书,或者每次发送内容时创建公钥/私钥就足够了?这种方法安全吗?

我需要生成一个证书吗?还是创建一个证书就足够了公钥/私钥每次我发送东西?

不要每次都生成公钥/私钥。您如何能够检查谁拥有私钥的控制权?证书的意义在于能够将身份绑定到公钥:检查您信任证书并且您愿意与它所引用的身份通信是确保通信安全的必要组成部分。

据我所知,服务器之间的通信不涉及用户交互本身。如果你控制了所有的服务器,你可以给它们证书,要么是自签名的X.509证书(如果你可以为所有的人安装它们:实际上只适用于少数人),要么是你自己的CA(如果你有OpenSSL,看看CA.pl,它有一个手册页)。

然后您可以使用S/MIME对您交换的内容进行签名和加密(PHP中有可用的函数)。

(您也可以使用PGP实现相同的目标,使用PGP密钥/证书代替)

如果两台机器都有mcrypt,那么你可以在一端用PHP加密你想要通过网络发送的文本,在另一端解密它,当然,你在这里遇到的大问题将是密钥分发。您要么必须用正确的密钥预先配置每台机器,并希望没有人注意到您每次都使用相同的密钥(这很糟糕),要么必须想出某种方法,在发送数据时将密钥分发给接收机器,而不让密钥被窥探。(这很复杂)。

你还提到了签名,这也是一个棘手的问题。

虽然理论上可以在PHP中使用适当的扩展(如mcrypt)实现所有这些,但我真的怀疑这样做是否值得,这将是相当可观的,您也只是在重新发明轮子。

SSL已经实现了您需要的所有东西,并且是公认的行业标准,如果可能的话,我强烈建议您安装它。

在我的一个小项目中,我使用Blowfish加密进行一些数据传输,使用大多数服务器上可用的mcrypt扩展:

$encrypted = mcrypt_encrypt(MCRYPT_BLOWFISH, 'here goes a key', $data, MCRYPT_MODE_ECB, null);

解密也是这样,只是使用mcrypt_decrypt。这是一个共享密钥,而不是公钥/私钥系统。