> Please if there is some possibility of noninteractive creating I would > like to know it. The problem is that openssl req -in wants some request
I've done some sh scripts that do programatic input to req. The full text of the script is appended at the bottom, but the basic trick is to use a conf file with prompt=no and then use $ substitution to put the right things in. Like this: ... # openssl req [req] prompt = no distinguished_name = UMCP_SSLS_DN # DN fields for SSL Server cert [UMCP_SSLS_DN] C = US ST = Maryland O = UMCP/OIT/TSS/EIS CN = $CERTHOST emailAddress = $CERTMAIL Note how environment variables CERTHOST and CERTMAIL from the script are edited into the information put into the request. ===== Hope this helps, the following is a conversational script that asks for the info and then does the non-interactive req that you want to do: #! /bin/sh # Conversational version of makec: make SSL server certificate # The higher-level certificate to sign the certificate with. # Note: SIGNNAME is only used in echo to the user. SIGNNAME="Key B" SIGNKEY=keyb.pem SIGNCERT=certb.pem # CERTHOST - host name the cert is for foombar.umd.edu # CERTMAIL - email address for the cert [EMAIL PROTECTED] # CERTFILE - filename cert written to foombar.umd.edu-cert.pem # CERTKEYF - f/n private key written to foombar.umd.edu-enckey.pem # UNIQNAME - unique name for scratch file # CONFFILE - OpenSSL config file we create # RANDFILE - OpenSSL random file we create # PIPEFILE - file to pipe from "req" to "x509" case "$#" in 0) # No arguments - ask for host name and email echo "" echo "This script generates certificates for SSL servers." echo "" while true; do /usr/ucb/echo -n "Internet domain and host name of the server (or ?): " if read CERTHOST; then case "$CERTHOST" in "?"|"") echo "" echo "You are being asked for the internet host and domain name" echo "for which the SSL server certificate is being generated." echo "Like foombar.umd.edu or something similar." echo "";; *) CERTHOST=`echo "$CERTHOST" | tr A-Z a-z` if echo "$CERTHOST" | awk -F'.' '(2>NF){exit 1} {for(i=1;i<=NF;i++)if($i!~/^[0-9a-z][0-9a-z-]*[0-9a-z]$/)exit 1}' then break; else echo "Golly, \"$CERTHOST\" doesn't look like an internet host name." echo "Enter ? for more information." fi esac else echo "" echo "`basename $0`: Interaction terminated by end of file"; exit 1 fi done while true; do /usr/ucb/echo -n "EMAIL address to be included in the certificate (or ?): " if read CERTMAIL; then case "$CERTMAIL" in "?"|"") echo "" echo "You are being asked for the email address to be included in" echo "the SSL certificate that is being generated. This will be" echo "like [EMAIL PROTECTED] or something similar." echo "";; *) CERTMAIL=`echo "$CERTMAIL" | tr A-Z a-z` # mistake to lowercase??? if echo "$CERTMAIL" | awk -F'@' '(2!=NF){exit 1}{ n=split($1,a,".") for(i=1;i<=n;i++)if(a[i]!~/^[0-9a-z][0-9a-z-]*[0-9a-z]$/)exit 1 n=split($2,a,".");if(2>n)exit 1 for(i=1;i<=n;i++)if(a[i]!~/^[0-9a-z][0-9a-z-]*[0-9a-z]$/)exit 1}' then break else echo "Golly, $CERTMAIL doesn't look like an email address." echo "Enter ? for more information." fi esac else echo "" echo "`basename $0`: Interaction terminated by end of file"; exit 1 fi done;; 2) # Two arguments, interpret as host and email CERTHOST=`echo "$1" | tr A-Z a-z` if echo "$CERTHOST" | awk -F'.' '(2>NF){exit 1} {for(i=1;i<=NF;i++)if($i!~/^[0-9a-z][0-9a-z-]*[0-9a-z]$/)exit 1}' then :; else echo "`basename $0`: bad host name $CERTHOST" exit 1 fi CERTMAIL=`echo "$2" | tr A-Z a-z` if echo "$CERTMAIL" | awk -F'@' '(2!=NF){exit 1}{ n=split($1,a,".") for(i=1;i<=n;i++)if(a[i]!~/^[0-9a-z][0-9a-z-]*[0-9a-z]$/)exit 1 n=split($2,a,".");if(2>n)exit 1 for(i=1;i<=n;i++)if(a[i]!~/^[0-9a-z][0-9a-z-]*[0-9a-z]$/)exit 1}' then :; else echo "`basename $0`: bad email address $CERTMAIL" exit 1 fi ;; *) # Any other case is invalid echo "" echo "Usage: `basename $0` <hostname> <email>" echo "" exit 1;; esac # ask for confirmation while true; do echo "The host name for the certificate is: $CERTHOST" echo "The email address for the certificate is: $CERTMAIL" /usr/ucb/echo -n "Is this correct? (yn?): " if read resp; then resp=`echo "$resp" | tr A-Z a-z` case "$resp" in y|ye|yes) break;; n|no)echo "`basename $0`: Giving up for now."; exit 1;; "?"|h|he|hel|help) echo "" echo "The hostname for the certificate is the hostname for the SSL" echo "server machine that the certificate is destined to protect," echo "and should be given in fully qualifed internet domain name form" echo "(with dots). Like foombar.umd.edu or similar." echo "" echo "The email address is embedded in the certificate to give" echo "relying parties a point of contact." echo "" echo "You are being asked to choose Yes or No." echo "This script will not proceed until you do so." echo "If you choose No, this script will exit" echo "without generating a certificate." echo "";; *) echo "You must choose Yes or No (? for help)";; esac else echo "`basename $0`: interaction terminated by end of file"; exit 1 fi done # Check for overwriting files CERTFILE="$CERTHOST-cert.pem" if /bin/test -e $CERTFILE; then while true; do /usr/ucb/echo -n "$CERTFILE already exists -- overwrite it? (yn?) " if read resp; then resp=`echo "$resp" | tr A-Z a-z` case "$resp" in y|ye|yes) if rm "$CERTFILE"; then break else echo "`basename $0`: could not rm $CERTFILE -- giving up."; exit 1 fi;; n|no) echo "`basename $0`: Giving up for now."; exit 1;; "?"|h|he|hel|help) echo "" echo "The filename into which the certificate is to be written:" echo " $CERTFILE" echo "already exists. This script can either overwrite this file" echo "or exit without creating the certificate." echo "";; *) echo "You must choose Yes or No (? for help)";; esac else echo "`basename $0`: interaction terminated by end of file"; exit 1 fi done fi CERTKEYF="$CERTHOST-enckey.pem" if /bin/test -e $CERTKEYF; then while true; do /usr/ucb/echo -n "$CERTKEYF already exists -- overwrite it? (yn?) " if read resp; then resp=`echo "$resp" | tr A-Z a-z` case "$resp" in y|ye|yes) if rm "$CERTKEYF"; then break else echo "`basename $0`: could not rm $CERTKEYF -- giving up."; exit 1 fi;; n|no) echo "`basename $0`: Giving up for now."; exit 1;; "?"|h||he|hel|help) echo "" echo "The filename into which the private key is to be written:" echo " $CERTKEYF" echo "already exists. This script can either overwrite this file" echo "or exit without creating the certificate." echo "";; *) echo "You must choose Yes or No (? for help)";; esac else echo "`basename $0`: interaction terminated by end of file"; exit 1 fi done fi # OK finally generate the certificate (code from makec) # Export the variables called in from the OpenSSL config file we make export CERTHOST export CERTMAIL UNIQNAME=`basename $0`.`uname -n`.$$ # echo "$UNIQNAME" CONFFILE=.conf.$UNIQNAME RANDFILE=.rand.$UNIQNAME PIPEFILE=.pipe.$UNIQNAME export RANDFILE trap 'rm -f $CERTFILE $CERTKEYF $CONFFILE $RANDFILE $PIPEFILE' 1 2 15 cat <<@eof >$CONFFILE # SSL server cert/key parms # Cert extensions subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always basicConstraints = CA:false nsCertType = server # openssl req [req] default_bits = 1024 prompt = no distinguished_name = UMCP_SSLS_DN # DN fields for SSL Server cert [UMCP_SSLS_DN] C = US ST = Maryland O = UMCP/OIT/TSS/EIS CN = $CERTHOST emailAddress = $CERTMAIL @eof (date;df)>$RANDFILE echo "SSL Server key will be written to $CERTKEYF" echo "SSL Server Certificate will be written to $CERTFILE" echo "First passphrase is to protect key for $CERTHOST" echo "" openssl req -config $CONFFILE -newkey rsa -keyout "$CERTKEYF" -out $PIPEFILE echo "" echo "Next passphrase is to access $SIGNNAME for signing" echo "" openssl x509 -req -extfile $CONFFILE -CA "$SIGNCERT" -CAkey "$SIGNKEY" \ -days 730 -in "$PIPEFILE" -out "$CERTFILE" rm -f $CONFFILE $RANDFILE $PIPEFILE # End of cmake ==== Tomas Kratky wrote: > Hi all, > at first i'm sorry for my english :-) > and second I need something to know - i need to create some requests and > the only thing i have is a file with this structure: > [ user 1 ] > name = ... > email = ... > country = ... > atd... > so if I want to create a request I must read this file a write these > informations when I am asked > by openssl req ... > Please if there is some possibility of noninteractive creating I would > like to know it. The problem is that openssl req -in wants some request > file in PEM or DER. > Maybe if there is a way how wrote some script which could create request > using existing private key (I have it by use of openssl genrsa ..) and > these text information I would be really happy .... > thanx a lot for help > T.Kratky -- Charles B. (Ben) Cranston mailto:zben@;umd.edu http://www.wam.umd.edu/~zben ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]