找回密码
 加入我们
搜索
      
查看: 4129|回复: 31

[软件] plink.exe手动连接远程OpenSSH Server时缓存的公钥和私钥存放在哪个位置?

[复制链接]
发表于 2024-6-27 16:36 | 显示全部楼层 |阅读模式
Windows环境下,在用plink.exe手动连接远程OpenSSH Server时,会自动生成一对公钥和私钥证书,以便进行身份验证,现在我想清除它,请问这组公钥和私钥信息被缓存在哪个位置?
发表于 2024-6-27 16:45 | 显示全部楼层
plink什么时候自动生成密钥了?你自己不设置密钥登陆,那就是密码验证啊,如果设置了密钥登陆,密钥放哪你自己不是应该知道。
 楼主| 发表于 2024-6-27 23:11 | 显示全部楼层
腿毛飘飘 发表于 2024-6-27 16:45
plink什么时候自动生成密钥了?你自己不设置密钥登陆,那就是密码验证啊,如果设置了密钥登陆,密钥放哪你 ...
plink.exe -ssh -pw 1234567890 username@hostname
plink.exe -ssh -l username -pw 1234567890 hostname

不是的,当你用以上两种登录远程OpenSSH Server命令行中的任何一种方式建立连接时,如果是与一台陌生的主机首次连接,plink.exe将会返回以下提示信息:

此服务器未缓存主机密钥:
192.168.0.139(端口 22)
您无法保证该服务器就是您认为的那台计算机。
服务器的 ssh-ed25519 密钥指纹为:
ssh-ed25519 255 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
如果您信任此主机,请输入“y”以将密钥添加到 Plink 的
缓存中并继续连接。
如果您只想继续连接一次,而不将
密钥添加到缓存中,请输入“n”。
如果您不信任此主机,请按 Return 放弃
连接。
将密钥存储在缓存中?(y/n,Return 取消连接,i 以获取更多信息)

我应该如何使用 plink 命令进行 SSH 连接.JPG
如果输入y回车,以后再连接时就可以通过用户名和密码正常登录建立连接了
发表于 2024-6-27 23:23 | 显示全部楼层
红色狂想 发表于 2024-6-27 23:11
不是的,当你用以上两种登录远程OpenSSH Server命令行中的任何一种方式建立连接时,如果是与一台陌生的 ...

这个是服务器端生成认证用的吧?谁登录都是一样的
发表于 2024-6-27 23:24 | 显示全部楼层
那是主机的公钥,在服务器上,显示的是公钥的sha-256指纹,用来鉴别是不是你想要连接的主机。

这东西无所谓的,所谓公钥就是要给别人知道的,putty系列都是存在注册表里,Linux存在~/.ssh/know_hosts里。
 楼主| 发表于 2024-6-29 14:59 | 显示全部楼层
腿毛飘飘 发表于 2024-6-27 23:24
那是主机的公钥,在服务器上,显示的是公钥的sha-256指纹,用来鉴别是不是你想要连接的主机。

这东西无所 ...

嗯,公钥相当于一把锁,私钥是钥匙。Windows系统安装了OpenSSH Server后公钥是存放在C:\ProgramData\ssh目录下

捕获ssh_host_ed25519_key.JPG

但是我想利用plink.exe实现自动化批处理脚本连接登录OpenSSH远程主机,而对于首次建立连接时他会弹出SHA256指纹要求交互确认,要么输入y缓存密钥,要么输入n仅连接这一次,否则就无法建立连接,难道必须这样分开设计吗,无法完全自动化?
 楼主| 发表于 2024-6-29 15:07 | 显示全部楼层
goat 发表于 2024-6-27 23:23
这个是服务器端生成认证用的吧?谁登录都是一样的

貌似是的,我主要是想利用plink.exe实现自动化批处理脚本,连接登录OpenSSH远程主机发送命令行,但对于首次建立连接时他会弹出SHA256密钥要求交互确认,要么输入y缓存密钥,要么输入n仅连接这一次,否则就无法建立连接,难道必须这样吗,无法完全自动化?
发表于 2024-6-29 15:14 | 显示全部楼层
红色狂想 发表于 2024-6-29 15:07
貌似是的,我主要是想利用plink.exe实现自动化批处理脚本,连接登录OpenSSH远程主机发送命令行,但对于首 ...

