zoukankan      html  css  js  c++  java
  • Linux的SSH免密登录认证过程研究

    一、先看下SSH免密登录使用到的工具和生成的文件

    工具:ssh-keygen用于生成秘钥文件,其中秘钥分为公钥和私钥、ssh-copy-id用于复制公钥文件到被控制机。

    文件:ssh-keygen生成的秘钥文件有两个,放在~/.ssh/,id_rsa为私钥、id_rsa.pub为公钥

    被控制机文件:通过ssh-copy-id复制的公钥在被控制机这个文件里,~/.ssh/authorized_keys

    id_rsa.pub公钥如下示例:

    ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvSkEZ0fKXRqQ/DkjCfsAETsQgV8OR/RVQmwBk/J5IWoknf8Dr
    y5kOs+1bnx9zaf8oIcVuXf0jRxTccLBOXiReFJE4aD2rWO33sqA0M4qP1ESYhsU4yokRA0IMDJ62JUv2cWVJg
    GpeQriol2t7mH8E6aB8OiJ+NgRbh6+/0LbtQs40VA2+W5PtaBwT4sjv9LOHIdzQcsEeCM8MIHqmXHst7/JuVI
    i7wLCxB7Ur8qtwZ2/Ii8Ckjfo6mikWmSh6mRMq9qn0FkMkPCcpm8o4f1zJWOuf+RnjPpopFTqIa8JssMHJMuQ
    cCm3EHDkBHjLk/SkidWOzqOtSvUeGKieWiijuw== username@localhost.localdomain

    id_rsa私钥如下示例:

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpAIBAAKCAQEA3zh+wHRki5ysBPcrDxL/MGI/vO4aYW6nTgShJKoNny79wkyY
    UhhPukkYtRhAxflmqwSvs1kUmYNRrUN1MEeJHEVdZvkQeyLHf1gCkaw1G5Gi/Ijv
    WcdKZ4SoUJj3bBYjuH93oIInQCeKSJ26DkiK/yyZuU4P82SZej78dVceJQZf/GzD
    uFQYm4CLFDPHq+/Vf/OtedBSvGST/c+gj3O97G9RV+kIfbZJjrR8SKky/vwKUtsv
    5b8bQX6c5ZV8GXiDr3TwExljMW+OE9P6yXiYv5MrF6qrh6GevoZxKVy1xs/GTn1N
    VBxevqK8haEjTIqDhuAyXtb7BRa1UuY2Q9G1gwIDAQABAoIBAG67uO1CECrOAuvH
    rZ2hv+RBqPrRZ1bULLzgQQxOK8m+5vV/R8TZ+Jsh7dbQfDl5unu2LG8dDsIEyfzY
    zQaxRgw3QNl3Try3CR5cC5I2SnYtrhv21j3ERl3KCjFJYNxGs1uwKCkAx/XkZ44U
    aJrzU7i4aF3rorAMRLLHEjgninW0obQhfUKOZCMQBRtWWdzFz+/qfX7aiO/3Iz0W
    bF5A8ygn20C25zBNYQUAzF1L2xnMRvTELsa8v/k+bnVc0E8BnFJ5SwmK7dalL8w4
    b3wvtDTXv1betE/4+fWB8tbkGaqslrhbo0SS8IZNXCYS3kRDC7AcCszP5Alqm4hI
    PTFkHiECgYEA8Tdo4h+Hw7/wR+bJJjexxuD5nHrFtHa+h9UTQFB6MlIChDPGuvfB
    oHlScErIsrLIzIgjpFnnb4nEtc6/IYzyPDma0VTypLij5yuSTk8rPgnwm9qZBXmo
    j0spHW8ti5qdsNzFKnpX8x5RPD8+ROr67aee7LVOOf6mWnwcHShMDnECgYEA7Oa9
    NOn+DUz7rIAr3wuouV5Zc7CC4ij0SNYdKaoH24SrF2QSXbgQIZiV1z/KZyJefyHS
    J+PpcfvRz7BD3RT4Ze7d3Tz1aqtjLkM100b15FDUQKYKUvvUDUgKhskFEos0VSvG
    /WwyAXSqFTqXJqxzUzskTa3sLvaPLtaqTlMcpTMCgYBKHdVrTXbgzdQds6rwxEIq
    sqvfydV/qtDGWdEtfMzfM1W0m1gf0Mq87SpIeKIMTmTme5pAAKPdIL7BgkI2I+G2
    YZjRY0GfHWC3QisVRrwpttIogVVtWkFRri127tdWwu5bDqrCb48gk5swYNpYQL9T
    UKLDZr4fkcA5o1LcHqqn8QKBgQCZ661hdOr5D1yyDrDygavFjPTHwxa3BO77aAqY
    qH3kdgWH9CAuvknU2kP5D9xdOCp3paza+C0UPw5qR9dADMD70cBbX6EBBowxYb/W
    H1PiXVYbDwbENhTn8DfOrUtbahC9ie0HeUXgRkG/+0p7+S4RFOsYgXlkZhRP1W/f
    5gZFmwKBgQDPuKUBsGuOpnaV+8q0wtjbKtHbTLSlAGNnnRDIs/5xBms1onekFpIU
    f3TawKYayf2IN/PLygeoa3PC8Rd6KHCy0Y7A2TD/sxMgNiPaz4L4KoWMcIk+rzuc
    OMIvyyXX2qUTxVagF6aaE65dQ+GGxr4pUS3YJhPizpA6dPp8Apbd4w==
    -----END RSA PRIVATE KEY-----

    二、验证过程

    不是说在某个用户下免密之后,就必须要在特定的用户下进行登录,其实这个不太符合实际;应该说SSH免密登录时会找当前用户下的~/.ssh/目录下的文件进行验证登录,所以不一定要存在文件和指定的用户,只要有内容即可,通常SSH免密登录时指定私钥。

    下面是详细的登录过程:

    在建立连接的时候, 涉及到2对密钥, 其中一对为准备阶段产生并分配好的密钥对, 另一对为服务器在接收到一个连接请求时生成的密钥对. 为了讲述方便, 我们将这两组密钥对表示如下

    SymbolDescription
    PubC 客户端密钥对应的公钥
    PrvC 客户端握有的私钥
    PubS 服务器端产生的公钥
    PrvS 服务器端产生的私钥

    1、认证

    ①服务器生成随机数(称之为challenge) x, 并用 PubC 加密后生成结果 s(x), 发送给客户端.

    ②客户端使用 PrvC 解密 s(x) 得到 x, 再将xPubS加密发送回服务器端.

    ③服务器端使用PrvS解密得到x, 进行核对, 如果正确则链接正式成立.

    2、通信加密

    在请求连接前, 服务器端和客户端拥有的密钥为

    1
    2
    3
    Server          |           Client
    --------------------------------------
    PubC | PrvC

    ①客户端发出申请. 服务器会产生一组 session 密钥对, 即PubSPrvS.

    此时服务器端和客户端拥有的密钥如下所示

    1
    2
    3
    4
    5
    Server           |           Client
    -------------------------------------
    PubC | PrvC
    PubS |
    PrvS |

    ②服务器端利用客户端的公钥PubC对 session 公钥PubS进行加密后发送给客户端.

    ③客户端用自己的密钥PrvC解密信息,得到 session 公钥PubS

    1
    2
    3
    4
    5
    Server           |           Client
    -------------------------------------
    PubC | PubS
    PrvS | PrvC
    PubS |

    ④之后的数据交互,都通过对方方公钥加密,对方收到信息后,用其私钥解密,实现安全加密过程。

    流程如下所示:

     

    三、SSH登录指定私钥

    从上面的原理可以分析出,在通讯时,并不需要控制机使用公钥做什么,而被控制机需要使用到公钥,再就是控制机主要使用到的是私钥,所以SSH可以指定私钥进行远程登录。

    命令如下:-i指定了私钥文件

    ssh -i /root/.ssh/id_rsa root@192.168.1.2

    参考(以上内容部分转自下面文章):

    https://fancyseeker.github.io/2013/12/30/ssh_overview/

    https://www.jianshu.com/p/0f9b72d691c2 

    https://www.jianshu.com/p/2b5ab0e9e8b1

    https://segmentfault.com/a/1190000012484646

    https://www.waitig.com/ssh%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95%E5%AE%9E%E7%8E%B0%E5%8A%9E%E6%B3%95%E5%8F%8A%E5%8E%9F%E7%90%86.html

    https://www.cnblogs.com/scofi/p/6617394.html

    https://blog.csdn.net/qq_26907251/article/details/78804367

  • 相关阅读:
    PostgreSQL几种启动方式测试
    PwoerDesigner 生成数据库时没有中文注释
    Temporary ASP.NET Files没有权限
    Asp.net mvc 存Datetime 取Date
    部署asp.net mvc(Identity)
    01 简单工厂模式
    Asp.net 下拉列表框
    Asp.net 验证码
    底层网络知识详解-最重要的传输层4-套接字socket
    底层网络知识详解-最重要的传输层3-TCP协议下
  • 原文地址:https://www.cnblogs.com/EasonJim/p/10018364.html
Copyright © 2011-2022 走看看