通过key登录ssh

时间:2022-06-30 09:25:46

http://fungo.me/linux/ssh-with-key.html

这里介绍下如何通过”公私钥”认证的方式来进行ssh登录. “公私钥”认证方式简单的解释:首先在客户端上创建一对公私钥 (公钥文件:~/.ssh/id_rsa.pub; 私钥文件:~/.ssh/id_rsa)
然后把公钥放到服务器上(~/.ssh/authorized_keys), 自己保留好私钥.在使用ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配.如果匹配成功就可以登录了

在本地产生私钥和公钥
$ ssh-keygen -t rsa
也可以加参数明确指定私钥的名字

1 $ ssh-keygen -t rsa -f ~/.ssh/id_rsa.work


提示输入passphrase时可以不输,这样用生成的key登录时就是通常所说的无密码登录。不过还是建议给一个passphrase,这样即使别人拿到私钥也不能登录。
然后ssh-copy-id命令把生成的公钥追加到远程主机的.ssh/authorized_keys 上

1 $ ssh-copy-id-i ~/.ssh/id_rsa.pub  username@hostip

或者scp, sftp之类的工具把id_rsa.pub传到远程主机上,然后追加到authorized_keys后面

12 $ cd/path/to/uploaded_id_rsa.pub_folder$ cat./d_rsa.pub >> ~/.ssh/authorized_keys

如果远程主机之前没有authorized_keys,要
$ chmod 600 ~/.ssh/authorized_keys
权限不是600会出问题

修改服务端的配置文件sshd_config,添加
PasswordAuthentication no
重启ssh即可

1 /etc/init.d/sshreatart

然后客户端就可以通过key来登录了。。

上面是对客户端为linux的情况,如要是winodws系统,我们一般会用putty这个工具,产生公钥私钥对要用到puttygen这个工具,putty主页上有下载。
点击generate后就开始生成,生成过程中鼠标要在空白区不停的移动。
通过key登录ssh
生成完后就可以保存了,会提示是否要passphrase来保护私钥,推荐写上,如果不写的话就是无密码登录。
通过key登录ssh
putty生成的key格式和linux的OpenSSH所采用的不一样,要转换为OpenSSH格式
通过key登录ssh
然后就可以把公钥上传到服务端了。方法和linux类似,上传完成后就可以能过putty来登录了,在登录前要配置一下,让putty找到生成的私钥。
通过key登录ssh

下面说下linux下多个私钥的情况。
如果我们有多个linux server来管理,又都想key登录,就要配置.ssh/config这个文件了
内容类似这样
参考multiple ssh private keys

01020304050607080910111213 Host *.home.lan   IdentityFile ~/.ssh/id_dsa.home  User kbsingh  Host *.vpn   IdentityFile ~/.ssh/id_rsa.work  User karanbir  Port 44787  Host *.d0.karan.org  IdentityFile ~/.ssh/id_rsa.d0  User admin  Port 21871

如果公钥丢了,我们可以通过私钥来生成
linux下ssh-keygen 加上y参数

1 $ ssh-keygen -t dsa -y > ~/.ssh/id_dsa.pub

windows下可用puttygen来做,比较简单。

解释下Passphrase
Passphrase,即密码短语,是绑定在SSH Key上的一层密码,和服务器的Password是没有关系的,Passphrase的创建,修改和删除都只需用户在客户端软件上完成就可以了。

有人认为通过key这种方式还不够安全,想通过key和服务器的密码两层验证来登录,不过用的服务端不是OpenSSH了,因为OpenSSH不支持同时进行两种验证。可以看下这里让Linux登陆支持SSH Key和Password两级验证

 

 

===========

http://lhflinux.blog.51cto.com/1961662/526122

http://blog.lizhigang.net/archives/249

linux ssh 使用深度解析(key登录详解)

SSH全称Secure SHell,顾名思义就是非常安全的shell的意思,SSH协议是IETF(Internet Engineering Task Force)的Network Working Group所制定的一种协议。SSH的主要目的是用来取代传统的telnet和R系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具,实现对远程登陆和远程执行命令加密。防止由于网络监听而出现的密码泄漏,对系统构成威胁。

ssh协议目前有SSH1和SSH2,SSH2协议兼容SSH1。目前实现SSH1和SSH2协议的主要软件有OpenSSH和SSH Communications Security Corporation 公司的SSH Communications 软件。前者是OpenBSD组织开发的一款免费的SSH软件,后者是商业软件,因此在linux、FreeBSD、OpenBSD、NetBSD等免费类UNIX系统种,通畅都使用OpenSSH作为SSH协议的实现软件。因此,本文重点介绍一下OpenSSH的使用。需要注意的是OpenSSH和SSH Communications的登陆公钥/私钥的格式是不同的,如果想用SSH Communications产生的私钥/公钥对来登入到使用OpenSSH的linux系统需要对公钥/私钥进行格式转换。