安全机制不是这么跳的
发表于 2024-6-29 15:22 | 显示全部楼层
ssh -o StrictHostKeyChecking=no
希望你知道这意味着什么
发表于 2024-6-29 15:42 | 显示全部楼层
红色狂想 发表于 2024-6-29 15:07
貌似是的,我主要是想利用plink.exe实现自动化批处理脚本,连接登录OpenSSH远程主机发送命令行,但对于首 ...

验证服务器公钥指纹是安全机制,不然别人劫持你dns,伪造主机骗你密码你就不知道了。

发表于 2024-6-29 16:43 | 显示全部楼层
红色狂想 发表于 2024-6-29 15:07
貌似是的,我主要是想利用plink.exe实现自动化批处理脚本,连接登录OpenSSH远程主机发送命令行,但对于首 ...
  1. echo y | plink -ssh root@ip "exit"
复制代码

前面加一行先缓存再执行别的试试。
 楼主| 发表于 2024-6-30 13:21 | 显示全部楼层
goat 发表于 2024-6-29 15:14
安全机制不是这么跳的

我既想安全又想自动化输入y缓存密钥处理连接脚本
 楼主| 发表于 2024-6-30 13:44 | 显示全部楼层
xy. 发表于 2024-6-29 15:22
ssh -o StrictHostKeyChecking=no
希望你知道这意味着什么
ssh -o StrictHostKeyChecking=no 是一个使用 SSH (Secure Shell) 协议的命令行指令,用于连接到远程服务器。这个特定的选项 -o StrictHostKeyChecking=no 修改了 SSH 客户端的默认行为,关于如何处理远程服务器的 SSH 密钥。

这里是这个选项的详细解释:

• ssh: 这是 Secure Shell 的命令行工具,用于加密地登录到远程服务器或执行远程命令。
• -o: 这是一个选项,允许你为 SSH 命令指定一个或多个配置选项。这些选项通常用于覆盖
• SSH 客户端配置文件(如 ~/.ssh/config 或 /etc/ssh/ssh_config)中的默认设置。
StrictHostKeyChecking=no: 这是 -o 选项的参数,它指定了 SSH 客户端如何处理远程服务器的 SSH 密钥。
默认情况下,当你第一次连接到一个新的远程服务器时,SSH 客户端会询问你是否信任该服务器的公钥,并将其添加到你的 known_hosts 文件中(通常位于 ~/.ssh/known_hosts)。之后,当你再次连接到该服务器时,SSH 客户端会检查服务器的公钥是否与 known_hosts 文件中存储的公钥匹配。如果不匹配,SSH 客户端会拒绝连接,以防止中间人攻击(MITM)。

但是,如果你设置了 StrictHostKeyChecking=no,SSH 客户端将不会执行这种检查。这意味着,即使远程服务器的公钥已经更改(可能是由于某种攻击或简单的重新安装),SSH 客户端也会继续连接,而不会发出任何警告。

出于安全考虑,通常不建议在生产环境中使用 StrictHostKeyChecking=no,除非你完全信任你正在连接的网络和服务器。然而,在自动化脚本或某些测试环境中,这个选项可能是有用的,因为它允许你无需用户干预即可自动连接到远程服务器。

看来这种用法也只能在相对安全的家庭封闭网络环境中使用一下了
发表于 2024-6-30 13:50 | 显示全部楼层
一般在linux下,会使用ssh-keyscan先执行一下,就可以把需要的机器指纹信息添加到文件中,之后再操作就不会有提示了。
 楼主| 发表于 2024-6-30 14:02 | 显示全部楼层
腿毛飘飘 发表于 2024-6-29 15:42
验证服务器公钥指纹是安全机制,不然别人劫持你dns,伪造主机骗你密码你就不知道了。

...

是的,验证是必要的安全机制,我是在想有没有办法自动应答输入y缓存密钥再进行连接……
 楼主| 发表于 2024-7-1 16:07 | 显示全部楼层
yyu0378 发表于 2024-6-30 13:50
一般在linux下,会使用ssh-keyscan先执行一下,就可以把需要的机器指纹信息添加到文件中,之后再操作就不会 ...

嗯,我最终想的方案也是类似这样的,专门写个脚本工具,运行后要求用户输入要首次连接的远程主机名,以便进行公钥验证……
发表于 2024-7-1 16:48 来自手机 | 显示全部楼层
红色狂想 发表于 2024-6-29 15:07
貌似是的,我主要是想利用plink.exe实现自动化批处理脚本,连接登录OpenSSH远程主机发送命令行,但对于首 ...

