020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> LINUX应用 >> Linux教程 >> 正文
    如何使用公钥/私钥登入 Linux 系统?

    点击:   发布日期:2013-01-06

    本文来自 www.020fix.com

    ====[Root篇---开始]=========================================================================
    以下的 config 档,为 FC4 的 /etc/ssh/sshd_config 的内容
    --------------------------------------------------------------------------------------
    代码:
    #       $OpenBSD: sshd_config,v 1.70 2004/12/23 23:11:00 djm Exp $

    # This is the sshd server system-wide configuration file.  See
    # sshd_config(5) for more information.

    # This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin

    # The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented.  Uncommented options change a
    # default value.

    Port 22
    #Protocol 2,1
    #Because Portocol 1 is not safe ,so I don't use, and avoid attack.
    Protocol 2
    #AddressFamily any
    #ListenAddress 0.0.0.0
    #ListenAddress ::

    # HostKey for protocol version 1
    #HostKey /etc/ssh/ssh_host_key
    # HostKeys for protocol version 2
    #HostKey /etc/ssh/ssh_host_rsa_key
    #HostKey /etc/ssh/ssh_host_dsa_key

    # Lifetime and size of ephemeral version 1 server key
    #KeyRegenerationInterval 1h
    #ServerKeyBits 768

    # Logging
    #obsoletes QuietMode and FascistLogging
    #SyslogFacility AUTH
    SyslogFacility AUTHPRIV
    LogLevel INFO

    # Authentication:

    #LoginGraceTime 2m
    PermitRootLogin yes
    #StrictModes yes
    MaxAuthTries 3

    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile      .ssh/authorized_keys

    # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
    #RhostsRSAAuthentication no
    # similar for protocol version 2
    #HostbasedAuthentication no
    # Change to yes if you don't trust ~/.ssh/known_hosts for
    # RhostsRSAAuthentication and HostbasedAuthentication
    #IgnoreUserKnownHosts no
    # Don't read the user's ~/.rhosts and ~/.shosts files
    #IgnoreRhosts yes

    # To disable tunneled clear text passwords, change to no here!
    PasswordAuthentication no
    #PermitEmptyPasswords no

    # Change to no to disable s/key passwords
    #ChallengeResponseAuthentication yes
    ChallengeResponseAuthentication no

    # Kerberos options
    #KerberosAuthentication no
    #KerberosOrLocalPasswd yes
    #KerberosTicketCleanup yes
    #KerberosGetAFSToken no

    # GSSAPI options
    #GSSAPIAuthentication no
    GSSAPIAuthentication yes
    #GSSAPICleanupCredentials yes
    GSSAPICleanupCredentials yes

    # Set this to 'yes' to enable PAM authentication, account processing,
    # and session processing. If this is enabled, PAM authentication will
    # be allowed through the ChallengeResponseAuthentication mechanism.
    # Depending on your PAM configuration, this may bypass the setting of
    # PasswordAuthentication, PermitEmptyPasswords, and
    # "PermitRootLogin without-password". If you just want the PAM account and
    # session checks to run without PAM authentication, then enable this but set
    # ChallengeResponseAuthentication=no
    #UsePAM no
    UsePAM yes

    #AllowTcpForwarding yes
    #GatewayPorts no
    #X11Forwarding no
    X11Forwarding yes
    #X11DisplayOffset 10
    #X11UseLocalhost yes
    #PrintMotd yes
    #PrintLastLog yes
    TCPKeepAlive yes
    #UseLogin no
    #UsePrivilegeSeparation yes
    #PermitUserEnvironment no
    #Compression yes
    #ClientAliveInterval 0
    #ClientAliveCountMax 3
    #UseDNS yes
    #PidFile /var/run/sshd.pid
    #MaxStartups 10
    #ShowPatchLevel no

    # no default banner path
    #Banner /some/path

    # override default of no subsystems
    Subsystem       sftp    /usr/libexec/openssh/sftp-server
    ---------------------------------------------------------------------------------------
    以上内容为 FC4 的 /etc/ssh/sshd_config 的内容,但仅供参考,我不敢保证完全对,
    所以照抄不一定 OK,所以请依您系统的实际状况及週遭的情况去调整。
    =======================================================
    0.事前准备:
    Puttygen.exe → http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe
    Putty.exe → http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe
    Pietty.exe(建议使用,有支援中文输入,SCP 档案上传.)
    → http://ntu.csie.org/~piaip/pietty/stable/pietty0327.exe
    WinSCP3 → http://winscp.net/eng/
    ==============================================
    1.修改 /etc/ssh/sshd_config
    #在 sshd_config 里,找到与下列相符的选项,就将选项前的 # 号拿掉:
    Protocol 2
    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    PermitRootLogin yes
    #找到 ChallengeResponseAuthentication yes 的选项,改成 no ,如下:
    #(选项解释:密码登入选项,一定要改成 no,这样子没有拥有私钥的人就会无法登入了)
    # Change to no to disable s/key passwords
    #修改成 no 来停用 s/key 密码
    #ChallengeResponseAuthentication yes
    ChallengeResponseAuthentication no
    还有把 PasswordAuthentication yes
    改成 PasswordAuthentication no
    #以下为非必要选项
    SyslogFacility AUTHPRIV(或 SyslogFacility AUTH)
    LogLevel INFO

    接下来就存档离开
    重新启动 sshd 服务.
    #service sshd restart

    2.在 Server 端,使用 ssh-keygen 来建立 DSA Private Key 和 Public Key.
    先检查 /root 下有没有 .ssh 的资料夹,如果有就略过建立资料夹的步骤,
    在 /root 下建立资料夹 .ssh,
    #mkdir .ssh
    #cd .ssh
    #ssh-keygen -b 2048 -t rsa
    (#ssh-keygen -b 1024 -t dsa)
    然后,输入 Private Key(私钥)档名:id_dsa,和 Public Key(公钥)档名:id_dsa.pub
    这个时候会问你 key passphrase,
    (可以自由选择输入与否,即使现在不输入也没关係,
    后面再用 puttygen.exe 转换格式时再输入,也是可以的,
    但是不可为了省却输入密码,而只用 KEY 就登入 LINUX 系统,
    此举很危险,万一 Key 档案被有心人士偷取,就糟糕了.>"<)
    再来把公钥的内容导入到 authorized_keys
    #cat id_dsa.pub > authorized_keys

    3.因为 Openssh 的私钥格式和 putty 使用的格式截然不同,
    所以需要由 puttygen.exe 转换格式后才能使用,不然可能会有两种错误的情况:
    --------------------------------------------------------------
    可能出现的几种问题:
    (a)、Server refused our key
    公钥和私钥不匹配,或者没有 authorized_keys 文件
    (b)、Unable to use key file "id_dsa.ppk" (SSH2 private key)
    私钥档案的格式不正确
    --------------------------------------------------------------
    3.1把 server 上的私钥:id_dsa 拷贝到 PC 上
    将 id_dsa 的内容显示在萤幕上,再复制下来.
    #cat id_dsa
    把复制的内容贴到记事本里存成 id_dsa_by_ssh-keygen.ppk
    再来就是开启用 puttygen.exe → Conversions → Import Key
    汇入后,在 Key passphrase 和 Confirm passphrase 输入保护私钥的密码后,
    (不想打密码的人,就保留成空白也可以,不过万一私钥掉了被捡到,那就惨了>"<),
    然后,再从 File → Save Private Key 把私钥另存新档即可使用了。

    4.Pietty/Putty 使用方法:
    启动 Pietty/Putty ,从 SSH → Auth 去指定私钥的档案路径即可。

    5.强烈建议:私钥(Private Key)一定要用 Key Passphrase 来保护,
    密码(至少 8 位数以上,每三个月更换一次公/私钥)千万不要跟 root 的密码一样.
    另外,当你在 Server 上用 ssh-keygen 公/私钥时,会询问公/私钥的档名和
    保护 KEY 用的 Passphrase 的密码,在 Server 有输入的话,在用 puttygen.exe
    做转换时也会叫你输入,所以要小心输入喔!
    ====[Root篇---结束]=========================================================================
    有些人也想说,我也想替我的使用者也提供类似的服务,不要再用密码登入系统,想要用 Key 来登入,但是,
    因为目前密码的服务,可能已经关闭了,怎么办?
    ====[User篇---开始]=========================================================================
    0.修改 sshd 的组态档
    /etc/ssh/sshd_config 要修改一行的内容
    找到 AuthorizedKeysFile .ssh/authorized_keys
    改成 AuthorizedKeysFile %h/.ssh/authorized_keys
    存档离开,并重新启动 sshd 服务
    #service sshd restart


    1.建立 splin 这个使用者帐号,并修改密码.
    #useradd splin
    #passwd splin
    #cd /home/splin/
    #mkdir .ssh
    #cd .ssh
    #ssh-keygen -b 2048 -t dsa
    以下为 ssh-keygen 执行所会发问的问题:
    Generating public/private dsa key pair.

    当你用 root 登入时,执行 ssh-keygen 会出现下列显示的路径
    Enter file in which to save the key (/root/.ssh/id_dsa):
    当你用 splin 登入时,执行 ssh-keygen 会出现下列显示的路径
    Enter file in which to save the key (/home/splin/.ssh/id_dsa):
    所以以上不管出现何种,如果出现的是预设的路径(/home/splin/.ssh/id_dsa)就按 Enter 跳过,
    则不用输入→ /home/splin/.ssh/id_dsa (要含路径和档名),以上跟你用那个 ID 登入系统有关係。

    Enter passphrase (empty for no passphrase):
    输入要保护私钥的密码,这里跟系统的密码不用一样,而且密码千万是不要一样。

    再来接下来和 Root 篇的公钥内容导入至 authorized_keys
    #cat id_dsa.pub > authorized_keys
    但是要确认在 /home/[users]/.ssh/ 路径和档名有没有错误。
    [users]→表示为 user 的帐号名称。


    2把 server 上的私钥:id_dsa 拷贝到 PC 上
    将 id_dsa 的内容显示在萤幕上,再复制下来.
    #cat id_dsa
    把复制的内容贴到记事本里存成 id_dsa_by_ssh-keygen.ppk
    (档名命名方法没有一定,但是为不让自己搞不清楚,这样子做最好)
    再来就是开启用 puttygen.exe → Conversions → Import Key
    (汇入时,因为我们在用 ssh-keygen 产生公/私钥时,就有用密码了,所以在你使用 puttygen.exe,
    做汇入的动作时,自然会要求你输入密码了)
    汇入后,在 Key passphrase 和 Confirm passphrase 输入保护私钥的密码后,
    (不想打密码的人,就保留成空白也可以,不过万一私钥掉了被捡到,那就惨了>"<),
    然后,再从 File → Save Private Key 把私钥另存新档即可使用了。


    3.强烈建议:私钥(Private Key)一定要用 Key Passphrase 来保护,
    密码(至少 8 位数以上,每三个月更换一次公/私钥)千万不要跟 root 的密码一样.


    4.因为我是用 root 来替 splin 这个 user 建立公/私钥,
    所以我要把档案权限和属性稍微修改一下。
    #chown -R splin.splin /home/splin/.ssh/
    #chmod -R 755 /home/splin/.ssh/

    5.Pietty/Putty 使用方法:
    启动 Pietty/Putty ,从 SSH → Auth 去指定私钥的档案路径即可。

    ====[User篇---结束]=========================================================================

    PS.
    1.以上有任何看不懂的,欢迎在此发问,或来信询问皆可。
    2.在您用 putty 测试私钥是否可以使用之前,请先不要把原先的连线直接关闭,
    请先测试用私钥可以登入后,再把停用密码登入的选项设定由 yes 改成 no.