Isso funciona como esperado ... Estive passando heredocs para openssl para criar certs por anos (por exemplo, escrevi o script abaixo em algum momento de 2002, e essa é a "nova" versão do script ... não faço ideia de quando eu escrevi primeiro).
Você precisa fornecer ALL das entradas que o openssl espera, na ordem exata em que ele as espera, mesmo que algumas dessas entradas sejam apenas uma linha em branco (para aceitar o padrão). / p>
Por exemplo, aqui está (uma versão levemente editada de) meu script para gerar certificados auto-assinados para o 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
NOTA: não há verificação de erros aqui, apenas suposições sobre a ordem exata de entrada requerida pelo openssl para esta tarefa em particular. Se você quiser verificar o erro, use expect
ou perl Expect.pm
ou pexpect
de python.