基础
来源
SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。
它主要用于保证远程登录和远程通信的安全,任何网络服务都可以用这个协议来加密。
在明文通信中,登录远程服务器的时候,需要将用户输入的密码传给服务器,线路经过的中间计算机都能看到密码,这是很危险的。
SSH能够加密计算机之间的通信,保证不被窃听或篡改。它还能对操作者进行认证(authentication)和授权(authorization)。明文的网络协议可以套用在它里面,从而实现加密。
不仅在登陆过程中对密码进行加密传送,而且对登陆后执行的命令的数据也进行加密。
OpenSSH
开源的、最流行的SSH实现
Linux 的所有发行版几乎都自带 OpenSSH
架构
- 服务器-客户端模式(Server - Client)
- ssh:OpenSSH实现的客户端
- sshd:OpenSSH实现的服务器
- ssh-keygen 、ssh-agent:辅助工具软件
- scp、sftp:客户端工具
客户端
连接
# 登录主机名为hostname的服务器,hostname可能为IP、域名、自定义名称等
ssh hostname
# 指定用户名
ssh user@hostname
# 用-l单独指定用户名
ssh -l username host
# 默认端口为22,可以指定其它端口
ssh -p 30022 notego.top
# 连接成功后就可以在命令行执行远程命令
# 如果只执行单次命令,不想打开命令行,可以直接将命令加在后面
ssh username@hostname command
参数
# 连接时可以指定很多参数
# -c参数指定加密算法
ssh -c blowfish,3des server.example.com
# 或者
ssh -c blowfish -c 3des server.example.com
# -C参数表示压缩数据传输。
ssh -C server.example.com
# -D参数指定本机的 Socks 监听端口,该端口收到的请求,都将转发到远程的 SSH 主机,又称动态端口转发
ssh -D 1080 server
# 上面命令将本机 1080 端口收到的请求,都转发到服务器server。
# -f参数表示 SSH 连接在后台运行。
# -F参数指定配置文件。
ssh -F /usr/local/ssh/other_config
# -i参数用于指定私钥,意为“identity_file”,默认值为~/.ssh/id_dsa
ssh -i my-key server.example.com
# -L参数设置本地端口转发
ssh -L 9999:targetServer:80 user@remoteserver
# 上面命令中,所有发向本地9999端口的请求,都会经过remoteserver发往 targetServer 的 80 端口,这就相当于直接连上了 targetServer 的 80 端口。
# -m参数指定校验数据完整性的算法(message authentication code,简称 MAC)
ssh -m hmac-sha1,hmac-md5 server.example.com
# -N参数用于端口转发,表示建立的 SSH 只用于端口转发,不能执行远程命令,这样可以提供安全性
# 当command时需要交互的命令时,可以加上-t参数,如
ssh -t server.example.com emacs
# -v参数显示详细连接信息
ssh -v server.example.com
# -V参数输出 ssh 客户端的版本
ssh –V
# -4指定使用 IPv4 协议,这是默认值。
# -6指定使用 IPv6 协议。
ssh -4 server.example.com
ssh -6 server.example.com
配置
SSH 客户端的全局配置文件是/etc/ssh/ssh_config,用户个人的配置文件在~/.ssh/config,优先级高于全局配置文件。
除了配置文件,~/.ssh目录还有一些用户个人的密钥文件和其他文件。下面是其中一些常见的文件。
~/.ssh/id_ecdsa:用户的 ECDSA 私钥。
~/.ssh/id_ecdsa.pub:用户的 ECDSA 公钥。
~/.ssh/id_rsa:用于 SSH 协议版本2 的 RSA 私钥。
~/.ssh/id_rsa.pub:用于SSH 协议版本2 的 RSA 公钥。
~/.ssh/identity:用于 SSH 协议版本1 的 RSA 私钥。
~/.ssh/identity.pub:用于 SSH 协议版本1 的 RSA 公钥。
~/.ssh/known_hosts:包含 SSH 服务器的公钥指纹。
# ~/.ssh/config中保存用户的服务器配置,避免每次都输
# Host *表示对所有主机生效,相当于全局变量,会被局部变量覆盖,*.edu对特定域名生效
# 配置文件的每一行,就是一个配置命令。配置命令与对应的值之间,可以使用空格,也可以使用等号。
Host *
Port 2222
Host *.edu
Port 2233
Host remoteserver
HostName remote.example.com
User wan
Port 30022
# 主要配置命令及常见值
# AddressFamily inet:表示只使用 IPv4 协议。如果设为inet6,表示只使用 IPv6 协议。
# BindAddress 192.168.10.235:指定本机的 IP 地址(如果本机有多个 IP 地址)。
# CheckHostIP yes:检查 SSH 服务器的 IP 地址是否跟公钥数据库吻合。
# Ciphers blowfish,3des:指定加密算法。
# Compression yes:是否压缩传输信号。
# ConnectionAttempts 10:客户端进行连接时,最大的尝试次数。
# ConnectTimeout 60:客户端进行连接时,服务器在指定秒数内没有回复,则中断连接尝试。
# DynamicForward 1080:指定动态转发端口。
# GlobalKnownHostsFile /users/smith/.ssh/my_global_hosts_file:指定全局的公钥数据库文件的位置。
# Host server.example.com:指定连接的域名或 IP 地址,也可以是别名,支持通配符。Host命令后面的所有配置,都是针对该主机的,直到下一个Host命令为止。
# HostKeyAlgorithms ssh-dss,ssh-rsa:指定密钥算法,优先级从高到低排列。
# HostName myserver.example.com:在Host命令使用别名的情况下,HostName指定域名或 IP 地址。
# IdentityFile keyfile:指定私钥文件。
# LocalForward 2001 localhost:143:指定本地端口转发。
# LogLevel QUIET:指定日志详细程度。如果设为QUIET,将不输出大部分的警告和提示。
# MACs hmac-sha1,hmac-md5:指定数据校验算法。
# NumberOfPasswordPrompts 2:密码登录时,用户输错密码的最大尝试次数。
# PasswordAuthentication no:指定是否支持密码登录。不过,这里只是客户端禁止,真正的禁止需要在 SSH 服务器设置。
# Port 2035:指定客户端连接的 SSH 服务器端口。
# PreferredAuthentications publickey,hostbased,password:指定各种登录方法的优先级。
# Protocol 2:支持的 SSH 协议版本,多个版本之间使用逗号分隔。
# PubKeyAuthentication yes:是否支持密钥登录。这里只是客户端设置,还需要在 SSH 服务器进行相应设置。
# RemoteForward 2001 server:143:指定远程端口转发。
# SendEnv COLOR:SSH 客户端向服务器发送的环境变量名,多个环境变量之间使用空格分隔。环境变量的值从客户端当前环境中拷贝。
# ServerAliveCountMax 3:如果没有收到服务器的回应,客户端连续发送多少次keepalive信号,才断开连接。该项默认值为3。
# ServerAliveInterval 300:客户端建立连接后,如果在给定秒数内,没有收到服务器发来的消息,客户端向服务器发送keepalive消息。如果不希望客户端发送,这一项设为0。
# StrictHostKeyChecking yes:yes表示严格检查,服务器公钥为未知或发生变化,则拒绝连接。no表示如果服务器公钥未知,则加入客户端公钥数据库,如果公钥发生变化,不改变客户端公钥数据库,输出一条警告,依然允许连接继续进行。ask(默认值)表示询问用户是否继续进行。
# TCPKeepAlive yes:客户端是否定期向服务器发送keepalive信息。
# User userName:指定远程登录的账户名。
# UserKnownHostsFile /users/smith/.ssh/my_local_hosts_file:指定当前用户的known_hosts文件(服务器公钥指纹列表)的位置。
# VerifyHostKeyDNS yes:是否通过检查 SSH 服务器的 DNS 记录,确认公钥指纹是否与known_hosts文件保存的一致。
# ssh 会将本机连接过的所有服务器公钥的指纹,都储存在本机的~/.ssh/known_hosts文件中。
# 每次连接服务器时,通过该文件判断是否为陌生主机(陌生公钥)
# 首次连接某一台服务器,命令行会显示一段文字,表示不认识这台机器,提醒用户确认是否需要连接。
# The authenticity of host 'xxx' can't be established.
# ECDSA key fingerprint is SHA256:Vybt22mVXuNuB5unE++yowF7lgA/9/2bLSiO3qmYWBY.
# Are you sure you want to continue connecting (yes/no)?
# 输入yes,就可以将当前服务器的指纹也储存在本机~/.ssh/known_hosts文件中
# 当服务器公钥变更后,再次连接会发出警告,可以通过如下命令删除对应主机公钥
ssh-keygen -R hostname
# 或者手动删除
# SSH 连接的握手阶段,客户端必须跟服务端约定加密参数集(cipher suite)。
# 加密参数集包含了若干不同的加密参数,它们之间使用下划线连接在一起,如
TLS_RSA_WITH_AES_128_CBC_SHA
# 代表:
# TLS:协议
# RSA:密钥交换算法
# AES:加密算法
# 128:加密强度
# CBC:加密模式
# SHA:数字签名的 Hash 函数
密钥
非对称加密
- 密钥(key)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,非对称加密需要两个密钥成对使用,分为公钥(public key)和私钥(private key)。
- SSH 密钥登录采用的是非对称加密,每个用户通过自己的密钥登录。其中,私钥必须私密保存,不能泄漏;公钥则是公开的,可以对外发送。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。
- 如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。
登录过程
- 客户端通过ssh-keygen生成自己的公钥和私钥。
# 直接输入ssh-keygen,程序会询问一系列问题,然后生成密钥。 ssh-keygen # 使用-t参数可以指定密钥的加密算法。 ssh-keygen -t dsa # 第一个问题,询问密钥保存的文件名,默认是~/.ssh/id_dsa文件,这个是私钥的文件名,对应的公钥文件~/.ssh/id_dsa.pub是自动生成的。用户的密钥一般都放在主目录的.ssh目录里面。 # 如果选择rsa算法,生成的密钥文件默认就会是~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)。 # 第二个问题,询问是否要为私钥文件设定密码保护(passphrase)。这样的话,即使入侵者拿到私钥,还是需要破解密码。 # 如果为了方便,不想设定密码保护,可以直接按回车键,密码就会为空。后面还会让你再输入一次密码,两次输入必须一致。 # 公钥文件和私钥文件都是文本文件,可以用文本编辑器看一下它们的内容。公钥文件的内容类似下面这样。 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBa07TUY/xHZD6VB/OdS9jGZMBDz/M6Sbtu6SS6yjIdJyZMoVNhH0JiwhumS1xBtJi+AqSxfIBoWM8+sU6Ogu9tzxo+ndT/qBpI4j9zR/Tg8e3zzqkg/++9KYP6xDwTm31FhA07xKQwQnAiiEF3YGs+tR3UvBi0WN0O9L6nqLUEFs12rBugRVhWTNUCjNLAoYhMk4KqyAh0vS2IPa19v96bXe2hrOekwknHMSFAY2UWfT3mxtK6F5V1+K5fR2MrfUHehP/fNHjpsmBFpVhWodZXw8flH8wk5VcV/JH4UaTfbaOP8vAiLuSIkxhzK6Wox8ZM2CKkKy5iysdZYaNQKAL administrator@20220606XT # 其中末尾是公钥的注释,用来识别不同的公钥,表示这是哪台主机的哪个用户的公钥,不是必需项。 # ssh-keygen的命令行配置项,主要有: # -b参数指定密钥的二进制位数。这个参数值越大,密钥就越不容易破解,但是加密解密的计算开销也会加大。 # 一般来说,-b至少应该是1024,更安全一些可以设为2048或者更高。 # -C参数可以为密钥文件指定新的注释,格式为username@host。 # 下面命令生成一个4096位 RSA 加密算法的密钥对,并且给出了用户名和主机名。 ssh-keygen -t rsa -b 4096 -C "your_email@domain.com" # -f参数指定生成的私钥文件。 # ssh-keygen -t dsa -f mykey # 上面命令会在当前目录生成私钥文件mykey和公钥文件mykey.pub。 # -F参数检查某个主机名是否在known_hosts文件里面。 ssh-keygen -F example.com # -N参数用于指定私钥的密码(passphrase)。 ssh-keygen -t dsa -N secretword # -p参数用于重新指定私钥的密码(passphrase)。它与-N的不同之处在于,新密码不在命令中指定,而是执行后再输入。ssh 先要求输入旧密码,然后要求输入两遍新密码。 # -R参数将指定的主机公钥指纹移出known_hosts文件。 ssh-keygen -R example.com # -t`参数用于指定生成密钥的加密算法,一般为`dsa`或`rsa
- 手动将客户端的公钥放入远程服务器的指定位置。
- 密钥保存在需要登录的用户目录的~/.ssh/authorized_keys文件中。
- 每个公钥占据一行。如果该文件不存在,可以手动创建。
# ssh-copy-id命令,可以自动将公钥拷贝到远程服务器 ssh-copy-id -i key_file user@host # 如果authorized_keys文件末尾不是换行符,会导致两个公钥连在一起,共同失效
- 客户端向服务器发起 SSH 登录的请求。
- 服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
- 客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
- 服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。
私钥免密
私钥设置了密码以后,每次使用都必须输入密码,非常麻烦。
ssh-agent命令让用户在整个 Bash 对话(session)之中,只在第一次使用 SSH 命令时输入密码,然后将私钥保存在内存中,后面都不需要再输入私钥的密码了。
# 使用下面的命令新建一次命令行对话
ssh-agent bash
# 如果使用的命令行环境不是Bash,可以用其他的Shell 命令代替。比如zsh和fish
# 如果想在当前对话启用ssh-agent,可以使用下面的命令。
eval `ssh-agent`
# 在Shell对话里面,使用ssh-add命令添加默认的私钥
ssh-add
# 如果添加的不是默认私钥,ssh-add命令需要显式指定私钥文件。
ssh-add my-other-key-file
# -d参数从内存中删除指定的私钥。
ssh-add -d name-of-key-file
# -D参数从内存中删除所有已经添加的私钥。
ssh-add -D
# -l参数列出所有已经添加的私钥。
ssh-add -l
服务器
启动
# sshd 安装后会跟着系统一起启动。如果当前 sshd 没有启动,可以用下面的命令启动。
sshd
# 也可以通过 Systemd 启动 sshd
# 启动
sudo systemctl start sshd.service
# 停止
sudo systemctl stop sshd.service
# 重启
sudo systemctl restart sshd.service
# 下次启动时自动运行。
sudo systemctl enable sshd.service
配置
sshd 的配置文件在/etc/ssh目录,主配置文件是sshd_config,此外还有一些安装时生成的密钥。
/etc/ssh/sshd_config:配置文件
/etc/ssh/ssh_host_ecdsa_key:ECDSA 私钥。
/etc/ssh/ssh_host_ecdsa_key.pub:ECDSA 公钥。
/etc/ssh/ssh_host_key:用于 SSH 1 协议版本的 RSA 私钥。
/etc/ssh/ssh_host_key.pub:用于 SSH 1 协议版本的 RSA 公钥。
/etc/ssh/ssh_host_rsa_key:用于 SSH 2 协议版本的 RSA 私钥。
/etc/ssh/ssh_host_rsa_key.pub:用于 SSH 2 协议版本的 RSA 公钥。
/etc/pam.d/sshd:PAM 配置文件。
/etc/ssh/sshd_config文件里面的配置项:
- AcceptEnv:指定允许接受客户端通过SendEnv命令发来的哪些环境变量,即允许客户端设置服务器的环境变量清单,变量名之间使用空格分隔(AcceptEnv PATH TERM)。
- AllowGroups:指定允许登录的用户组(AllowGroups groupName,多个组之间用空格分隔。如果不使用该项,则允许所有用户组登录。
- AllowUsers:指定允许登录的用户,用户名之间使用空格分隔(AllowUsers user1 user2),也可以使用多行AllowUsers命令指定,用户名支持使用通配符。如果不使用该项,则允许所有用户登录。该项也可以使用用户名@域名的格式(比如AllowUsers jones@example.com)。
- AllowTcpForwarding:指定是否允许端口转发,默认值为yes(AllowTcpForwarding yes),local表示只允许本地端口转发,remote表示只允许远程端口转发。
- AuthorizedKeysFile:指定储存用户公钥的目录,默认是用户主目录的ssh/authorized_keys目录(AuthorizedKeysFile .ssh/authorized_keys)。
- Banner:指定用户登录后,sshd 向其展示的信息文件(Banner /usr/local/etc/warning.txt),默认不展示任何内容。
- ChallengeResponseAuthentication:指定是否使用“键盘交互”身份验证方案,默认值为yes(ChallengeResponseAuthentication yes)。
- 从理论上讲,“键盘交互”身份验证方案可以向用户询问多重问题,但是实践中,通常仅询问用户密码。如果要完全禁用基于密码的身份验证,请将PasswordAuthentication和ChallengeResponseAuthentication都设置为no。
- Ciphers:指定 sshd 可以接受的加密算法(Ciphers 3des-cbc),多个算法之间使用逗号分隔。
- ClientAliveCountMax:指定建立连接后,客户端失去响应时,服务器尝试连接的次数(ClientAliveCountMax 8)。
- ClientAliveInterval:指定允许客户端发呆的时间,单位为秒(ClientAliveInterval 180)。如果这段时间里面,客户端没有发送任何信号,SSH 连接将关闭。
- Compression:指定客户端与服务器之间的数据传输是否压缩。默认值为yes(Compression yes)
- DenyGroups:指定不允许登录的用户组(DenyGroups groupName)。
- DenyUsers:指定不允许登录的用户(DenyUsers user1),用户名之间使用空格分隔,也可以使用多行DenyUsers命令指定。
- HostKey:指定 sshd 服务器的密钥,详见前文。
- KeyRegenerationInterval:指定 SSH 1 版本的密钥重新生成时间间隔,单位为秒,默认是3600秒(KeyRegenerationInterval 3600)。
- ListenAddress:指定 sshd 监听的本机 IP 地址,即 sshd 启用的 IP 地址,默认是 0.0.0.0(ListenAddress 0.0.0.0)表示在本机所有网络接口启用。可以改成只在某个网络接口启用(比如ListenAddress 192.168.10.23),也可以指定某个域名启用(比如ListenAddress server.example.com)。
- LoginGraceTime:指定允许客户端登录时发呆的最长时间,比如用户迟迟不输入密码,连接就会自动断开,单位为秒(LoginGraceTime 60)。如果设为0,就表示没有限制。
- LogLevel:指定日志的详细程度,可能的值依次为QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG、DEBUG1、DEBUG2、DEBUG3,默认为INFO(LogLevel INFO)。
- MACs:指定sshd 可以接受的数据校验算法(MACs hmac-sha1),多个算法之间使用逗号分隔。
- MaxAuthTries:指定允许 SSH 登录的最大尝试次数(MaxAuthTries 3),如果密码输入错误达到指定次数,SSH 连接将关闭。
- MaxStartups:指定允许同时并发的 SSH 连接数量(MaxStartups)。如果设为0,就表示没有限制。
- PasswordAuthentication:指定是否允许密码登录,默认值为yes(PasswordAuthentication yes),建议改成no(禁止密码登录,只允许密钥登录)。
- PermitEmptyPasswords:指定是否允许空密码登录,即用户的密码是否可以为空,默认为yes(PermitEmptyPasswords yes),建议改成no(禁止无密码登录)。
- PermitRootLogin:指定是否允许根用户登录,默认为yes(PermitRootLogin yes),建议改成no(禁止根用户登录)。
# sshd 启动时会自动读取默认的配置文件。如果希望使用其他的配置文件,可以用 sshd 命令的-f参数指定。
sshd -f /usr/local/ssh/my_config
# 配置文件修改以后,并不会自动生效,必须重新启动 sshd。
sudo systemctl restart sshd.service
# sshd配置项,可以覆盖配置文件的设置。
# -d参数用于显示 debug 信息。
sshd -d
# -D参数指定 sshd 不作为后台守护进程运行。
sshd -D
# -e参数将 sshd 写入系统日志 syslog 的内容导向标准错误(standard error)。
# -f参数指定配置文件的位置。
# -h参数用于指定密钥。
sshd -h /usr/local/ssh/my_rsa_key
# -o参数指定配置文件的一个配置项和对应的值。
sshd -o "Port 2034"
# 配置项和对应值之间,可以使用等号。
sshd -o "Port = 2034"
# 如果省略等号前后的空格,也可以不使用引号。
sshd -o Port=2034
# -o参数可以多个一起使用,用来指定多个配置关键字。
# -p参数指定 sshd 的服务端口。
sshd -p 2034
# -t参数检查配置文件的语法是否正确。
端口转发
SSH 除了登录服务器,还可以作为加密通信的中介,充当两台服务器之间的通信加密跳板,使得原本不加密的通信变成加密通信。这个功能称为端口转发(port forwarding),又称 SSH 隧道(tunnel)。
端口转发有两个主要作用:
- 将不加密的数据放在 SSH 安全连接里面传输,使得原本不安全的网络服务增加了安全性,比如通过端口转发访问 Telnet、FTP 等明文服务,数据传输就都会加密。
- 作为数据通信的加密跳板,绕过网络防火墙。
端口转发有三种使用方法:动态转发,本地转发,远程转发。
动态转发
动态转发:本机与SSH服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都通过SSH转发。
本地转发
本地转发:SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。本地转发是在本地计算机的 SSH 客户端建立的转发规则。
远程转发
远程端口指的是在远程SSH服务器建立的转发规则。
这种场景比较特殊,主要针对内网的情况。本地计算机在外网,SSH跳板机和目标服务器都在内网,而且本地计算机无法访问内网之中的SSH跳板机,但是SSH跳板机可以访问本机计算机。
由于本机无法访问内网 SSH 跳板机,就无法从外网发起 SSH 隧道,建立端口转发。必须反过来,从 SSH 跳板机发起隧道,建立端口转发,这时就形成了远程端口转发。
证书登录
- ssh证书登录是在密码登录和密钥登录外的第三种方式
- 密码登录需要输入服务器密码,这非常麻烦,也不安全,存在被暴力破解的风险。
- 密钥登录需要服务器保存用户的公钥,也需要用户保存服务器公钥的指纹。这对于多用户、多服务器的大型机构很不方便,如果有员工离职,需要将他的公钥从每台服务器删除。
优势
证书登录就是为了解决上面的缺点而设计的。它引入了一个证书颁发机构(Certificate Authority,简称 CA),对信任的服务器颁发服务器证书,对信任的用户颁发用户证书。
登录时,用户和服务器不需要提前知道彼此的公钥,只需要交换各自的证书,验证是否可信即可。
证书登录的主要优点有两个:
- 用户和服务器不用交换公钥,这更容易管理,也具有更好的可扩展性。
- 证书可以设置到期时间,而公钥没有到期时间。针对不同的情况,可以设置有效期很短的证书,进一步提高安全性。
流程
SSH证书登录之前,如果还没有证书,需要生成证书:
- 用户和服务器都将自己的公钥,发给CA;
- CA使用服务器公钥,生成服务器证书,发给服务器;
- CA使用用户的公钥,生成用户证书,发给用户。
有了证书以后,用户就可以登录服务器了。整个过程都是SSH自动处理,用户无感知:
- 用户登录服务器时,SSH 自动将用户证书发给服务器。
- 服务器检查用户证书是否有效,以及是否由可信的 CA 颁发。证实以后,就可以信任用户。
- SSH 自动将服务器证书发给用户。
- 用户检查服务器证书是否有效,以及是否由信任的 CA 颁发。证实以后,就可以信任服务器。
- 双方建立连接,服务器允许用户登录。
证书登录的前提是,必须有一个 CA,而 CA 本质上就是一对密钥,跟其他密钥没有不同,CA 就用这对密钥去签发证书。
虽然 CA 可以用同一对密钥签发用户证书和服务器证书,但是出于安全性和灵活性,最好用不同的密钥分别签发。所以,CA 至少需要两对密钥,一对是签发用户证书的密钥,假设叫做user_ca,另一对是签发服务器证书的密钥,假设叫做host_ca
有了 CA 以后,就可以用CA和用户、服务器对应的公钥来签发证书
其它工具
scp
scp是 SSH 提供的一个客户端程序,用来在两台主机之间加密传送文件(即复制文件)。
scp是 secure copy 的缩写,相当于cp命令 + SSH。它的底层是 SSH 协议,默认端口是22,相当于先使用ssh命令登录远程主机,然后再执行拷贝操作。
scp可以用于:本地复制到远程、远程复制到本地、两个远程系统之间的复制。
使用scp传输数据时,文件和密码都是加密的,不会泄漏敏感信息。
# scp的语法类似cp的语法
scp source destination
# 它们都可以包含用户名和主机名
scp user@host:foo.txt bar.txt
# 支持一次复制多个文件
scp source1 source2 destination
# 如果所要复制的文件,在目标位置已经存在同名文件,scp会在没有警告的情况下覆盖同名文件。
# 本地文件复制到远程
# 源是文件时,目标可以是文件或文件夹
scp SourceFile user@host:directory/TargetFile
scp file.txt remote_username@10.10.0.2:/remote/directory
# 源是文件夹或文件内容时,目标都是文件夹
# 会在远程主机创建 documents 目录
scp -r documents username@server_ip:/path_to_remote_directory
# 将本机整个目录拷贝到远程目录下
scp -r localmachine/path_to_the_directory username@server_ip:/path_to_remote_directory/
# 将本机目录下的所有内容拷贝到远程目录下
scp -r localmachine/path_to_the_directory/* username@server_ip:/path_to_remote_directory/
# 远程文件复制到本地,两个远程系统之间的复制,与上述规则一样。
sftp
sftp是 SSH 提供的一个客户端应用程序,主要用来安全地访问 FTP。因为 FTP 是不加密协议,很不安全,sftp就相当于将 FTP 放入了 SSH。
# 连接 FTP 主机
sftp username@hostname
# 输入 FTP 的密码。密码验证成功以后,就会进入提示符sftp>
# 可以使用各种FTP命令