在出现SSH之前,系统管理员需要登入远程服务器执行系统管理任务时,都是用telnet来实现的,telnet协议采用明文密码传送,在传送过程中对数据也不加密,很容易被不怀好意的人在网络上监听到密码。同样,在SSH工具出现之前R系列命令也很流行(由于这些命令都以字母r开头,故把这些命令合称为R系列命令R是remote的意思),比如rexec是用来执行远程服务器上的命令的,和telnet的区别是telnet需要先登陆远程服务器再实行相关的命令,而R系列命令可以把登陆和执行命令并登出系统的操作整合在一起。这样就不需要为在远程服务器上执行一个命令而特地登陆服务器了。
SSH是一种加密协议,不仅在登陆过程中对密码进行加密传送,而且对登陆后执行的命令的数据也进行加密,这样即使别人在网络上监听并截获了你的数据包,他也看不到其中的内容。OpenSSH已经是目前大多数linux和BSD操作系统(甚至cygwin)的标准组件,因此关于如何安装OpenSSH本文就不再叙述了,如果不出意外,你的系统上必定已经安装好了OpenSSH。

OpenSSH软件包包含以下命令:

sshd ―― SSH服务端程序

sftp-server ―― SFTP服务端程序(类似FTP但提供数据加密的一种协议)

scp ―― 非交互式sftp-server的客户端,用来向服务器上传/下载文件

sftp ―― 交互式sftp-server客户端,用法和ftp命令一样。

slogin ―― ssh的别名

ssh ―― SSH协议的客户端程序,用来登入远程系统或远程执行命令

ssh-add ――    SSH代理相关程序,用来向SSH代理添加dsa key

ssh-agent ――    ssh代理程序

ssh-keyscan ―― ssh public key 生成器

SSH最常用的使用方式是代替telnet进行远程登陆。不同于telnet的密码登陆,SSH还同时支持Publickey、Keybord Interactive、GSSAPI等多种登入方式,不像telnet那样只有输入系统密码一种途径。目前最常用的登陆方式还是传统的Password方式和Publickey方式登陆。下面以Redhat AS4为例,举例说明这两种登陆方式的用法。

[root@mail ~]# ssh 172.18.6.227
The authenticity of host ’172.18.6.227 (172.18.6.227)’ can’t be established.
RSA key fingerprint is 43:80:f2:e1:9b:b6:6e:c0:e2:dd:57:8f:ed:89:b3:81.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ’172.18.6.227′ (RSA) to the list of known hosts.
root@172.18.6.227‘s password: 
Last login: Thu Jul 12 18:47:47 2007 from 172.18.6.130
[root@qmail ~]#

第一次登陆后,ssh就会把登陆的ssh指纹存放在用户home目录的.ssh目录的know_hosts文件中,如果远程系统重装过系统,ssh指纹已经改变,你需要把 .ssh 目录下的know_hosts中的相应指纹删除,再登陆回答yes,方可登陆。请注意.ssh目录是开头是”.”的隐藏目录,需要ls –a参数才能看到。而且这个目录的权限必须是700,并且用户的home目录也不能给其他用户写权限,否则ssh服务器会拒绝登陆。如果发生不能登陆的问题,请察看服务器上的日志文件/var/log/secure。通常能很快找到不能登陆的原因。

ssh远程执行命令:

[root@mail ~]# ssh 172.18.6.227 ls -l /
root@172.18.6.227‘s password: 
total 1244
drwxr-xr-x    2 root root    4096 Jun 26 04:02 bin
drwxr-xr-x    4 root root    4096 Mar 29 11:17 boot
drwxr-xr-x    2 root root    4096 Jan 25 11:26 command
drwxr-xr-x   15 root root    4096 Jun 12 20:09 data
drwxr-xr-x    9 root root    5360 Jul  2 13:38 dev
drwxr-xr-x   87 root root   12288 Jul 11 04:02 etc
drwxr-xr-x   20 root root    4096 Apr 10 10:54 home
drwxr-xr-x    2 root root    4096 Aug 13  2004 initrd

输入正确的密码后,ssh会链接远程服务器的sshd服务器程序,然后执行远程服务器上的
ls –l /命令 ,并把输入结果传到本地服务器。相当于你先登陆到远程服务器,然后再实行命令ls –l /,最后再登出服务器。需要提醒的是,如果你需要登陆服务器并执行不止一个命令,必须要把命令用单引号或双引号引起来:

