CA、HTTPS、OpenSSL、SSH、OpenSSH

339 阅读3分钟

CA、HTTPS介绍

#CA证书颁发机构:确保通信双方公钥真实
#计算机系统上默认包含了世界上著名的CA机构的公钥,安装系统的时候默认安装
#根CA没人去证实公钥真实性,只能自我证明。自签名,每个计算机上都有根CA的公钥。(电脑设置-搜索internet-点击内容-证书-受信任的根证书颁发机构)
#企业推荐:购买证书;互联网上申请证书需要收费。
#-
#证书类型:
#    证书授权机构的证书
#    服务器证书
#    用户证书  :可应用用户之间发送邮件加密。
    
#应用使用:安全协议SSL/TLS
#	早期名字:SSL 现在:TLS
#	功能:对应用层(协议:http、mqsql、ftp;密码,数据,敏感信息)进行加密;
        
#HTTPS协议:就是“HTTPS协议”和“SSL/TLS协议”的组合。
#     HTTP over SSL 或 HTTP over TLS,对http协议的文本数据进行加密处理后,成为二#进制形式传输
	

# HTTPS访问网站
# 网站自己已经有自己的CA证书
# 用户通过HTTPS链接时网站把自己的CA证书发给用户
# 用户验证证书的合法性(通过计算机的根证书就可以得到网站的公钥)
# 之后生成随机字符,然后用网站公钥加密
# 网站用自己的私钥解密得到随机字符
# 至此用户与网站服务器都有这串字符,这串字符就可以作为对称密钥进行后续传输
 
  
#客户端  --------------------------------> 服务端
#客户端  <----------CA证书----------------  服务端
#-
#    客户端 ------>通过计算机根CA证书验证----- -->  服务端公钥 --->生成的随机字符串-->服务端公钥加密 
#-
#客户端 --------->加密的随机字符串--------->  服务端
#- 
#    服务端-->服务端私钥解密---->得到客户端生成的随机字符串
#-
#客户端 <------------对称密钥--------------->服务端   

OpenSSL加密工具

1.基本
#HTTPS是用证书实现 #实现的过程是用OpenSSL加密工具实现

[root@centos8 ~]# openssl version   #查询版本
OpenSSL 1.1.1g FIPS  21 Apr 2020

#openssl命令 对称加密
#加密
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
#解密
openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile

#openssl passwd 生成用户密码
#openssl rand -base64 9   生成9位的随机密码


#openssl 生成私钥并加密 提取公钥 去除私钥密码
#生成私钥并加密
openssl genrsa -out shi.key -des3  或 (umask 077; openssl genrsa -out shi.key -des3 1024)
#从私钥中提取公钥
openssl rsa -in shi.key -pubout -out shi.key.pub
#把生成的加密私钥解密
openssl rsa -in shi.key -out shi.key



2. 使用openssl颁发证书
openssl的配置文件
#openssl的配置文件:/etc/pki/tls/openssl.cnf
        ####################################################################
        
        [ ca ]
        default_ca	= CA_default		#CA信息放在CA_default块里
        
        [ CA_default ]

        dir		= /etc/pki/CA			# 存放CA相关文件
        certs		= $dir/certs			# CA子目录存放颁发的证书
        crl_dir		= $dir/crl			# ~~~~~~~存放吊销证书
        database	= $dir/index.txt		# ~~~~~~~存放哪些证书被颁发和版本号编号
        new_certs_dir	= $dir/newcerts		        # ~~~~~~~新的证书存放处
        certificate	= $dir/cacert.pem 		# ~~~~~~~存放自签名证书
        serial		= $dir/serial 			# ~~~~~~~存放证书编号
        crlnumber	= $dir/crlnumber		# ~~~~~~~存放证书吊销编号
        crl		= $dir/crl.pem 			# ~~~~~~~累计的存放了所有吊销证书的信息
        private_key	= $dir/private/cakey.pem        # ~~~~~~~存放私钥
        x509_extensions	= usr_cert			# The extensions to add to the cert
        
        ####################################################################
        
        #三种策略:match匹配、optional可选、supplied提供
		#match:要求申请填写的信息跟CA设置信息必须一致
		#optional:可有可无,跟CA设置信息可不一致
		#supplied:必须填写这项申请信息
        policy		= policy_match      	#默认策略

        # 私有CA策略:匹配策略代表了我们搭建的CA:不允许跨国家、跨省市、跨单位颁发证书。
        [ policy_match ]
        countryName		= match			#填写的CA信息必须与客户端的一致:国家
        stateOrProvinceName	= match			#填写的CA信息必须与客户端的一致:省
        organizationName	= match			#组织名也必须一样
		
	#公共CA策略
	[ policy_anything ]
        countryName = optional
        stateOrProvinceName = optional
        localityName = optional
        organizationName = optional
        organizationalUnitName = optional
        commonName = supplied
        emailAddress = optional
