zoukankan      html  css  js  c++  java
  • linux ssh公钥免密码登录

    ssh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例。

    一、SSH公钥登录原理

    在平时工作中我们经常要远程登录服务器,这就要用到SSH协议:

    $ ssh user@host

    主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录

    密码口令登录

      通过密码进行登录,主要流程为:

        1、客户端连接上服务器之后,服务器把自己的公钥传给客户端

        2、客户端输入服务器密码通过公钥加密之后传给服务器

        3、服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录

    公钥登录

      公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:

        1、客户端生成RSA公钥和私钥

        2、客户端将自己的公钥存放到服务器

        3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端

        4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器

        5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。

    下面主要说说RSA

      先介绍两个概念:

        对称加密:对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率。对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

        非对称加密:非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。目前最常用的非对称加密算法是RSA算法。虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

      公钥和私钥:

    一个公钥对应一个私钥。
    密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
    如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
    如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。
       RSA算法的作用:
        1、加密:公钥加密私钥解密

            主要用于将数据资料加密不被其他人非法获取,保证数据安全性。使用公钥将数据资料加密,只有私钥可以解密。即使密文在网络上被第三方获取由于没有私钥则无法解密。从而保证数据安全性。     

    A在自己电脑上生成RSA钥匙文件,一个私钥文件一个公钥文件,并将他的公钥传送给B。
    此时B要传送信息给A,于是B用A的公钥加密他的消息,然后传送给A。【网络上传输的密文,没有A的私钥无法解密,其他人获取之后也没用】
    A用他的私钥解密B的消息。
        2、认证:私钥加密公钥解密

            主要用于身份验证,判断某个身份的真实性。使用私钥加密之后,用对应的公钥解密从而验证身份真实性。

              A要验证B是否是真实用户

              1、B将自己公钥给A

    2、B将文件用自己私钥加密传送给A

              3、A根据B的公钥解密,如果成功则为真实身份用户

    SSH公钥登录则用的是第二种功能。

    安全性: 这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。所以我们在用ssh-keygen命令时候要注意密钥长度,具体参数为:

    -b bits
    指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。

    至少不能少于768。一般不用写默认就是2048了。哈哈!

    总结:

     公钥与私钥使用场景:
     (1)私钥用来进行解密和签名,是给自己用的。
     (2)公钥由本人公开,用于加密和验证签名,是给别人用的。
    (3)当该用户发送文件时,用私钥签名,别人用他给的公钥验证签名,可以保证该信息是由他发送的。当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他接收到。

    二、Linux使用ssh公钥实现免密码登录Linux实例

    ssh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例。

    有机器A(192.168.1.155),B(192.168.1.181)。现想A通过ssh免密码登录到B。
    首先以root账户登陆为例。

    查看是否开启了公钥认证和相关认证方式

    在使用公钥认证之前,先检查一下服务器的ssh配置文件/etc/ssh/sshd_config

    RSAAuthentication yes # 启用 RSA 认证,默认为yes
    PubkeyAuthentication yes # 启用公钥认证,默认为yes

    AuthorizedKeysFile      .ssh/authorized_keys # 公钥认证文件,默认为.ssh/authorized_keys

    另外,如果对服务器安全性比较高的情况下,可以设置用户只允许通过公钥认证,禁止用户用密码方式登录,只要修改一下服务器的配置文件/etc/sshd/sshd_config

    PasswordAuthentication no

    修改完后要重启sshd服务。

    这样用户通过密码方式登录时就会提示:
    Permission denied (publickey,gssapi-with-mic)

    有效的提高了系统的安全性。
    注意:
    .ssh 目录的权限必须是0700
    .ssh/authorized_keys 文件权限必须是0600
    否则公钥认证不会生效。


    1.在A机下生成公钥/私钥对。

    [root@A ~]# ssh-keygen -t rsa -P ''

    -P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
    该命令将在/root/.ssh目录下面产生一对密钥id_rsa和id_rsa.pub。

    一般采用的ssh的rsa密钥:
    id_rsa 私钥
    id_rsa.pub 公钥
    下述命令产生不同类型的密钥
    ssh-keygen -t dsa
    ssh-keygen -t rsa
    ssh-keygen -t rsa1

    2.把A机下的/root/.ssh/id_rsa.pub 复制到B机的 /root/.ssh/authorized_keys文件里,先要在B机上创建好 /root/.ssh 这个目录,用scp复制。

    [root@A ~]# scp /root/.ssh/id_rsa.pub root@192.168.1.181:/root/.ssh/authorized_keys
    root@192.168.1.181's password:
    id_rsa.pub 100% 223 0.2KB/s 00:00

    由于还没有免密码登录的,所以要输入一次B机的root密码。

    3.authorized_keys的权限要是600!!!

    [root@B ~]# chmod 600 /root/.ssh/authorized_keys

    4.A机登录B机。

    [root@A ~]# ssh -l root 192.168.1.181
    The authenticity of host '192.168.1.181 (192.168.1.181)' can't be established.
    RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.1.181' (RSA) to the list of known hosts.
    Last login: Thu Jul 3 09:53:18 2008 from root
    [root@B ~]#

    第一次登录是时要你输入yes。

    现在A机可以无密码登录B机了。

    小结:登录的机子可有私钥,被登录的机子要有登录机子的公钥。这个公钥/私钥对一般在私钥宿主机产生。上面是用rsa算法的公钥/私钥对,当然也可以用dsa(对应的文件是id_dsa,id_dsa.pub)

    想让A,B机无密码互登录,那B机以上面同样的方式配置即可。


    SSH-KeyGen 的用法

    假设 A 为客户机器,B为目标机;

    要达到的目的:
    A机器ssh登录B机器无需输入密码;
    加密方式选 rsa|dsa均可以,默认dsa

    做法:
    1、登录A机器
    2、ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
    3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys
    4、大功告成,从A机器登录B机器的目标账户,不再需要密码了;

    ssh-keygen做密码验证可以使在向对方机器上ssh ,scp不用使用密码.
    具体方法如下:
    ssh-keygen -t rsa
    然后全部回车,采用默认值.

    这样生成了一对密钥,存放在用户目录的~/.ssh下。
    将公钥考到对方机器的用户目录下,并拷到~/.ssh/authorized_keys中。

    要保证.ssh和authorized_keys都只有用户自己有写权限。否则验证无效。(今天就是遇到这个问题,找了好久问题所在),其实仔细想想,这样做是为了不会出现系统漏洞。

  • 相关阅读:
    vue中判断APP 为ios系统 安卓系统 浏览器判断 微信 qq 支付宝
    vconsole调试工具使用
    vue 电话号中间四位****代替
    vue中使用倒计时
    在APP中ios输入账号和密码时键盘闪烁
    vue中返回随机数
    vue 阿里云的滑动验证
    从零开发一套完整的vue项目开发环境
    vue中修改第三方组件中的样式
    nginx 启动报错dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  • 原文地址:https://www.cnblogs.com/zqifa/p/ssh-1.html
Copyright © 2011-2022 走看看