Windows不知道,Linux可以自己写个脚本用expect自动化执行yes,前两天才写过
 楼主| 发表于 2024-7-1 17:31 | 显示全部楼层
港城钢铁侠 发表于 2024-7-1 16:48
Windows不知道,Linux可以自己写个脚本用expect自动化执行yes,前两天才写过

我用的是Windows环境下的PowerShell脚本,貌似不支持expect
发表于 2024-7-1 17:32 来自手机 | 显示全部楼层
红色狂想 发表于 2024-7-1 17:31
我用的是Windows环境下的PowerShell脚本,貌似不支持expect

不行写个python脚本好了,这个肯定能搞定
发表于 2024-7-1 22:21 | 显示全部楼层
红色狂想 发表于 2024-7-1 16:07
嗯,我最终想的方案也是类似这样的,专门写个脚本工具,运行后要求用户输入要首次连接的远程主机名,以便 ...

就使用我说那个命令就可以了,一条命令把结果写入~/.ssh/known_hosts就好,我写脚本基本都是这样。
 楼主| 发表于 2024-7-2 13:48 | 显示全部楼层
yyu0378 发表于 2024-7-1 22:21
就使用我说那个命令就可以了,一条命令把结果写入~/.ssh/known_hosts就好,我写脚本基本都是这样。 ...

有个问题搞不明白,在Windows环境下利用PowerShell脚本调用外部plink.exe连接远程OpenSSH Server,当第一次连接到一个新的远程服务器时,SSH客户端会询问是否信任该服务器的公钥,并将其添加到C:\Users\Administrator\.ssh\known_hosts文件中。但是我查看known_hosts文件内容,里面并没有对应远程主机的公钥信息,可事实上公钥确实已被保存了,因为客户机和服务器关机重启后验证缓存过的公钥仍然有效,这说明相关信息在其他地方存放着,难道Windows系统安全比Linux要求更高,不允许密钥信息以纯文本明文形式保存,他有自己的一套密钥验证管理机制,经过加密保存在系统注册表里了?
发表于 2024-7-3 12:16 | 显示全部楼层
红色狂想 发表于 2024-7-2 13:48
有个问题搞不明白,在Windows环境下利用PowerShell脚本调用外部plink.exe连接远程OpenSSH Server,当第一 ...

1:我已经很久不用windows了,印象putty使用的是注册表,known_hosts是ssh用的
2:我看了帖子,前面已经有人给你说了,这个地方保存是主机的指纹信息,并不是公钥信息,还是应该区分开,不是一类东西
不知道你要用plink是为了干啥,看plink的文档,可以看到有个参数-load是可以直接加载putty中保存的session的,你可以试试
12.jpg
 楼主| 发表于 2024-7-4 22:40 | 显示全部楼层
yyu0378 发表于 2024-7-3 12:16
1:我已经很久不用windows了,印象putty使用的是注册表,known_hosts是ssh用的
2:我看了帖子,前面已经有 ...

你说的对,在注册表键值项路径HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys下,还真搜到了plink.exe缓存的密钥信息,详见下图:

捕获PuTTV-SshHostKeys.JPG

我没安装PuTTY这套软件,就是单独下载了他的plink.exe命令行组件,放在自己开发的PowerShell自动化脚本目录下调用,以实现连接远程OpenSSH Server主机的功能。目前已经实现了plink.exe -ssh -l username -pw 1234567890 hostname用户名和密码方式的登录,但这样做需要在脚本中明文处理登录密码,存在安全问题。听说可以用证书连接验证,这样就不需要密码了,但我对这种密钥登录方式不太了解,具体怎么配置呢,像Windows Server 2016 安装OpenSSH Server,并设置密钥这篇文章中“设置密钥登录”段落说的那样吗,编辑修改C:\ProgramData\ssh目录下的sshd_config配置文件,找到#PubkeyAuthentication yes ,去掉注释启用公钥认证?

捕获sshd_config.JPG
捕获PubkeyAuthentication yes.JPG
捕获administrators_authorized_keys.JPG

但是在OpenSSH Server主机C:\ProgramData\ssh目录下没有这个administrators_authorized_keys文件,怎样把SSH客户端运行plink.exe连接密钥添加到这个文件中呢,可以纯手动复制粘贴吗?
发表于 2024-7-5 11:23 | 显示全部楼层
红色狂想 发表于 2024-7-4 22:40
你说的对,在注册表键值项路径HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys下,还真搜到了 ...

