证书及免密登录
https的工作原理
网址或服务器已事先申请了ca证书,携带有网站的公钥——>用户通过浏览器访问网站——>网站的证书会自动通过浏览器发给客户端——>客户端浏览器通过内置校验信息校验证书是否可信——>(如无效会显示warning报警——>)如有效会生成一个随机的key,相当于对称密钥——>通过证书里的公钥加密key传给网站——>网站通过自己的私钥解开得到对称密钥——>后续通过对称密钥key互通即可
私钥
随机的、一次性的
#生成私钥
openssl genrsa -out /data/app.key -aes192
/data/app.key #存放路径
-aes192 #加密私钥,不可直接使用私钥
#解密所加密的私钥
openssl rsa in /data/app.key -out /data/app2.key
#通过私钥导出公钥
openssl rsa -in /data/app.key -pubout -out /data/app.pubkey
公钥交换过程
客户端发送连接请求–>服务器发送公钥和会话密钥id–>客户端将公钥存放于家目录的/.ssh/known_hosts文件中–>客户端将自身公钥和id异或得到res–>用服务器的公钥加密res发送给服务器–>后续通过公钥加密通信即可
再次连接时,客户端发送请求–>服务器用私钥加密信息包发送给客户端–>客户端用公钥解密获取信息–>如解不开则说明已不是原理机器,断开连接
#a异或b=c,c异或a=b,任意两者异或可得到另外第三个
搭建私有ca证书
路径在/etc/pki/tls/openssl.cnf
下
#配置文件格式
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several certs with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
x509_extensions = usr_cert # The extensions to add to the cert
[ policy_match ]
countryName = match match为必须相同;optional为可选,不需相同
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
搭建ca证书
#创建相关文件夹
mkdir /etc/pki/CA/certs /etc/pki/CA/crl /etc/pki/CA/newcerts /etc/pki/CA/private
#创建相关需求文件
touch /etc/pki/CA/index.txt 证书的索引信息
echo 01 > /etc/pki/CA/serial 证书的序列号
#生成私钥
cd /etc/pki/CA/
umask 600;openssl genrsa -out private/cakey.pem 固定路径
#自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
#req 请求 -new 创建新证书 -x509 专用于生成自签名证书 -days 有效期 -key 私钥文件存放路径 -out 证书存放路径
#除了时间,其余都是固定写法
#相关信息
countryName = match 国家编码
stateOrProvinceName = match 省市,如需不一样可更改配置文件为optional
Locality Name 城市
organizationName = match 公司
organizationalUnitName = optional 部门
commonName = supplied 给哪个服务用,一般是域名,自签名用ca.wei.org
emailAddress = optional 邮箱
#国家编码 https://country-code.cl/
申请并颁发证书
#用户需生成私钥
umask 066; openssl genrsa -out /data/www.key
#生成申请证书文件
openssl req -new -key /data/www.key -out /data/www.csr 将该文件发送到ca审核即可
#相关信息
countryName = match 国家编码
stateOrProvinceName = match 省市,如需不一样可更改配置文件为optional
Locality Name 城市
organizationName = match 公司
organizationalUnitName = optional 部门
commonName = supplied 给哪个服务用,一般是域名,自签名用ca.wei.org
emailAddress = optional 邮箱
#颁发证书
openssl ca -in /data/www.csr -out /etc/pki/CA/certs/www.crt -days 100
申请证书文件 将来生成的证书文件存放路径 有效期
win系统中改证书文件后缀为crt,然后安装即可使用
查看颁发的证书信息
cat index.txt
或者
openssl x509 -in /etc/pki/CA/cacert.pem -noout -text #查看自签名证书具体内容
吊销证书
#吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
#SERIAL.pem 证书文件,路径在/etc/pki/CA/certs下
#证书吊销列表,第一次吊销才需执行,用于存放被吊销的证书列表文件
echo 01 > /etc/pki/CA/crlnumber
#更新吊销列表文件
openssl ca -gencrl -out /etc/pki/CA/crl.pem
#查看吊销列表文件
openssl crl -in /etc/pki/CA/crl.pem -noout -text
简单化创建证书
将centos7的/etc/pki/tls/certs/Makefile拷贝过来直接用
在路径/etc/pki/tls/certs/下用make命令即可
可更改Makefile文件的%.key的值将-aes128去掉
用户免密登录连接,基于key验证
一对一
#生成客户端的公、私钥,存放于.ssh目录下,注意保护该机器安全,可免密连接多台
[root@rocky2 ~]#ssh-keygen
#将文件夹拷贝去目标ip,也可不指定用户,默认在目标同样的当前用户家目录下的.ssh/authorized_keys,需要输入目标用户的密码
[root@rocky2 ~]#ssh-copy-id root@10.0.0.200
#改了密码也还能连,可更改公、私钥即可
集群免密连接
##原理是共用一套钥匙
#生成公、私钥
ssh-keygen
#拷贝文件夹传给自己的主机,输入自己的密码
ssh-copy-id 127.0.0.1
#将.ssh文件夹拷贝到需要连接的机器,指定文件存放路径即用户家目录,输入对方的密码,第一次连接需按yes
scp -r .ssh 10.0.0.200:/root/
#不按yes可加选项
-o StrictHostKeyChecking=no
可结合ping命令确认连接多台主机,实现脚本化
[root@rocky2 ~]#cat a.sh
#!/bin/bash
PASS=123456 #密码
#设置网段最后的地址,4-255之间,越小扫描越快
END=254
IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
#取ip设为变量
. /etc/os-release
#判断主机是否为centos或rocky
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
#清空环境
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
#后台执行刷遍全部ip是否能ping通存于文件中
ssh-keygen -P "" -f /root/.ssh/id_rsa
if [ $ID = "centos" -o $ID = "rocky" ];then
rpm -q sshpass || yum -y install sshpass
else
dpkg -i sshpass &> /dev/null || apt -y install sshpass
fi
#根据条件判断下载sshpass包
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
#连接主机并拷贝key文件传输到自己的主机
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
#结合数组,刷遍所有ping通的主机拷贝key文件
#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入回车
for n in ${AliveIP[*]};do
scp /root/.ssh/known_hosts ${n}:.ssh/
done