检测未加密的 SSL 密钥

检测未加密的 SSL 密钥

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

有没有办法找到哪些未使用密码加密的密钥,从而替换它们?

答案1

对于没有密码的密钥,实际的密钥通常从第二行开始,而对于有密码的密钥,您还可以找到另外三行。

您可以执行类似操作wc -l /etc/openvpn/easy-rsa/keys/*.key,并且行数较少的密钥没有密码。

删除密钥对 OpenVPN 没有任何作用,用户仍然能够使用其证书和密钥进行连接。您需要撤销要阻止连接的用户的证书。

答案2

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

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

这会尝试使用空密码来解密文件,这在未加密的密钥上可以正常工作,但在其他情况下会失败。openssl(1)有关该-passin选项的参数的更多信息,请参阅手册页的“密码短语参数”部分。

答案3

OpenVPN 使用 SSL/TLS 来保证其安全性,因此它使用 SSL 证书和密钥(这就是为什么您的问题实际上与 OpenVPN 无关)。OpenVPN 使用 OpenSSL 来处理(几乎)所有安全问题,其--key选项(仅key在配置文件中)要求密钥以所谓的格式保存PEM(请参阅了解一般概述;格式本身定义在RFC 1421)。以PEM格式存储的加密密钥与未加密密钥的区别在于,加密密钥有一组特殊的标头字段,用于定义加密事实和使用的加密算法——这里是一个例子

因此,严格来说,您应该使用脚本来处理每个密钥文件,该脚本将尝试执行一些最少量的解析:检测标题行(那个------- BEGIN ...东西),然后尝试查看是否存在加密迹象。但这对于一次性解决方案来说可能太复杂了,所以我最喜欢@larsks的答案——它很强大,但足够优雅和简单。因此,我的答案在这里只是为了让你了解一些背景。


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

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

OpenVPN 信任部分客户端,而不是全部客户端,其理念源于这样一个事实:它只允许那些出示有效证书的客户端进入由服务器信任的 CA 颁发— 大多数情况下,颁发服务器证书的 CA 也是同一个。不过,有几种方法可以限制这种情况:

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

因此,无需在服务器上保留客户端密钥:如果客户端丢失了证书和/或密钥,您的 CA 必须撤销该证书(更新 CRL)并颁发另一个证书。因此,保留客户端的公共证书可能很有用(以便于撤销),但即使这样也并非必需。

相关内容