ssh 172.18.6.227 “cd /root && ls “

ssh的远程实行命令的功能是用来代替原始的R系列命令的,在ssh出现之前系统管理员们不得不用rexec, rsh等不安全的远程执行命令工具来完成同样的操作。这个功能在管理大批机器的时候是非常有用的,比如我要重启10.0.0.0/24网段内所有的服务器,只要输入一条命令:

for i in $(seq 1 254) ; do  ssh 10.0.0.${i} reboot ; done

就可以完成重启所有服务器的操作,也许你会说,这要虽然不需要再登陆每一台服务器了,但是还是要每次输入密码,多麻烦啊。别急,下面要讲的用ssh public key方式登陆就是要解决问题。

采用public key登录:

openssh的ssh-keygen命令用来产生这样的私钥和公钥。

[root@mail ~]# ssh-keygen -b 1024 -t dsa -C gucuiwen@myserver.com
Generating public/private dsa key pair.
#提示正在生成,如果选择4096长度,可能需要较长时间
Enter file in which to save the key (/root/.ssh/id_dsa): 
#询问把公钥和私钥放在那里,回车用默认位置即可
Enter passphrase (empty for no passphrase): 
#询问输入私钥密语,为了实现自动登陆,应该不要密语,直接回车
Enter same passphrase again: 
#再次提示输入密语,再次直接回车
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
#提示公钥和私钥已经存放在/root/.ssh/目录下
The key fingerprint is:
71:e5:cb:15:d3:8c:05:ed:05:84:85:32:ce:b1:31:ce gucuiwen@myserver.com
#提示key的指纹

说明:
-b 1024 采用长度为1024字节的公钥/私钥对,最长4096字节,一般1024或2048就可以了,太长的话加密解密需要的时间也长。
-t dsa  采用dsa加密方式的公钥/私钥对,除了dsa还有rsa方式,rsa方式最短不能小于768字节长度。
-C gucuiwen@myserver.com 对这个公钥/私钥对的一个注释和说明,一般用所有人的邮件代替。可以省略不写,更多其他参数请man ssh-keygen。

[root@mail ~]# ls -l /root/.ssh
total 16
-rw——-  1 root root 668 Jul 12 20:07 id_dsa
-rw-r–r–  1 root root 611 Jul 12 20:07 id_dsa.pub
-rw-r–r–  1 root root 222 Jul 12 19:37 known_hosts

产生的公钥/私钥文件在用户home目录的.ssh目录下,其中id_dsa.pub是公钥,把产生的公钥上传到需要登陆的服务器的对应用户目录的home目录的.ssh目录下,再一次强调用户自己的目录(home目录)必须不能有其他人可写的权限,.ssh目录的权限必须是700,即除了用户自己,其他人没有任何读写察看该目录的权限,否则ssh服务器会拒绝登陆。ssh默认的公钥文件是用户home目录下的.ssh目录下的authorized_keys文件,因此需要把产生的公钥以这个文件名放到服务器的/root/.ssh/目录下,这个文件中可以存放多个客户端的公钥文件,就好比一个大门上可以上很多锁,可以有不同的钥匙来尝试开锁,只要有一个锁被打开了,门就可以打开了。放到服务器上应该是这样子的:

私钥必须是600权限,否则ssh服务器会拒绝用户登陆。

大致就是这个样子了。现把/etc/ssh/ssh_config 和 /etc/ssh/sshd_config的配置说下。

/etc/ssh/ssh_config:

Host *
选项“Host”只对能够匹配后面字串的计算机有效。“*”表示所有的计算机。

ForwardAgent no
“ForwardAgent”设置连接是否经过验证代理(如果存在)转发给远程计算机。

ForwardX11 no
“ForwardX11”设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。

RhostsAuthentication no
“RhostsAuthentication”设置是否使用基于rhosts的安全验证。

RhostsRSAAuthentication no
“RhostsRSAAuthentication”设置是否使用用RSA算法的基于rhosts的安全验证。

RSAAuthentication yes
“RSAAuthentication”设置是否使用RSA算法进行安全验证。

PasswordAuthentication yes
“PasswordAuthentication”设置是否使用口令验证。

FallBackToRsh no
“FallBackToRsh”设置如果用ssh连接出现错误是否自动使用rsh。

UseRsh no
“UseRsh”设置是否在这台计算机上使用“rlogin/rsh”。

BatchMode no
“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分有用。

CheckHostIP yes
“CheckHostIP”设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为“yes”。

