相信你能看到这篇文章应该已经了解openssl是什么了,这里就不做介绍了。这里介绍一下expect。
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect自动交互流程:
- spawn启动指定进程
- expect获取指定关键字
- send向指定程序发送指定字符
- 执行完成退出。
注意该脚本能够执行的前提是安装了expect(安装完成之后可以使用which expect命令查看解释器位置)。
expect常见命令
- spawn-交互程序开始后面跟命令或者指定程序
- expect-获取匹配信息匹配成功则执行expect后面的程序动作
- send exp_send-用于发送指定的字符串信息
- exp_continue-在expect中多次匹配就需要用到
- send_user-用来打印输出 相当于shell中的echo
- exit -退出expect脚本
- eof-expect执行结束 退出
- set-定义变量
- puts-输出变量
- set timeout-设置超时时间
实现
生成CA证书的脚本
#!/usr/local/bin/expect
set pwd 888888
set hostname sunwave_ca
set days 3650
set mail test@qq.com
spawn openssl genrsa -des3 -out "$hostname-pass.key" 2048
expect "Enter pass phrase for $hostname-pass.key:"
send "$pwd\r"
expect "Verifying - Enter pass phrase for $hostname-pass.key:"
send "$pwd\r"
interact
spawn openssl rsa -in "$hostname-pass.key" -out "$hostname.key"
expect "Enter pass phrase for $hostname-pass.key:"
send "$pwd\r"
interact
spawn openssl req -new -x509 -key "$hostname.key" -out sunwave_ca.crt -days $days -subj "/C=CN/ST=Hebei/L=Handan/O=$hostname/OU=ibeeger/CN=$hostname/emailAddress=$mail"
interact
生成服务端证书脚本
#!/usr/local/bin/expect
#所需要的参数在运行脚本的时候以参数传入
set pwd [lrange $argv 0 0]
set hostname [lrange $argv 1 1]
set days [lrange $argv 2 2]
set mail [lrange $argv 3 3]
spawn mkdir $hostname
interact
spawn openssl genrsa -out $hostname/server.key 2048
interact
spawn openssl req -new -key "$hostname/server.key" -out $hostname/server.csr -subj "/C=CN/ST=Hebei/L=Handan/O=$hostname/OU=ibeeger/CN=$hostname/emailAddress=$mail"
interact
spawn openssl x509 -req -days $days -in $hostname/server.csr -CA sunwave_ca.crt -CAkey "sunwave_ca.key" -CAcreateserial -out "$hostname/server.crt"
interact
#打包服务段的资料为pkcs12格式(非必要,只是换一种格式存储上一步生成的证书)
spawn openssl pkcs12 -export -in $hostname/server.crt -inkey $hostname/server.key -out $hostname/server.pkcs12
expect "Enter Export Password:"
send "$pwd\r"
expect "Verifying - Enter Export Password:"
send "$pwd\r"
interact
#生成服务端的keystore(.jks,非必要,Java程序通常使用该格式)
spawn keytool -importkeystore -srckeystore $hostname/server.pkcs12 -destkeystore $hostname/server.jks -srcstoretype pkcs12
expect "Enter destination keystore password:"
send "$pwd\r"
expect "Re-enter new password:"
send "$pwd\r"
expect "Enter source keystore password:"
send "$pwd\r"
interact
测试
生成ca证书文件
生成服务端证书文件