一:创建私有CA
#1.创建CA所需要的文件
    #CentOS8和ubuntu需要提前创建文件夹	
    mkdir -p  /etc/pki/CA/{certs,crl,newcerts,private} 或者从CentOS7复制:scp -r /etc/pki/CA 10.0.0.180:/etc/pki
    #生成证书索引数据库文件
    touch /etc/pki/CA/index.txt
    #指定第一个颁发证书的序列号  注意:第一次,才需要执行
    echo 01 > /etc/pki/CA/serial
#2.准备CA的私钥,
    cd /etc/pki/CA/
    (umask 066;openssl genrsa -out  private/cakey.pem -des3  4096)
#3.生成CA自签名证书
    #-new:生成新证书签署请求;-x509:专用于CA生成自签证书;-key:生成请求时用到的私钥文件;-days n:证书的有效期限;-out /PATH/TO/SOMECERTFILE: 证书的保存路径
    openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
         Enter pass phrase for /etc/pki/CA/private/cakey.pem:
         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 leaveca 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						#国家代码,使用默认规则,这里在用户申请证书时填写必须一致     #国家代码查询 https://country-code.cl/
         State or Province Name (full name) []:beijing				#省
         Locality Name (eg, city) [Default City]:beijing			#城市
         Organization Name (eg, company) [Default Company Ltd]:shi              #公司名
         Organizational Unit Name (eg, section) []:it				#部门
         Common Name (eg, your name or your servers hostname) []:ca.shichong.org #给谁用
         Email Address []:admin@shichong.org						#邮箱
    #查看上面生成的证书信息
    sz  cacert.pem #传到win 修改后缀cacert.crt 双击查看    
    或者
    openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
#############################################################此时CA的证书已经建好了


二:用户申请证书
#1.创建私钥
	#存放证书路径根据服务来定,此处使用/data/app存放私钥
	mkdir /data/app;cd /data/app
	#为需要使用证书的主机生成生成私钥
	(umask 066; openssl genrsa -out test.key 2048)
#2.生成证书申请文件
	openssl req -new -key test.key -out test.csr
	#注意:默认要求 国家,省,公司名称三项必须和CA一致
	#使用的策略是policy_match,所以下面的填写与CA自签名证书时一样 ;城市可以随便,配置上没有限制

#3使用证书申请文件颁发证书
	cd /etc/pki/CA/certs
	openssl ca -in /data/app/test.csr -out test.crt -days 100  #-days 以天为单位
	#查看查看上面生成的证书信息 #把生成的证书丢到win查看
	sz test.crt   
############################################################此时用户的CA证书已加申请完毕并传到win   
3. 吊销证书须知
#指定第一个吊销证书编号   #注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
#可以看到证书 编码 和是 谁的证书
cat /etc/pki/CA/index.txt 
#用编号.pem吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/编号.pem
#更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
#查看证书状态
openssl ca -status 编号

SSH

ssh #协议 无法避免中间人攻击,需要自己确认对方真实
----------------------------------------------------------------------------------------
#问:那么工作中如何判断对方真实性??
#	通过指纹判断
#1.在服务器连接自己可以看到 “SHA256:5DMlxr1AhP+JR6OY6VfIq2UxwI9eprA9u33FYyiAFJw.”
[root@centos7 ~]# ssh 127.0.0.1
The authenticity of host "'"127.0.0.1 (127.0.0.1)"'" can"'"t be established.
ECDSA key fingerprint is SHA256:5DMlxr1AhP+JR6OY6VfIq2UxwI9eprA9u33FYyiAFJw.
ECDSA key fingerprint is MD5:ab:1e:fc:3b:ba:b7:67:35:c3:4a:30:46:8c:c6:9d:f6.
Are you sure you want to continue connecting (yes/no)? 

#2.在客户端连接服务器ssh连接也会有 “SHA256:5DMlxr1AhP+JR6OY6VfIq2UxwI9eprA9u33FYyiAFJw.”
#进行对比就可判断
[root@centos8 .ssh]# ssh 10.0.0.170
The authenticity of host "'"10.0.0.170 (10.0.0.170)"'" can"'"t be established.
ECDSA key fingerprint is SHA256:5DMlxr1AhP+JR6OY6VfIq2UxwI9eprA9u33FYyiAFJw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
----------------------------------------------------------------------------

#服务器公钥存储在客户端的路径
[root@centos8 ~]# cat /root/.ssh/known_hosts   
10.0.0.170 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNlYAPOIst1tx7Fi6eXPIBJ2HR8MMPaQGhRkEjW4aqioO3YSZLTvZy2dyIvc5B4LcV0/ntVJgBUbBe4xIqBFVIc=

----------------------------------------------------------------------------

openssh