StrictHostKeyChecking no
“StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接。

IdentityFile ~/.ssh/identity
“IdentityFile”设置从哪个文件读取用户的RSA安全验证标识。

Port 22
“Port”设置连接到远程主机的端口。

Cipher blowfish
“Cipher”设置加密用的密码。

EscapeChar ~
“EscapeChar”设置escape字符。

/etc/ssh/sshd_config:

Port 22
“Port”设置sshd监听的端口号。

ListenAddress 192.168.1.1
“ListenAddress”设置sshd服务器绑定的IP地址。

HostKey /etc/ssh/ssh_host_key

“HostKey”设置包含计算机私人密匙的文件。

ServerKeyBits 1024
“ServerKeyBits”定义服务器密匙的位数。

LoginGraceTime 600
“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。

KeyRegenerationInterval 3600
“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。

PermitRootLogin no
“PermitRootLogin”设置root能不能用ssh登录。这个选项一定不要设成“yes”。

IgnoreRhosts yes
“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。

IgnoreUserKnownHosts yes
“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/.ssh/known_hosts”

StrictModes yes
“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。

X11Forwarding no
“X11Forwarding”设置是否允许X11转发。

PrintMotd yes
“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。

SyslogFacility AUTH
“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。

LogLevel INFO
“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。

RhostsAuthentication no
“RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。

RhostsRSAAuthentication no
“RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。

RSAAuthentication yes
“RSAAuthentication”设置是否允许只有RSA安全验证。

PasswordAuthentication yes
“PasswordAuthentication”设置是否允许口令验证。

PermitEmptyPasswords no
“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。

AllowUsers admin
“AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或user@host这样的匹配串,这些字符串用空格隔开。主机名可以是DNS名或IP地址。

将SSH2兼容格式的公钥转换成为Openssh兼容格式

ssh-keygen -i -f Identity.pub >> /root/.ssh/authorized_keys2

 

 

================

http://bbs.chinaunix.net/thread-2028068-1-1.html

http://scottttocs.blog.163.com/blog/static/148583971201132124412721/

ssh/sftp 无需密码登录远端机设置----ssh-keygen  

製作 public keys private keys 利用 ssh-keygen 來做出公用和私有鑰匙,並傳送 public key 到遠端機器使其信任本機登入。
在本地机器:
1.[steven@tsslinux2]$ ssh-keygen -t dsa
generating public/private dsa key pair.
enter file in which to save the key (/home/steven/.ssh/id_dsa):
enter passphrase (empty for no passphrase): - 不用輸入
enter same passphrase again: - 不用輸入
your identification has been saved in /home/steven/.ssh/id_dsa.
your public key has been saved in /home/steven/.ssh/id_dsa.pub.
the key fingerprint is:
fa:c9:a9:e4:d5:70:52:88:cc:f3:25:fd:68:ae:c4:4b
steven@tsslinux2.au.ibm.com
2.接著,再到 /home/steven/.ssh 裡看看,會多出 id_dsa 和 id_dsa.pub 這兩個檔案:
[steven@
tsslinux2]$ cd .ssh
[steven@
tsslinux2]$ ls
id_dsa id_dsa.pub known_hosts
3.复制文件到远端(目标登录)机器
[steven@tsslinux2]$ scp id_dsa.pub  shuai@linscm1:~/.ssh/
在远端机器:

[shuai@linscm1]$cd ~/.ssh
[shuai@linscm1]mv id_dsa.pub authorized_keys
有时候不能work, 则改用

[shuai@linscm1]cat id_dsa.pub >> authorized_keys; rm id_dsa.pub   (我想>>是可以信任多台机器的原因吧)
[shuai@linscm1]chmod 644 authorized_key

完成後離開,回到本機,如此就不用輸入密碼就直接登入了!

 

 ===============

用本地机器用户目录下的私钥去匹配远程机器上对应用户的公钥,可以用sftp -i 指定私钥文件位置

 

==============

http://phoenix007.iteye.com/blog/709455

A机器(ssh连接发起端,即客户端):

 

添加一个测试用户aaa

 

[root@A ~]# useradd aaa

 

suaaa

 

[root@A ~]# su - aaa

[aaa@A ~]$

 

ssh-keygen创建rsa密钥对

 

[aaa@A ~]$ ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/aaa/.ssh/id_rsa):       密钥文件的保存位置

Created directory '/home/aaa/.ssh'.              默认的密钥文件存放目录

Enter passphrase (empty for no passphrase):              密钥文件的保护密码

Enter same passphrase again:

Your identification has been saved in /home/aaa/.ssh/id_rsa.              生成的私钥

