SSH学习笔记

ssh学习笔记

一、主要学习资料

二、说明

这不是开发框架,是那个ssh协议,用来远程加密登录的,也能传输数据。ssh协议可以有多种实现,OpenSSH是一个开源实现。Windows环境下用SSH要用到PuTTY。

阮大哥已经讲了怎么用了,我只是抄几段,把东西放在一起整理整理思路,也有助于查缺补漏,找到自己还不清楚的地方。是的,我是抄的,我是抄的,我是抄的。

对于上面的数字签名和证书,争议颇大。不要相信任何人写的东西,也不要让任何人相信自己写的东西,都是参考,目的达到就好。各家的说法不一,都了解后,找出共同的或能解释所有说法的那个理论,就可以暂且认为这个理论是公理。成一家之言吧。

三、关键点

(一)密码学基础

  1. 加密方法可以分为两大类:
    • 对称加密(单钥加密):加密和解密都用同一个密钥
    • 非对称加密(双钥加密):加密和解密用不同的密钥
  2. 双钥加密
    • 一些名词的定义(参见资料4):
      • 私钥:大数N与某整数d
      • 公钥:大数N与某整数e
      • 私钥文件:质数p、质数q与某整数d
      • 公钥文件:大数N与某整数e
      • 常见参数密钥:使用了某个提前选定的整数e的密钥,其中e通常为65537
      • 事实私钥:事实上保密的那一半密钥
      • 事实公钥:事实上公开的那一半密钥
    • 公钥与私钥是对等的,并且可以互换;私钥文件和公钥文件不是对等的,不能互换。私钥文件中含有额外的参数,可以计算得到公钥;但公钥文件中没有,所以不能计算出私钥。
    • 公钥与私钥是一一对应的关系,有一把公钥必然有一把与之对应的、独一无二的私钥与之对应,反之亦成立。
    • 所有的(公钥,私钥)对都是不同的。
    • 只能用公钥解开私钥加密的信息,也只能用私钥解开公钥加密的信息(详细参见RSA算法)。
    • 通常为了兼容性和计算方便,我们使用常见参数密钥,即事实公钥中的密文e为一特定值,通常为65537。这样使得使用了常见参数的事实公钥无法作为事实私钥使用,因为密文e不是安全的。(P.S. 結城有紀大哥说的这话我没弄懂)

  3. 目前的通用单钥加密算法为DES(Data Encryption Standard),通用的双钥加密算法为RSA(Rivest-Shamir-Adleman),都产生于上个世纪70年代
  4. 在双钥体系中,私钥用来数字签名(以供验证数据完整性),公钥用来加密信息(用于验证发送者)。具体做法是:
    • 签名:发件人用其私钥加密摘要,收件人用发件人的公钥解密,可以验证发件人的身份并检查数据完整性,但不能保证信息的内容不被别人看到。
    • 加密:发件人用收件人的公钥加密,这样只有收件人能解密,得到明文,其它人截获了也不能得到明文。
    • 为了安全性考虑,签名、加密及验证一般用的不是同一对密钥。
  5. 因为任何人都可以生成自己的(公钥,私钥)对,所以为了防止有人散布伪造的公钥骗取信任,就需要一个可靠的第三方机构来生成经过认证的(公钥,私钥)对。目前,世界上最主要的数字服务认证商是位于美国加州的Versign公司,它的主要业务就是分发RSA数字证书。https协议是这样,不过SSH没有这样的公司,大家都是自己签发的。

(二)数字证书与签名

从过程中理解:

  1. Bob有两把钥匙,一个是公钥,一个是私钥。他把公钥给了自己的朋友Alice,私钥只有他自己持有。
  2. Alice想给Bob发一条消息,于是她就用Bob的公钥把自己发的邮件加密,然后发送给Bob。
  3. Bob收到了消息,他用自己的私钥解密,得到了Alice发给他的邮件明文
  4. Bob需要回复Alice,于是他写完了回复邮件,并且用一个hash()生成了邮件内容的摘要(Digest,一个哈希值,可以反映文章的内容,用于验证文章没有被别人修改),并且把这个摘要用他的私钥加密,这就是签名(Signature)。他把签名附在文章下面一起发给了Alice。
  5. Alice收到回复后,把签名取出来,用Bob的公钥解密,得到一个哈希值(这里有争议,有人说如果公钥不对会报错,有人说不会,我回头试一下用不对的公钥解密会出现什么情况)。原文说,如果解密成功,则证明是Bob发的。
  6. Alice自己算一遍文章的摘要,如果和上面的摘要一致,则证明文章没有被其他人改过。
  7. 为什么要有证书中心(certificate authority,简称CA)和数字证书(Digital certificate)?因为Alice不知道自己持有的公钥是不是正确的Bob的公钥,如果是别人的就麻烦了。所以请一个有威望的公司(证书中心)给每一对公私钥注册,具体就是把一个人的公钥和其个人信息还有一些其他的相关信息,用公司的私钥加密,得到的就是数字证书。只要Bob发邮件时,将数字证书连带着数字签名和文章一起发过去,Alice用证书中心的公钥对收到的数字证书进行解密,就能得到Bob正确的公钥了。