实现基于密钥的登录方式
openssh #ssh协议的实现软件
#ssh服务登录的常用验证方式
    #用户/口令 
    #基于密钥 

#实现基于密钥的登录方式
    #1.在客户端生成密钥对 ssh-keygen -t rsa [-P 'password'] [-f “~/.ssh/id_rsa"]
         交互式:   
                [root@centos8 ~]# ssh-keygen 
                [root@centos8 ~]# tree .ssh/
                .ssh/
                ├── id_rsa
                └── id_rsa.pub  #公钥
         非交互式:
                [root@centos8 ~]# ssh-keygen -P '' -f /root/.ssh/id_rsa 
                [root@centos8 ~]# tree .ssh/
                .ssh/
                ├── id_rsa
                └── id_rsa.pub	#公钥

    #2.把公钥文件传输至远程服务器对应用户的家目录 ssh-copy-id [-i [identity_file]] [user@]host
        [root@centos8 ~]# ssh-copy-id 10.0.0.170  
        [root@centos7 ~]# tree .ssh/
        .ssh/
        └── authorized_keys
        [root@centos7 ~]# cat .ssh/authorized_keys 
        ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCq/LzjwCiU1f29R6XJlcbLPyIf7EoB4APrJs7HhHosgMSIL2UrjijNGCvmao7kR4IWe72IQb3GttIsOeedFNJLaoP7kszrZ41azeyocnH9IkfRDyxbzBjRbodXQaBeVmYHxjLyA8NDaRKsVgzvj3Iu85UijWF1QtQhkjLpoI1tl7FENydUKUbScfl1XMv2oCfg9uZHSwp9ZhtnJ7+YRCGvNSP+UHf0GequwWE8T7ThMDYw4uPKECS4J9f0+HCDRztJ9XaaqLMq8MHgAky7zWgbtJ3hp6lFkHzqjlLSduzO49YkwABIq63spRg/tV6qpB11nncri9CUWpqF8Ai3Gfsv3FTWMfovQ60HJB48jjcxRgfncqORK/nMlhyxwluy51+Yw9tNmDcZollMKVrSczc1mhSxWx/NI/dFPWG7SWdzydGfbhzkgJD52Ai/yfOJhCuJa1NmvnRn5HK0pfxMm6QUoRq5fT6NGG+KTQptUvbtMHQ9zC0LBWU1M1TxaromqW0= root@centos8.shichong.org
	#直接连接
        [root@centos8 ~]# ssh 10.0.0.170
        Last login: Sun Aug  1 10:29:28 2021 from 10.0.0.180
        [root@centos7 ~]# 
----------------------------------------------------------------------------

自动登录ssh工具sshpass

#自动登录ssh工具sshpass 
    yum -y -install sshpass
#格式:sshpass [option] command parameters
     sshpass   -p password #后跟密码它允许你用 -p 参数指定明文密码,然后直接登录远程服务器
     sshpass   -f filename #后跟保存密码的文件名,密码是文件内容的第一行
     sshpass   -e #将环境变量SSHPASS作为密码
#管理100台机器
#首先确保这100台机器下载到本地的公钥是真实的。(内网问题不大。外网需要考量)
#难点:
#	用户/口令的登录方式繁琐且麻烦
#	基于密钥的登录方式需要敲大量的拷贝公钥命令。
#解决:
#	自动登录ssh工具sshpass
#	前提是对方的公钥得下载到本地(ssh -o StrictHostKeyChecking=no 相当于ssh 10.0.0.170 第一次连接的yes)
	sshpass -p shichong ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub 10.0.0.170

实例:批量部署多台主机基于key验证脚本

#!/bin/bash
HOSTS="
10.0.0.6
10.0.0.7
10.0.0.18
10.0.0.28
"
PASS=magedu
ssh-keygen  -P ""  -f /root/.ssh/id_rsa &> /dev/null
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in $HOSTS;do
{
sshpass  -p $PASS ssh-copy-id -o  StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i &> /dev/null
}&
done
wait

补充

补充:
    ssh -o StrictHostKeyChecking=no  10.0.0.170 #实现第一次连接10.0.0.170自动下载公钥。注意确保10.0.0.170机器没有被劫持
    例:基于key 认证登录,员工离职修改root是不够的,得去vim /root/.ssh/authorized_keys 把员工公钥删掉 
    
rsync 命令 #增量复制 此工具来自rsync包
#注意:通信两端主机都需要安装rsync软件
rsync  -av /etc  10.0.0.170:/tmp	#复制目录和目录下文件
rsync  -av /etc/ 10.0.0.170:/tmp	#只复制目录下文件   

last            #成功登录信息
lastb 		#查看登录失败详细信息

ll -h /var/log/btmp  #登陆失败log文件大小
lastb |wc -l         #查看登录失败详细信息行数