Your public key has been saved in /home/aaa/.ssh/id_rsa.pub.    生成的公钥

The key fingerprint is:

81:d7:de:e7:cb:7c:4e:16:d6:76:da:9d:30:25:76:09 aaa@A.test.com

 

[aaa@A ~]$ ll

total 32K

drwx------  3 aaa  aaa  4.0K Sep 17 16:09 .

drwxr-xr-x  4 root root 4.0K Sep 17 16:09 ..

-rw-r--r--  1 aaa  aaa   304 Sep 17 16:09 .bash_logout

-rw-r--r--  1 aaa  aaa   191 Sep 17 16:09 .bash_profile

-rw-r--r--  1 aaa  aaa   124 Sep 17 16:09 .bashrc

-rw-r--r--  1 aaa  aaa   383 Sep 17 16:09 .emacs

drwx------  2 aaa  aaa  4.0K Sep 17 16:09 .ssh              创建出的.ssh目录默认权限为700

 

注意生成的私钥文件的默认权限是rw-------,即600(确保他人不能查看)

 

[aaa@A ~]$ ll .ssh/

total 16K

drwx------  2 aaa aaa 4.0K Sep 17 16:09 .

drwx------  3 aaa aaa 4.0K Sep 17 16:09 ..

-rw-------  1 aaa aaa  951 Sep 17 16:09 id_rsa         私钥文件

-rw-r--r--  1 aaa aaa  231 Sep 17 16:09 id_rsa.pub   公钥文件


B机器(ssh的被连接端,即服务端):

 

添加bbb用户

 

[root@B ~]# useradd bbb

 

subbb

 

[root@B ~]# su - bbb

 

手工在家目录下建立.ssh目录(如果不使用ssh-keygen工具的话)

 

[bbb@B ~]$ mkdir .ssh

 

[bbb@B ~]$ ls -al

total 28

drwx------  3 bbb  bbb  4096 Sep 17 16:52 .

drwxr-xr-x  4 root root 4096 Sep 17 16:52 ..

-rw-r--r--  1 bbb  bbb   304 Sep 17 16:52 .bash_logout

-rw-r--r--  1 bbb  bbb   191 Sep 17 16:52 .bash_profile

-rw-r--r--  1 bbb  bbb   124 Sep 17 16:52 .bashrc

drwxrwxr-x  2 bbb  bbb  4096 Sep 17 16:52 .ssh

 

修改.ssh目录的权限为700(非常重要!)

 

[bbb@B ~]$ chmod 700 .ssh

 

[bbb@B ~]$ ls -al

total 28

drwx------  3 bbb  bbb  4096 Sep 17 16:52 .

drwxr-xr-x  4 root root 4096 Sep 17 16:52 ..

-rw-r--r--  1 bbb  bbb   304 Sep 17 16:52 .bash_logout

-rw-r--r--  1 bbb  bbb   191 Sep 17 16:52 .bash_profile

-rw-r--r--  1 bbb  bbb   124 Sep 17 16:52 .bashrc

drwx------  2 bbb  bbb  4096 Sep 17 16:52 .ssh     确认权限为700

 

.ssh目录里创建authorized_keys文件,并将A机器上aaa用户的公钥(id_rsa.pub)内容写入此文件(关键操作!)

 

[bbb@B ~]$ cd .ssh/

 

[bbb@B .ssh]$ vi authorized_keys

 

粘贴aaaid_rsa.pub内容进来

 

修改authorized_keys的权限为400(非常重要!)

 

[bbb@B .ssh]$ chmod 400 authorized_keys

 

[bbb@B .ssh]$ ls -l authorized_keys

-r--------  1 bbb bbb 231 Sep 17 16:53 authorized_keys    确认权限为400

 

 

 

配置结束。


测试:从A机器上,在aaa用户下,使用bbb帐号登录B机器。

 

 

[aaa@A ~]$ ssh -l bbb xxx.xxx.xxx.xxx

Enter passphrase for key '/home/aaa/.ssh/id_rsa':       会提示输入私钥保护密码(在创建密钥对时输的密码,输入正确后进入系统)

[bbb@B ~]$

 

  

安全的关键点在于如何安全地将id_rsa.pub的内容传递到服务端

 

 

测试完毕,清理系统(删除测试用户帐号及其家目录)

 

 

A机器上,exitroot

 

[root@A ~]# userdel -r aaa

 

B机器上,exitroot

 

[root@B ~]# userdel -r bbb

 

 

http://daren.blog.51cto.com/2974225/882486
http://heikezhi.com/2011/08/26/ssh-productivity-tips/