After doing a lot of head banging, i was able to get it working (so far)
# openssl version OpenSSL 0.9.7j 04 May 2006 # uname -a OpenBSD ironhost.fistofiron.com 4.2 GENERIC#375 i386 # this setting causes lot of errors, hence i have commented it. #prompt = no # this option is generating lot of errors. I referred my sites especially: http://www.faqs.org/docs/securing/chap24sec196.html below is working fine: # # cat openssl.cnf # # OpenSSL example configuration file. # This is mostly being used for generation of certificate requests. # Plus, # I have configured it for generating CA cert too. # RANDFILE = /dev/arandom dir = /etc/ssl # working dir for all operations [ ca ] # section for CA settings default_ca = CA_default # default CA settings section title [ CA_default ] # default settings for CA certs = $dir/certs # dir to keep issued certificates new_certs_dir = $dir/ca.db.certs # dir for new certs crl_dir = $dir/crl # dir for issued cert revoc lists serial = $dir/ca.db.serial # file contains the current serial no. database = $dir/ca.db.index # certificate database index file crl = $dir/crl.pem # the current CRL certificate = $dir/certs/ca.crt # file containing CA certificate private_key = $dir/private/ca.key # the private key corrosponding # to CA certificate default_days = 3650 # valid for 10 years default_crl_days = 30 # how long before next CRL default_md = sha1 # md5 for older software and is weaker preserve = no # whether to preserve the order of DN # fields to match the order passed in email_in_dn = no policy = policy_match # section to tell which fields in certs # must match that of CA, or are mandetory x509_extensions = usr_cert # directives for CA when signing a cert # Make new requests easier to sign - allow two subjects with same name # (Or revoke the old certificate first.) unique_subject = no # Comment out the following two lines for the "traditional" # (and highly broken) format. nameopt = default_ca certopt = default_ca [ policy_match ] # OIDs that must be same as that of CA countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. All values are system default. [ policy_anything ] # all possible options for policy... countryName = optional stateOrProvinceName = optional localityName = optional # this is not in policy_match section organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional ####################################### # the req section is used by openssl req command, it creates and process # certificate requests in PKCS#10 format. also creates self signed certs # for use as root CA. [ req ] # directives to process and create cert requests default_bits = 1024 # key size for new cert request default_keyfile = privkey.pem # def key name for any newely generated cert default_md = sha1 # message digest algorithm default was md5 #prompt = no # this option is generating lot of errors. string_mask = nombstr # permitted characters distinguished_name= req_distinguished_name # suggest was root_ca__distinguished_name attributes = req_attributes # section used when generating cert x509_extensions = v3_ca # section ext to add to self signed cert req_extensions = v3_req # [non CA] Used when requesting certs, # adds more extnsions to cert request ########### # below section not used right now #[ root_ca_distinguished_name ] #commonName = FistOfIron MO #countryName = US #stateOrProvinceName = Missouri #localityName = St.Louis #0.organizationName = fistofiron.org #emailAddress = [EMAIL PROTECTED] ##################### [ req_distinguished_name ] # options needed to generate a certificate # Variable name Prompt string #------------------------- ---------------------------------- countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (city, district) 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) commonName = Common Name (FQDN, hostname, IP, or your name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 #original had 64/sample had 40 # default values for above countryName_default = US stateOrProvinceName_default = Missouri localityName_default = STL, MO 0.organizationName_default = Fist of Iron organizationalUnitName_default = WebMail commonName_default = www.fistofiron.com emailAddress_default = [EMAIL PROTECTED] # we can do this but it is not needed normally :-) #1.organizationName= Second Organization Name (eg, company) #1.organizationName_default= CryptSoft Pty Ltd [ usr_cert ] # options used by CA to sign other certs - called by ca_default section # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # false meaning this cert cannot be used as CA cert # to sign other certs, for e.g. # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash # specifies how to identify the key being certified/signed authorityKeyIdentifier=keyid,issuer:always # how to identify the pub key used to verfy sign # on this (user) key nsComment = OpenSSL_from_Fist_Of_Iron nsCaRevocationUrl = https://www.fistofiron.com/ca-crl.pem # revoc url for the root CA cert #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName [ v3_ca ] # options used for creating CA cert - called by req section # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always # This is what PKIX recommends but some broken software chokes on critical # extensions. #basicConstraints = critical,CA:true # So we do this instead. basicConstraints = CA:TRUE # commented out defaults... #keyUsage= cRLSign,keyCertSign #although typical for a CA #nsCertType= sslCA,emailCA #subjectAltName = email:copy #even though recommanded by PKIX #issuerAltName = issuer:copy #even though recommanded by PKIX #obj = DER:02:03 #experts only. introduces an ext in Hex with DER [ v3_req ] # options used for adding a certificate request. basicConstraints = CA:FALSE # meaning this cert is not for doing CA job subjectKeyIdentifier = hash # how to identify this cert [ req_attributes ] challengePassword = A challenge password # displays this text challengePassword_min = 4 # min length allowed challengePassword_max = 20 # max length allowed unstructuredName = optional company name # displays this text [ x509v3_extensions ] # these are used to sign or request certs nsCaRevocationUrl = http://www.fistofiron.com/ca-crl.pem nsComment = "Fist of Iron owns its own CA and signs its own certs" # under ASN.1, the 0 bit would be encoded as 80 nsCertType = 0x40 #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName #nsCertSequence #nsCertExt #nsDataType # sign.sh is used to sign certificate, but if you read closely you might not need this file..... just commands would do as our config file is very extensive.... # cat sign.sh #!/bin/sh ## ## sign.sh -- Sign a SSL Certificate Request (CSR) ## Copyright (c) 1998-1999 Ralf S. Engelschall, All Rights Reserved. ## # argument line handling CSR=$1 if [ $# -ne 1 ]; then echo "Usage: sign.sign <whatever>.csr"; exit 1 fi if [ ! -f $CSR ]; then echo "CSR not found: $CSR"; exit 1 fi case $CSR in *.csr ) CERT="`echo $CSR | sed -e 's/\.csr/.crt/'`" ;; * ) CERT="$CSR.crt" ;; esac # make sure environment exists if [ ! -d ca.db.certs ]; then mkdir ca.db.certs fi if [ ! -f ca.db.serial ]; then echo '01' >ca.db.serial fi if [ ! -f ca.db.index ]; then cp /dev/null ca.db.index fi # create an own SSLeay config cat >ca.config <<EOT [ ca ] default_ca = CA_own [ CA_own ] dir = /etc/ssl certs = /etc/ssl/certs new_certs_dir = /etc/ssl/ca.db.certs database = /etc/ssl/ca.db.index serial = /etc/ssl/ca.db.serial RANDFILE = /dev/arandom certificate = /etc/ssl/certs/ca.crt private_key = /etc/ssl/private/ca.key default_days = 365 default_crl_days = 30 default_md = sha1 preserve = no policy = policy_anything [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional EOT # sign the certificate echo "CA signing: $CSR -> $CERT:" openssl ca -config ca.config -out $CERT -infiles $CSR echo "CA verifying: $CERT <-> CA cert" openssl verify -CAfile /etc/ssl/certs/ca.crt $CERT # cleanup after SSLeay rm -f ca.config rm -f ca.db.serial.old rm -f ca.db.index.old # die gracefully exit 0 # Now to create http server certs, CA cert and sign the http server cert: 1. config openssl.cnf 2. config sign.sh 3. Create a RSA private key protected with a passphrase for your lighthttpd Server. # openssl genrsa -des3 -out httpsrvr.key 1024 file generated: -rw-r--r-- 1 root wheel 963 Dec 9 22:19 httpsrvr.key 4. Generate a Certificate Signing Request CSR with the server RSA private key. # openssl req -new -key httpsrvr.key -out httpsrvr.csr file produced: -rw-r--r-- 1 root wheel 818 Dec 9 22:23 httpsrvr.csr 5. Create a RSA private key for your CA. # openssl genrsa -des3 -out ca.key 1024 file generated: -rw-r--r-- 1 root wheel 963 Dec 9 22:36 ca.key 6. Create a self-signed CA certificate x509 structure with the RSA key of the CA. # openssl req -new -x509 -days 365 -key ca.key -out ca.crt file(s) generated: -rw-r--r-- 1 root wheel 1025 Dec 9 22:40 ca.crt 7. moved some files: # mv httpsrvr.key ca.key private/ # mv ca.crt certs/ # 8. sign a certificate request: ./sign.sh httpsrvr.csr files generated: -rw-r--r-- 1 root wheel 2794 Dec 10 14:57 httpsrvr.crt 9. file moved: # mv httpsrvr.crt certs/ 10. these files can be used in httpd.conf file as below: SSLCertificateFile /etc/ssl/certs/httpsrvr.crt (1) SSLCertificateKeyFile /etc/ssl/private/httpsrvr.key (2) Hope it is useful to some. Thank you. -BG ________________________________ ~~Kalyan-mastu~~