我的问题和另一个问题很相似这里但又不完全相同。我有一系列命令来创建 ssl 密钥/crt 等。我希望能够创建一个自动的、默认的。这些是命令(它们来自这一页):
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
如果每个人只接受一个论点,那就没问题,我会做类似的事情
openssl genrsa -des3 -out server.key 2048 <<< arg1
但其中一个需要按顺序请求多达 10 个输入。
我尝试过类似的方法,但没有成功
openssl genrsa -des3 -out server.key 2048 << foo
arg1
arg2
foo
编辑:我认为这种方法实际上是有效的,但不适用于应该是密码的参数。有人有解决方法吗?
某些参数是密码会有所不同吗?
解决这个问题最简单的方法是什么?
答案1
这按预期工作...多年来我一直通过管道将heredocs发送到openssl来创建证书(例如,我在2002年的某个时候编写了下面的脚本,这是该脚本的“新”版本...不知道我第一次写的时候它)。
您需要提供全部openssl 期望的输入,按照它期望的确切顺序,即使其中一些输入只是一个空行(接受默认值)。
例如,这是我的脚本(稍加编辑的版本),用于为 postfix 生成自签名证书:
#! /bin/sh
umask 077
# $site is used for the subdir to hold the certs AND for
# the certificate's Common Name
site="$1"
mkdir -p $site
umask 277
REQ="$site/key.pem"
CERT="$site/cert.pem"
SERV="$site/server.pem"
FING="$site/cert.fingerprint"
# certificate details for herenow script (configurable)
COUNTRY="AU" # 2 letter country-code
STATE="Victoria" # state or province name
LOCALITY="Melbourne" # Locality Name (e.g. city)
ORGNAME="organisation name" # Organization Name (eg, company)
ORGUNIT="" # Organizational Unit Name (eg. section)
EMAIL="[email protected]" # certificate's email address
# optional extra details
CHALLENGE="" # challenge password
COMPANY="" # company name
DAYS="-days 365"
# create the certificate request
cat <<__EOF__ | openssl req -new $DAYS -nodes -keyout $REQ -out $REQ
$COUNTRY
$STATE
$LOCALITY
$ORGNAME
$ORGUNIT
$site
$EMAIL
$CHALLENGE
$COMPANY
__EOF__
# sign it - will ask for demoCA's password
openssl ca $DAYS -policy policy_anything -out $CERT -infiles $REQ
# cert has to be readable by postfix
chmod 644 $CERT
# create server.pem for smtpd by concatenating the certificate (cert.pem) +
# demoCA's public certificate + the host's private key (key.pem)
cat $CERT ./demoCA/cacert.pem $REQ >$SERV
# create fingerprint file
openssl x509 -fingerprint -in $CERT -noout > $FING
注意:这里没有错误检查,只是假设 openssl 对于此特定任务所需的输入的确切顺序。如果您想要错误检查,请使用expect
perlExpect.pm
或 python 的pexpect
.