在其他应用程序中使用 ssh 密钥进行身份验证?

Making use of ssh keys for authentication in other applications?

假设我想为一个简单的网络服务设置一个穷人的身份验证方案。

我不想打扰 username/password 身份验证,为简单起见,我只想在我的应用程序中有一个 public 密钥列表,以及任何可以证明他们是该密钥所有者的人密钥可以使用我的服务。

就我的应用程序而言,这将大大简化身份验证过程,因为我的所有用户都在本地网络上并且他们都使用 Unix。每当我加入新用户时,我都可以向他们索要他们的 ssh public 密钥。

有没有一种简单的方法可以在非 ssh 应用程序中重用 ssh public 密钥身份验证中涉及的机制?这是一个与语言无关的问题。

假设您正在谈论基于网络的应用程序。您真正需要的是 X.509 客户端证书 (1.3.6.1.5.5.7.3.2)。这将允许您为您的应用程序单独识别用户。

这些面临着与查看密钥分发时通常面临的相同问题。这通常被认为是一个难题。

如果你想走这条路,你需要做的就是这里。

  • 生成根证书(一次)
  • 使用适当的模块设置 Web 服务器以解析证书 (nginx/apache)
  • 为每个用户生成证书 (openssl)
  • 从中央服务器下载证书。 (也许在这里使用他们的 ssh pub 密钥)
  • 在本地安装 x509 证书(OS 从属)

在服务器端,您需要将证书作为 web-server 的一部分进行处理(nginx 或 apache 应该有模块来执行此操作),然后将名称作为 header 字段,然后您可以在内部处理该字段。

这是比用户名和密码更好的安全解决方案,但由于密钥分发问题而变得复杂。大多数人不会费心,因为在大多数应用程序中,很容易将登录与 LDAP 或 radius 集成。

如果您只有一个可以使用您的应用程序的用户列表,而无需查看谁做了什么。

您可以设置您的服务器,使其仅侦听本地主机 (127.1) 而不是 0.0.0.0,并提供受限的 sshd,转发连接到应用程序所需的端口

~/.ssh/authorized_keys 将提供可以使用的授权密钥列表。

 ssh -I private_key_file <hostname> -L 3000:localhost:3000

有关基本设置和配置 sshd 的帮助,请查看此答案: https://askubuntu.com/questions/48129/how-to-create-a-restricted-ssh-user-for-port-forwarding

注意:请注意,如果您不锁定它,任何用户都将对您托管计算机的盒子拥有完全 shell 访问权限。

我头脑中的一个肮脏的黑客:你能包装应用程序,以便它创建一个从本地主机到你的服务器的实际 SSH 隧道,并将其用于?