authorized_keys在linux是在~/.ssh/authorized_keys,但windows我就不知道了,文件不存在可以自己创建。
 楼主| 发表于 2024-7-6 15:38 | 显示全部楼层
yyu0378 发表于 2024-7-5 11:23
authorized_keys在linux是在~/.ssh/authorized_keys,但windows我就不知道了,文件不存在可以自己创建。 ...

Key-based authentication in OpenSSH for Windows
OpenSSH for Windows 中基于密钥的身份验证

这里有篇文档,按照上面介绍的方法ssh-keygen -t ed25519成功生成了密钥对,然后用ssh命令将id_ed25519.pub公钥上传到了远程OpenSSH Server主机上,此时在C:\ProgramData\ssh目录下已经有administrators_authorized_keys这个文件了,详见下图:

捕获administrators_authorized_keys.JPG

但是我运行以下PowerShell脚本代码建立SSH连接时,却提示Unable to use key file "C:\ProgramData\ssh\id_ed25519" (OpenSSH SSH-2 private key (new format)),难道SSH2协议不支持高级别Ed25519格式的密钥身份验证吗?

  1. $SCRIPT_PATH = $MyInvocation.MyCommand.Path
  2. $DIR_PATH = Split-Path -Parent $SCRIPT_PATH
  3. $PLINKPATH = Join-Path -Path $DIR_PATH -ChildPath "plink.exe"

  4. $privateKeyPath = "C:\ProgramData\ssh\id_ed25519"
  5. $user_name = "Administrator"
  6. $host_name = "192.168.0.189"
  7. $plinkArgs = "-ssh -i $privateKeyPath -l $user_name $host_name shutdown /s /t 0"
  8. Start-Process -FilePath $PLINKPATH -ArgumentList $plinkArgs
复制代码


总是弹出交互提示让输入密码,我的远程OpenSSH Server主机是Windows 10 Enterprise 2016 LTSB,OpenSSH Client系统是Windows Server 2019 Datacenter

捕获OpenSSH SSH-2 private key (new format)).JPG
发表于 2024-7-6 15:59 | 显示全部楼层
红色狂想 发表于 2024-7-6 15:38
Key-based authentication in OpenSSH for Windows
OpenSSH for Windows 中基于密钥的身份验证

应该是支持ed25519的,可以试试使用rsa证书试试
除了类型外,证书无法使用,还有权限问题,linux下对证书的权限是600
发表于 2024-7-6 21:18 | 显示全部楼层
-batch 可以试试这个plink参数,这个是避免交互的。也许可以绕过
 楼主| 发表于 2024-7-6 22:30 | 显示全部楼层
yyu0378 发表于 2024-7-6 15:59
应该是支持ed25519的,可以试试使用rsa证书试试
除了类型外,证书无法使用,还有权限问题,linux下对证书 ...

看来不是密钥类型的问题,DSA、RSA、ECDSA几种证书都试过了,还是类似的提示 Unable to use key file "C:\Users\Administrator\.ssh\id_ecdsa" (OpenSSH SSH-2 private key (old PEM format)),不同的是,当不使用Ed25519类型时,返回的提示信息是old PEM format

捕获OpenSSH SSH-2 private key (old PEM format).JPG

至于密钥文件的访问权限问题,Windows环境下应该很好处理吧,我一向都使用Administrator管理员账户,以下是系统自动分配的权限,看着也正常啊

捕获密钥文件权限2.JPG
捕获密钥文件权限.JPG
 楼主| 发表于 2024-7-6 22:40 | 显示全部楼层
jop 发表于 2024-7-6 21:18
-batch 可以试试这个plink参数,这个是避免交互的。也许可以绕过

-batch参数我一直都在用,他是实现自动化脚本的关键,但并不是万能的,当命令行涉及安全验证时他就失效了,窗口会一闪而过,什么都不响应,如果你去掉-batch就会看到交互界面在等待输入呢
发表于 2024-7-7 09:05 | 显示全部楼层
红色狂想 发表于 2024-7-6 22:40
-batch参数我一直都在用,他是实现自动化脚本的关键,但并不是万能的,当命令行涉及安全验证时他就失效了 ...

https://github.com/Edgar0119/cygwin-sshpass
也许可以试试这个,之前我在linux上用sshpass挺好用。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-4-29 19:39 , Processed in 0.015141 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表