目录 |
全面认知OpenSSL和OpenSSH
引言 |
引言
★ 在计算机网络中,我们知道跨主机之间的进程通信是通过套接字方式实现的,服务器监听在某个TCP Socket之上(IP:Port),客户端在本地打开一个随机的Socket,然后通过TCP/IP协议,将请求通过交换机、路由器层层转发到目标服务器上,然后服务器可以判断出客户端请求的资源,进而转交到应用层相关服务上,服务端应用进程从磁盘上获得相应的资源信息,然后封装成相应的网络数据包格式以同样的方式层层传输给客户端对应的端口上。
★ 无论数据从应用层向下传输还是从下层到应用层传输,每个层次中的协议都仅仅是对数据进行封装解封装,而里面的数据本身并没有发生变化,所以,数据在发送过程当中是什么还是什么,也就是明文发送的,没有加密,任何人只要获取到了相关的数据包就能通过其他方法获知其中的铭文内容;因此就需要有一种加密机制能够保护互联网数据在传输过程中的隐秘性了。
数据安全性
NIST(美国国家标准与技术研究院)定义的安全属性:
- 保密性:数据保密性,隐私性
- 完整性(不可篡改):数据完整性,系统完整性
- 可用性 :数据有效性
攻击类型
- 威胁保密性的攻击:窃听、通信量分析 ;
- 威胁完整性攻击:篡改,伪装,重放,否认;
- 威胁可用性的攻击:拒绝服务(Dos)
解决方案
-
安全机制:
加密解密;数字签名;访问控制;数据完整性;认证交换;流量填充;路由控制;公证 -
·安全服务:用于抵御攻击的服务
认证服务;访问控制服务;
数据保密性服务:连接保密性、无连接保密性、选择域保密性、流量保密性
数据完整性服务;不可否认性服务;
设计原则
使用成熟的安全系统;以小人之心度输入数据;外部系统是不安全的;最小授权;减少外部接口;缺省使用安全模式;·安全不是似是而非;从STRIDE思考;在入口处检查;从管理上保护好你的系统。
安全算法
-
常用安全技术
认证 授权 安全通信 审计 -
密码算法和协议
对称加密:数据加密(保密性)(算法:3DES,AES)
公钥加密:身份认证,密钥交换,数据加密 (RSA,DSA)
单向加密:数据完整性(MD5,SHA1…)
密钥交换:RSA、DH、ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)
认证协议
Linux系统:OpenSSL, gpg(pgp协议的实现)
OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
密钥交换
密钥交换(IKE):双方通过交换密钥来实现数据加密解密;密钥交换有两种
公钥交换
将公钥加密后通过网络传输到对方进行解密,这种方式很有可能别截获破解,不常用;
DH
双方共有一些参数,共同协商加密算法,除此之外双方还有属于自己的私有参数,通过共有参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双反计算后的结果是相同的,而这个结果就是密钥。
如:A有p和g两个参数,A还有一个属于自己的私有参数x;
B有p和g两个参数,B还有一个属于自己的私有参数y;
A和B有相同的加密算法即:
A:p^x%g
B:p^y%g
然后双方交换计算后的结果,此时
A拿到B的p^y%g,B拿到A的p^x%g,双方再和自己私有参数进行相同的算法,即
A:对p^y%g 再求x次方得(p^y%G)^x=p^xy%g
B:对p^x%g 再求y次方得(p^x%G)^y=P^xy%g
最后A和B的结果是一样的
注意:整个过程中对于第三方人员来说只能获取p,g两个值,AB双方交换的是经过计算后的值,因此这种加密算法是很安全的。
SSL
SSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已成为Internet上保密通讯的工业标准。安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
SSL协议提供的安全信道有以下三个特性:
数据的保密性
信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。
数据的完整性
加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。
安全验证
加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。
SSL会话
- 客户端向服务器端索要并验证证书;
- 双方协商生成“会话密钥”
- 双方采用“会话密钥”进行加密通信
详细过程如下:
第一阶段:ClintHello(客户端发送加密通信请求)
支持的协议版本,比如tls1.2
客户端生成一个随机数,稍后用户生成“会话密钥”
支持的加密算法:比如AES、RSA
支持的压缩算法
第二阶段:ServerHello(服务器端回应)
确认使用的加密通信版本,比如tls1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”;
确认使用的加密算法;
发送服务器证书;
第三阶段:
验证服务器证书,在确认无误后取其公钥;(发证机构、证书完整性、证书的持有者、证书有效期、吊销列表);
发送以下信息给服务器:
一个随机数;
编码变更通知,表示随后的信息都将用双方商定的加密方法和;
客户端握手结束通知;
第四阶段:
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所用到的“会话密钥”。
TLS(传输层安全)
Transport Layer Security(SSL的继承版本)与SSL在传输层对网络连接进行加密。
OpenSSL体系架构 |
OpenSSL体系架构
OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。
基本功能
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。
- openssl: 多用途的命令行工具,每种功能都使专用的子命令来实现;
- libcrypto: 加密,解密库文件;
- libssl:加密模块应用库,实现了ssl及tls;
密码算法库
对称加密算法
我们一般的加密是用一个密码加密文件,然后解密也用同样的密码,这个是对称加密。
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥DES算法。
非对称加密算法
有些加密,加密用的一个密码,而解密用另外一组密码,这个叫非对称加密。
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
信息摘要算法
OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
密钥和证书管理
密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。
首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。
在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。
Openssl命令 |
Openssl命令
查看程序版本号
openssl version
标准命令 enc crl ca dh req…
对称加密:
工具 openssl enc , gpg
算法:3des, aes blowfish
enc命令
openssl enc -e -des3 -a -salt -in ipset.sh -out ipset
-enc:表示加密
-e:加密算法
-des3:des3加密算法
-a:基于ase64文本进行编码
-salt:加盐
-in:加密的文件
-out:输出的文件
openssl enc -d -des3 -a -salt -in ipest -out ipset.sh
-d:表示解密
openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext 加密文件 要输入密码
[root@localhost ~]# openssl enc -e -des3 -a -salt -in /etc/fstab -out fstab.ciphertext
enter des-ede3-cbc encryption password:~~xxxxxx~~
Verifying - enter des-ede3-cbc encryption password:~~xxxxxx~~
[root@localhost ~]# ls
anaconda-ks.cfg fstab.ciphertext install.log.syslog ks-post-nochroot.log
cobbler.ks install.log ks-post.log ks-pre.log
openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab 解密
单向加密(获取数据的特征码):
工具 md5sum sha1sum sha224sum sha256sum … openssl dgst
openssl dgst命令
常用选项有:
[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] :指定一种加密算法
-out filename:将加密的内容保存到指定文件中
openssl dgst -md5 -hex fstab 相当于 md5sum fstab 默认16进制编码
[root@localhost ~]# echo "I want to encrypt use md5\!" | openssl dgst -md5
(stdin)= 136d10f1d9491ec0f45f0031a0b57676
单向加密除了 openssl dgst 工具还有: md5sum,sha1sum,sha224sum,sha256sum ,sha384sum,sha512sum
[root@localhost ~]# echo "I want to encrypt use md5\!" | sha512sum
470020cefc5af74f6653a5ede91123544123a0681d67411109c7fed3834eea92983e1b0f7f2a8547f369a977679ed7d2973b4d209cd4b6eb5a7032113436c238 -
MAC:Message Autentication Code 单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性机制
CBC-MAC
HMAC:使用md5或sha1算法
生成用户密码(生成用户认证的密码):
openssl passwd ,用法如下:
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项有:
-1:使用md5加密算法
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdin:对标准输入的内容进行加密
[root@localhost ~]# echo "I want to encrypt use md5\!" | openssl passwd -1 -salt 123456 -stdin
$1$123456$AW/cFIJsIP1Jxi3PMOT8O1
生成随机数(适合充当salt):
生成随机数需要用到的标准命令为 rand ,用法如下:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
常用选项有:
-out file:将生成的随机数保存至指定文件中
-base64:使用base64 编码格式
-hex:使用16进制编码格式
公钥加密:
-
加密
算法 RSA ELGamal
工具 gpg , openssl rsautl
man rsautl -
数字签名
发送方用自己的私钥加密,接收方用发送方的公钥解密。
数字签名会加密语言数据的特征码,而不会加密语言数据本身。
算法:RSA,EIGamal,DSA(只能用来做签名,而无法用来加密)
DSA:digital signature algorithm
DSS: digital signature standard(只能私钥加密,公钥解密) -
密钥交换
算法 dh
数字证书:公钥加密的另一个应用 。
证书格式:x509 -
生成密钥对
genrsa 命令
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
常用选项有:
-out filename:将生成的私钥保存至指定的文件中
-des|-des3|-idea:不同的加密算法
numbits:指定生成私钥的大小,默认是2048
一般情况下秘钥文件的权限一定要控制好,只能自己读写,因此可以使用 umask 命令设置生成的私钥权限
生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS[root@localhost ~]# openssl genrsa -out rsakey.private 2048 Generating RSA private key, 2048 bit long modulus ........................+++ ..................+++ e is 65537 (0x10001) [root@localhost ~]# ll -rw-r--r-- 1 root root 1675 Apr 21 16:51 rsakey.private
ras命令:
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
[-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
常用选项:
-in filename:指明私钥文件
-out filename:指明将提取出的公钥保存至指定文件中
-pubout:根据私钥提取出公钥
生成公钥
[root@localhost ~]# openssl rsa -in rsakey.private -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtJtqZmZzEHoJQbsBqBg8
yT80xDebJANQ5ARodAXatUfRMV6TMQgdeWh6MPm7lEQ7nB71j7HbkHs14nIeh4rw
8C0R9+DvQjg9jDmHfzMn4+RgcLhHg+uNHqGdZKVfaniFfWd8PF+/kNPdjbYf1BaM
VOIlgrE376pMWv8IWBD1LChtl1ldAueJ4lUrCrPEEg5ZoQ3gPBCeO7s4+2TodMHS
ZWOk9+SFKL+3VZ4tZE0u/ITiY8sGc6eTV7yqrget2CwbmsJyAR3BMa1L+qZufREG
hpkn5dYgRT8z6WPYqApdpClrjzV6ROsvT2cfpioaqJrrpviIG2eOtr0kQT5K3hKp
fwIDAQAB
-----END PUBLIC KEY-----
#openssl rsa -in rsa.private -pubout > rsa.public 从私钥提取出公钥
私钥权限控制
chmod og= rsakey.private
(umask 077; openssl genrsa -out key.pri 2048) 加括号在子shell中运行,umask只在这一次有用
对私钥加密
3des
随机数生成器:
熵池:在操作系统上有一个叫做熵池的地方,他是用来保存硬件中断产生的随机数(每一次硬件中断都会产生一个随机数)
/dev/random:仅从熵池中返回随机数,随机数耗尽时,取随机数的进程将会被阻塞;
/dev/unrandom:仅从熵池中取随机数,随机数耗尽时,就通过伪随机数生成器生成伪随机数;(伪随机数不安全)
熵池中随机数的来源
硬盘IO中断时间间隔
建立私有CA |
建立私有CA
数字证书的获取:
- 向RA注册申请即公共信任的CA;
- 自己创建私有CA,内部网络使用
CA相关文件列表
openssl的配置文件:/etc/pki/tls/openssl.cnf
CA的工作目录:/etc/pki/CA
吊销列表的存放位置:/etc/pki/CA/crl
刚签署的证书的存放位置:/etc/pki/CA/newcerts
CA自身的公钥的位置:/etc/pki/CA/cacert.pem
发出的证书的编号位置:/etc/pki/CA/serial
为吊销的证书编号的位置:/etc/pki/CA/crlnumber
CA自己的私钥位置:/etc/pki/CA/private/cakey.pem
随机数文件:/etc/pki/CA/private/.rand
测试在centos上创建CA
示例:准备两台主机,一台作CA主机192.168.2.6,一台作用户主机192.168.2.7(证书请求主机,web服务)
构建私有CA CA主机192.168.2.6
构建私有CA:在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;
步骤:
- 生成私钥:
CA的自签名证书,需要一个私钥,在openssl.cnf文件中,默认私钥文件存放路径为:
private_key = $dir/private/cakey.pem# The private key,其中,$dir 为/etc/pki/CA
~]# (umask077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
-
生成自签证书;
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365 -new:生成新证书签署请求; -x509:生成自签格式证书,专用于创建私有CA; -key:生成请求时用到的私钥文件路径; -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书 -days:证书的有效时长,单位为day; [root@localhost ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Shan'Xi Locality Name (eg, city) [Default City]:Xi'An Organization Name (eg, company) [Default Company Ltd]:huaxing.org Organizational Unit Name (eg, section) []:technology Common Name (eg, your name or your server's hostname) []:ca.huaxing.org Email Address []:ca@huaxing.org
-
为CA提供所需的目录及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts} [root@localhost CA]# ls cacert.pem certs crl newcerts private [root@localhost CA]# touch index.txt (数据库文件) [root@localhost CA]# echo 01 >serial (指明证书的开始编号) [root@localhost CA]# cat serial 01
向CA请求签署证书 CA用户主机192.168.2.7 提供web服务
要用到证书进行安全通信的服务器,需要向CA请求签署证书;
步骤:(以httpd为例)
-
在需要使用证书的主机上生成私钥,这个私钥文件的位置可以随意定
~]# mkdir /etc/httpd/ssl ~]# cd /etc/httpd/ssl ~]#(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
-
生成证书签署请求(通过步骤1自己生成的私钥加密)
~]# opensslreq -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
生成了httpd.csr请求文件
-
将请求通过可靠方式发给CA主机;
~]#scp /etc/httpd/ssl/httpd.csr root@192.168.2.6:/tmp/
可在CA主机上查看请求主机发送的证书请求;
cd /tmp
cat httpd.csr -
在CA主机上签署证书;
~]# opensslca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365 查看 证书信息: ~]# openssl x509 -in/etc/pki/CA/certs/httpd.crt -noout -serial -subject
-
CA所在的主机将签署完的证书,发送回请求主机;
~]#scp /etc/pki/CA/certs/httpd.crt root@192.168.2.7:/etc/httpd/ssl/
6)配置httpd支持使用ssl及使用的证书
yum install mod_ssl
rpm -ql mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
cp ssl.conf{,.bak}
vim ssl.conf
DocumentRoot "/vhosts/web1/htdocs"
ServerName web1.huaxing.org
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/web1.huaxing.org
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
httpd -t
service httpd restart
(3)测试基于https访问响应的主机
openssl s_client [-connect host:port] [-cert filename] [CApath directory] [-CAfile filename]
openssl s_client -connect 172.16.100.6:443 -CAfile /etc/pki/CA/cacert.pem
cacert.pem是证书 在windows改为cacert.crt 双击安装 或通过浏览器 证书,导入受信任的颁发机构
windows的hosts文件 \Windows\system32\drivers\etc\hosts 相当于自设告诉DNS
吊销证书:
步骤:
-
客户端获取要吊销证书的serial(在使用证书的主机执行):
~]#openssl x509 –in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
-
CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;吊销:#openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.PEM 其中的 SERIAL要换成证书真正的序列号;
-
生成吊销证书的吊销编号(第一次吊销证书时执行)
echo 01 >/etc/pki/CA/crlnumber
-
更新吊销证书列表
#openssl ca–gencrl -out thisca.crl
查看crl文件:
#openssl crl –in /path/from/crl_file.crl -noout –text
OpenSSH |
OpenSSH
OpenSSL和OpenSSH的区别
- SSL是通讯链路的附加层。可以包含很多协议。https, ftps, …
- SSH只是加密的shell,最初是用来替代telnet的。通过port forward,也可以让其他协议通过ssh的隧道而起到加密的效果。
- OpenSSL------一个C语言函数库,是对SSL协议的实现。
- OpenSSH-----是对SSH协议的实现。
- SSH 利用 OpenSSL 提供的库。OpenSSH依赖于OpenSSL ,没有OpenSSL 的话OpenSSH 就编译不过去,也运行不了。
OpenSSH发展
ssh:secure shell, protocol 22/tcp 安全的远程登录功能
OpenSSH:ssh协议的开源实现
代替不安全的telnet telnet使用超级守护进程xinet
SSH协议版本
v1 基于CRC-32做MAC(消息身份认证),不安全;man-in-middle
v2 双方主机协议选择安全的MAC方式
基于DH算法做密钥交换,基于RSA或DSA算法实现身份认证;
两种方式的用户登录认证:
- 基于password认证
- 基于key
OpenSSH架构
C/S架构
C:ssh,scp,sftp
Windows客户端:
xshell , putty , secureCRT,sshsecure,shellclient
S:sshd
客户端组件:
ssh,配置文件:/etc/ssh/ssh_config
StrictHostKeyChecking no 首次登录不显示检查提示
ssh [user@]host [COMMAND]
ssh -l user host [CMD]
-p 监听端口 cmd 远程执行命令
-X [user@]host 支持x11的图形转发
-Y 支持信任的x11转发
存放已授权基于key登录的主机的公钥
~/.ssh/authorized_keys
存放本机SSH连接过的主机的公钥
~/.ssh/know_hosts
两种方式的用户登录认证:
-
基于password:
只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
大致流程:
1.客户端发起ssh请求,服务器会把自己的公钥发送给用户
2.用户会根据服务器发来的公钥对密码进行加密
3.加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功 -
基于key:
需要依靠密钥,也就是你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥解密再把它发送给服务器。
我犯的错误,客户端我使用的是deepin,无root用户权限,用户gmcc生成了密钥对,使用root密码连接ssh把公钥放到服务器后,其实放的位置是root的家目录,这是错误的。必须在CentOS服务器上建立gmcc用户,把公钥放到gmcc家目录下才能生效。生产环境也不应该使用root用户创建此种认证连接。
大致流程:
1.首先在客户端生成一对密钥
ssh-keygen -t rsa 交互式生成
gmcc@gmcc-PC:~/Desktop$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gmcc/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/gmcc/.ssh/id_rsa.
Your public key has been saved in /home/gmcc/.ssh/id_rsa.pub.
gmcc@gmcc-PC:~/.ssh$ ls
id_rsa id_rsa.pub known_hosts
ssh-keygen -t rsa -P ‘’ -f '/home/gmcc/.ssh/id_rsa' 不交互
ls ~/.ssh 在这个文件夹中
2.并将客户端的公钥ssh-copy-id拷贝到服务器端对应用户的家目录下
ssh-copy-id -i .ssh/id_rsa.pub gmcc@192.168.11.6
默认保存在服务器 ~/.ssh/authorized_key
检查authorized_key权限 600
3.当客户端再次发送一个连接请求,包括ip、用户名
ssh gmcc@192.168.11.6
4、5、6 、7登录用户感觉不到,到这一步已经可以免密登录。4-7讲了认证过程。
4.服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,服务器就会发出“质询”(challenge)表现为一串随机字符,如:acdf。
5.服务端将使用客户端拷贝过来的公钥对“质询”进行加密,然后发送给客户端
6.得到服务端发来“质询”后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7.服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
其他可以通过OpenSSH免密的工具
scp命令:
scp [options] SRC... DEST/
存在两种情形:
pull:scp [options] [user@]host:/PATH/FROM/SOMEFILE /PATH/TO/SOMEWHERE
push: scp [options] /PATH/FROM/SOMEFILE [user@]host:/PATH/TO/SOMEWHERE
常用选项:
-r: 递归复制
-p:保持源文件的属性信息
-q:静默模式
-p PORT:指明远程主机监听端口
sftp
sftp root@172.16.100.9
服务端:
sshd 配置文件 /etc/ssh/sshd_config /etc/ssh 密钥位置
常用参数:
Port 22 不要监听在默认端口
AddressFamily any ipv4 or ipv6
ListenAddress ip 只监听内网地址
SyslogFacility 日志保存在 /var/log/secure
PermitRootLogin yes 允许管理员登录
MaxAuthTries 6 最大尝试次数
MaxSessions 10 最大并行会话数
AuthorizedKeyFile .ssh/authorized_key 服务器端公钥存放位置
PasswordAuthentication yes 允许口令登录
X11Forward yes
Subsystem sftp 支持sftp远程连接
UseDNS no 做DNS反向解析
限制可登录用户的办法
AllowUsers
AllowGroups
重启sshd服务 SElinux要关掉
CentOS6:
service sshd restart
CentOS7:
systemctl restart sshd.service