Linux 第51,52天 openssl,ssh
时间:20180912
时间:20180913
目录
对称加密解密工具
实现公钥私钥加密
openssl 一个强大的工具,可以调用多样的加密算法来加密解密
base64编码原理
建立CA和申请授权证书(脚本完成)
实现ssh基于密钥认证,并实现批量化将公钥传输至指定的目标主机上(脚本完成)
ssh私钥加密
本文总结
对称加密解密工具
gpg (注意选项顺序)
-c 使用对称密钥加密
-o 指定输出文件名
-d 解密文件
如
加密文件 gpg -c file1 会提示输出密码,然后就会生成与名字相同的gpg后缀文件
解密文件 gpg -d file.sec -o file1 (注意是在不同的机器哦,cent7同机器
不需要输入密码,具体原因未知)
实现公钥私钥加密
gpg
--gen-key 生成非对称密钥
--list-key 列出已经生成的密钥
--delete-keys 删除非对称密钥
-a 使用ASCII格式输出加密的文件
--export
--import
-e 使用非对称密钥加密
-r 指定使用哪个密钥加密
openssl 一个强大的工具,可以调用多样的加密算法来加密解密
单向加密
工具 md5sum, sha1sum, sha224sum, sha256sum...
openssl dgst
如 openssl dgst -sha512 file...
生成用户密码
openssl passwd -1 -salt SALT(最多8位)
生成随机数
openssl rand [-base64|-hex] NUM
NUM 表示字节数; -hex时每个字符为十六进制,相当于4位二进制,出现的字符数为
NUM数*2
生成密钥对
生成私钥
openssl genrsa -out /path/name.key NUM
如(umask 077;openssl genrsa -out test.key -des 2048)
opelssl rsa in test.key -out test2.key 将加密的key解密
从私钥提取出公钥
openssl rsa in privvatekey -pubout -out /path/pub.key
base64编码原理
是一种编码,可以将所给的数据采用二进制方式读取,每六位为一个字符将其编码,所采用的字符
是a-z,A-Z,0-9,+/64个字符来表示,如所给的数据不足六位二进制数时,会自动补0,但其结果
会显示为=号
建立CA和申请授权证书(脚本完成)
实现脚本创建CA(还未完全自动需要手工输入创建CA时需要添写的资料)
删除CA,生成私钥和证书请求,签署证书请求 (用时3小时,时间有点长)
脚本不足:未添加查看功能待完善哈哈(函数已经建好了就等高人添加内容了)
#!/bin/bash
# config PKI
# version 2.0
# auth Winthcloud
# Build the Private CA
dir='/etc/pki/CA'
database="$dir/index.txt"
serial="$dir/serial"
certificate="$dir/cacert.pem"
private_key="$dir/private/cakey.pem"
crlnumber="$dir/crlnumber"
new_certs_dir="$dir/newcerts"
crl="$dir/crl.pem"
configPki(){
[ ! -f "$database" ] && touch $database &>/devnull
[ ! -f "$serial" ] && echo 01 > $serial
[ ! -f "$private_key" ] && (umask 077;openssl genrsa -out
$private_key 2048&>/dev/null) #此处和上一行为一行内容
[ ! -f "$certificate" ] && openssl req -new -x509 -key
$private_key -days 3650 -out $certificate #此处和上一行为一行内容
echo 01 > $crlnumber
}
# Delete the Private CA
delPki(){
[ -f "$database" ] && rm -f $database{,.attr{,.old},.old}
[ -f "$serial" ] && rm -f $serial{,.old}
[ -f "$private_key" ] && rm -f $private_key
[ -f "$certificate" ] && rm -f $certificate
[ -f "$crlnumber" ] && rm -f $crlnumber{,.old}
[ -f "$crl" ] && rm -f $crl
rm -f $dir/certs/* $dir/newcerts/*
}
# Sign the Certificate Request
signCsr(){
openssl ca -in $1 -days $2 -out $dir/certs/$1.crt
}
#Revoke Certificate
revokeCrl(){
SN=`openssl x509 -in $1 -noout -serial|cut -d"=" -f2`
openssl ca -revoke $new_certs_dir/$SN.pem &> /dev/null
openssl ca -gencrl -out $crl &> /dev/null
}
# Create Private Key
createPK(){
openssl genrsa -out $1 $2
openssl req -new -key $1 -out $1.csr
}
#viewInfo(){
# if [ "$1" = "crl" ];then
# openssl crl -in $crl -noout -issuer -crlnumber
# fi
#}
if [ "$1" = "bldCA" ];then
configPki
elif [ "$1" = "delCA" ];then
delPki
elif [ "$1" = "revoke" -a -f $2 ];then
revokeCrl $2
elif [ "$1" = "signCsr" -a -f "$2" -a -n "$3" ];then
signCsr $2 $3
elif [ "$1" = "genPK" -a -n "$2" -a "$3" -ge "1024" ];then
createPK $2 $3
else
echo -e "\033[1;31mCreate Private CA Insititution\033[0m"
echo -e "\tUsage: `basename $0` <bldCA|delCA|signCsr <csrFile>
<ExpireDays>|revoke <CRTFile> > " #此处和上一行为一行内容
echo -e "\033[1;31mGenerate both Private Key and CerTificate Requeste\033[0m"
echo -e "\tUsage: `basename $0` <genPK> <PKName> <KeyLength>"
fi
实现ssh基于密钥认证,并实现批量化将公钥传输至指定的目标主机上
1.首先自建立一个文档里边有三列 IP USERNAME PASSWORD
如 cat ipList.txt
192.168.1.5 admin admin
2.建立脚本生成本机的私钥,并读取此上述文件将本机的公钥拷贝至目标主机
#!/bin/bash
# Description: this script automatically Copy the SHH pub Key
# to the remote host.
# Version: 2.0
# Auth: Winthcloud
port=22
keyfile=~/.ssh/id_rsa
iplist=ip.txt
[ -f "$keyfile" ] || ssh-keygen -t rsa -f $keyfile -P "" &>/dev/null
while read ipline;do
ip=`echo $ipline | awk '{print $1}'`
user=`echo $ipline | awk '{print $2}'`
password=`echo $ipline | awk '{print $3}'`
expect << EOF
spawn ssh-copy-id -i $keyfile.pub $user@$ip -p $port
expect {
"yes/no" {send "yes\n";exp_continue}
"password" {send "$password\n"}
}
expect eof
EOF
echo -e "\033[1;32m$ip has received the pub Key\033[0m"
done < $iplist
ssh私钥加密
虽然使用密钥通信时方便,不为私钥,但是如果私钥丢失,则会出现很严重的问题
但是为私钥添加密码后,使用起来又需要输入密码,这里有一个工具可以代替用户输入密码
为私钥加密
ssh-keygen -p
代替用户输入密码(本人测试未成功)
ssh-agent bash
ssh-add
本文总结:
1. 编写脚本可先构框架,再写具体命令(这个叫什么开发来着?)
2. 另一种编写方式边写边加需求(这个是另外一种开发方式也忘记叫什么了哈哈)
3. 基于密钥认证机制的机器指定私钥文件为~/.ssh/id_rsa叫这个名字是因为sshd服务
所定义的如果把名字改为其它的文件名使用ssh连接时需要使用-i选项来指定私钥位置,所以生
成的私钥文件最好不要改名不然连接时会多个参数需要手工敲
4. 私钥的权限必须是600,即组和其它没有权限
5. 在脚本中使用重定向的时候最后结束符EOF必须是在绝对行首前边不可有空格,不然会被
认为是书写的字符导致最终文件没有结束标志。