(三)SSH原理与运用

原文后面还有参考文献,发现了一个公司,O'REILLY,卖技术书的,也不知道为什么就能直接看书,这是那页书的链接:SSH, The Secure Shell: The Definitive Guide

(1)SSH远程登录的原理

分三步,其实就是公钥加密的原理:

  1. 用户用远程主机的公钥加密自己的用户名密码,发送
  2. 远程主机用自己的私钥解密,得到用户名密码
  3. 验证成功,登录,建立连接

此外,这种登录方式每次都要输密码,非常麻烦,所以有了公钥登录,这是免密的。其实就是双钥验证的过程:

  1. 密码登录后,用户将自己的公钥放在远程主机上
  2. 远程主机将一个随机字符串发送给用户
  3. 用户用自己的私钥加密这个随机字符串,发送给远程主机
  4. 远程主机拿用户的公钥解密,得到随机字符串,如果与自己生成的那个原始随机字符串一致,用户的身份就得到确认
(2)Linux下SSH的远程操作
远程登录的基本方法

要作为user(用户名)远程登录一台主机(比如是host),命令为:

ssh user@host

如果本地用户名与远程主机的用户名一致,则用户名可以省略不写:

ssh host

默认连接的远程主机的端口是22端口,如果想改的话,可以用-p参数:

ssh -p 2222 user@host
公钥登录的过程
  1. 要求用户有自己的密钥对,如果没有可以创建一个

    ssh-keygen
  2. 把自己的公钥放到远程主机上

    ssh-copy-id user@host
  3. 一般已经可以免密登录了,如果不能,看远程主机的/etc/ssh/sshd_config这个文件,以下几行是否被注释

    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
  4. 重启远程主机的ssh服务

    //ubuntu系统
    $ service ssh restart
    
    //debian系统
    $ /etc/init.d/ssh restart

注:上面第二步里的命令,可以用以下命令代替,下面这条命令体现了ssh-copy-id的执行过程

ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
  • ssh user@host,表示登录远程主机
  • 单引号中的mkdir -p .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令
    • mkdir -p .ssh的作用是,如果用户主目录中的.ssh目录不存在,就创建一个
    • &&,表示如果前面的命令成功运行,就继续运行后面的命令
    • 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub重定向追加到远程文件authorized_keys的末尾
    • cat >> .ssh/authorized_keys是将cat的输出,追加到authorized_keys文件中
  • < ~/.ssh/id_rsa.pub是将公钥文件作为前面命令的输入缓冲区,这是输入重定向,将本地的文件传到远程主机进行操作
远程操作

\(HOME/src/目录下面的所有文件,复制到远程主机的\)HOME/src/目录。‘|’是将前一个命令的正确输出当作后一个命令的正确输入。tar cz是压缩,tar xz是解压,参数‘v’是调整过程可见,输出的是处理后的文件。

cd && tar czv src | ssh user@host 'tar xz'

将远程主机$HOME/src/目录下面的所有文件,复制到用户的当前目录。

ssh user@host 'tar cz src' | tar xzv

查看远程主机是否运行进程httpd。grep是查找指定内容。

ssh user@host 'ps ax | grep [h]ttpd'
绑定本地端口

让SSH创建一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。这里只是绑定本地端口的过程,不知道有没有其它操作才能达到这个目的。

ssh -D 8080 user@host
本地端口转发

host1是本地主机,host2是远程主机,由于一些原因host1和host2不通,但两台主机都可以与host3通信。这样,就可以在host1端通过host3连接到host2

//  本地端口:目标主机:目标端口
//指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)

$ ssh -L 2121:host2:21 host3

//然后本地的2121端口就相当于远程主机的21端口
$ ftp localhost:2121
//利用这一特性,远程登录到host2
$ ssh -L 9001:host2:22 host3

//-p说明登录的端口,只要登录本地的9001端口,就相当于登录了远程主机host2
$ ssh -p 9001 localhost
远程端口转发

还是上面的例子,只不过这次host3在内网,只能单向访问位于外网的host1。
前提条件是host1和host3两台主机都有sshD和ssh客户端。

//远程端口:目标主机:目标端口
//让host1自己监视自己的2121端口,然后将所有数据经由host3,转发到host2的21端口

$ ssh -R 2121:host2:21 host1

//在host1上运行ftp命令
$ ftp localhost:2121
SSH的其它参数

N参数,表示只连接远程主机,不打开shell;T参数,表示不为这个连接分配TTY。这两个参数可放在一起用,代表这个SSH连接只用来传数据,不执行远程操作

ssh -NT -D 8080 host

f参数,表示SSH连接成功后,转入后台运行。用于在不中断SSH连接的情况下,在本地shell中执行其他操作。要关闭这个后台连接,只能用kill去杀掉进程。

ssh -f -D 8080 host

转载于:https://www.cnblogs.com/RyanZhou/p/11116121.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值