检测未encryption的SSL密钥

我在Debian机器上安装了OpenVPN服务器。

有没有办法find哪个密钥已经被创build而没有用密码encryption,以取代它们?

对于没有密码的按键,实际的按键通常从第二行开始,对于带有密码的按键,您还可以find三条额外的行。

你可以像wc -l /etc/openvpn/easy-rsa/keys/*.key那样做,而行数less的键没有密码。

删除密钥在OpenVPN中不会做任何事情,用户仍然可以连接他们的证书和密钥。 您需要撤销要阻止连接的用户的证书。

您可以使用openssl rsa命令来确定密钥是否用密码encryption:

 if ! openssl rsa -passin pass:"" -in $keyfile > /dev/null 2>&1; then echo "$keyfile is encrypted." fi 

这将尝试使用空密码解密文件,该文件在未encryption的密钥上工作正常,但否则会失败。 有关-passin选项参数的更多信息,请参见openssl(1)手册页的“PASS PHRASE ARGUMENTS”部分。

OpenVPN使用SSL / TLS的安全性,所以它使用SSL证书和密钥(这就是为什么你的问题实际上与OpenVPN无关)。 OpenVPN使用OpenSSL来处理(几乎)所有的安全问题,它的--key选项(只是在configuration文件中的关键字)期望把密钥保存在所谓的PEM格式中(参见这个概述;格式本身在RFC 1421中定义)。 以PEM格式存储的encryption密钥与未encryption的encryption密钥区分开来,具有一组定义encryption事实和使用encryptionalgorithm的特殊报头字段,这就是一个例子 。

所以,stictly说,你应该处理每个关键文件的脚本,这将试图执行一些最小量的parsing:检测标题行(即------- BEGIN ...东西),然后尝试看看是否存在encryption的迹象。 但是,这可能涉及到一次性的解决scheme,所以我最喜欢@ larsks的答案 – 这是蛮力的,但优雅和简单。 因此,我的答案只是为了让你进入一些背景。


注意这很奇怪,为什么你在服务器上有客户的密钥服务器不需要客户的密钥和证书,他们感兴趣的是访问这些信息:

  • 它自己的证书和匹配的密钥。
  • 颁发服务器证书的CA的证书。
  • 由该CA维护的所谓的证书撤销列表(CRL)。

OpenVPN信任一些客户端,而不是所有客户端的整个想法根源在于它只允许那些提供由服务器信任的CA颁发的有效证书的客户端的事实 – 大多数时候它是发出服务器证书的相同CA好。 但有一些方法可以限制这一点:

  • 撤销客户的证书。
  • configurationOpenVPN的方式是只允许存在具有其特殊的每个客户端configuration文件(所谓的“ccd文件”,其名称与各个客户端证书的主题名称匹配)的客户端。
  • 使openvpn客户端处理脚本检查有关连接客户端的信息,如果检查失败,则连接失败。

因此,不需要在服务器上保留客户端密钥:如果客户端丢失了证书和/或密钥,则CA必须撤销它(更新CRL)并发布另一个密钥。 所以保持客户的公共证书可能是有用的(为了更容易的撤销),但即使这不是必需的。