使用脚本自动配置https(openssl+expect)

相信你能看到这篇文章应该已经了解openssl是什么了,这里就不做介绍了。这里介绍一下expect。
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

expect自动交互流程:

    1. spawn启动指定进程
    1. expect获取指定关键字
    1. send向指定程序发送指定字符
    1. 执行完成退出。

注意该脚本能够执行的前提是安装了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 [email protected]

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证书文件


ca证书运行结果.png

生成服务端证书文件


服务端证书运行过程.png

生成的服务端证书文件.png

你可能感兴趣的:(使用脚本自动配置https(openssl+expect))