Create your own Certificate Authority in less than 10 minutes
This allows you to create a Certificate Authority otherwise known as a CA so you can sign your own certificates. This script has two requirements. A *nix machine with /bin/sh, /bin/bash or a compatible shell, and openssl from the OpenSSL project. You can start the timer now…
I’ve written a script to greatly simplify and automate the processes of both creating the Certificate Authority, and creating Certificates. The script has two basic functions:
- Create a Certificate Authority
- Create keys, certificates, and certificate signing requests, and sign them using the Certificate Authority
Directions for Use
To get this all setup in running, you just need to create a directory, create two files, and execute one of them. Edit the openssl.cnf with your favorite text editor (vim, emacs, nano, pico, ed, joe, whatever), put in your info and then run CAAdmin.sh to get started
From here open a terminal to get started
Create a working directory (copy and paste this block of code into your terminal)
mkdir Certificate_Authority_Admin cd Certificate_Authority_Admin
Create openssl.cnf (copy and paste this block of code into your terminal)
cat << EoF > openssl.cnf # # OpenSSL configuration file. # # Establish working directory. dir = "CA" [ ca ] default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/public/cacert.pem private_key = $dir/private/cakey.pem default_days = 730 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = supplied stateOrProvinceName = supplied organizationName = supplied organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 1024 # Size of keys default_keyfile = key.pem # name of generated keys default_md = md5 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name req_extensions = v3_req [ req_distinguished_name ] # Variable name Prompt string #---------------------- ---------------------------------- 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 # Default values for the above, for consistency and less typing. # Variable name Value #------------------------------ ------------------------------ 0.organizationName_default = ToddSmith, Org organizationalUnitName_default = Secure Services countryName_default = US localityName_default = Los Angeles emailAddress_default = ca@toddsmith.org stateOrProvinceName_default = California commonName_default = toddsmith.org [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always [ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash EoF
Create the CAAdmin Script (copy and paste this block of code into your terminal)
cat << EoF > CAAdmin.sh #!/bin/bash cadir=CA conf="openssl.cnf" cwd=`pwd` echo -n "Do you want to create a Certificate Authority? [yes or no] : " && read answer if [ "X$answer" == "Xyes" ] ; then mkdir -p CA cd CA mkdir public crl newcerts private echo 01 > serial cp /dev/null index.txt if [ ! -f ../openssl.cnf ] ; then echo "Must setup an openssl.cnf" exit 1 fi openssl req -new -x509 -keyout private/cakey.pem -out public/cacert.pem -days 365 -config ../openssl.cnf cd $cwd fi echo -n "Do you want to create a certificate for an SSL enabled server? [yes or no] : " && read answer [ $answer == "yes" ] || exit 1 echo -n "What is the name of this cert / key? (certfilename) : " && read certfile if [ $certfile != "" ] ; then unset answer openssl req -new -nodes -out req.pem -config $conf && \ mv key.pem "${certfile}.key.pem" && \ mv req.pem "${certfile}.req.pem" && \ openssl req -in "${certfile}.req.pem" -text -verify -noout && \ echo -n "Does information look correct? [yes or no] : " && read answer if [ $answer == "yes" ] ; then unset answer openssl ca -out "${certfile}.crt.pem" -config "$conf" -infiles "${certfile}.req.pem" fi echo -n "Do you want to strip the certificate? [yes or no] : " && read answer if [ $answer == "yes" ] ; then unset answer mv "${certfile}.crt.pem" "${certfile}.crt.tmp" openssl x509 -in "${certfile}.crt.tmp" -out "${certfile}.crt.pem" && \ export key_stripped=1 && \ rm "${certfile}.crt.tmp" fi if [ $key_stripped == 1 ] ; then echo -n "Do you want to create a combined cert/key file? [yes or no] : " && read answer if [ $answer == "yes" ] ; then unset answer; cat ${certfile}.crt.pem ${certfile}.key.pem > ${certfile}.crtkey.pem fi fi fi EoF
Edit the openssl.cnf with your favorite editor to customize it for you.
Now I’m gonna run you through the script one time and you can see how simple it is.
tsmith@tejinashi:~/Certificate_Authority_Admin$ ls CAAdmin.sh openssl.cnf tsmith@tejinashi:~/Certificate_Authority_Admin$ sh CAAdmin.sh Do you want to create a Certificate Authority? [yes or no] : yes Generating a 1024 bit RSA private key ....................++++++ .++++++ writing new private key to 'private/cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Organization Name (company) [ToddSmith, Org]: Organizational Unit Name (department, division) [Secure Services]: Email Address [ca@toddsmith.org]: Locality Name (city, district) [Los Angeles]: State or Province Name (full name) [California]: Country Name (2 letter code) [US]: Common Name (hostname, IP, or your name) [toddsmith.org]: Do you want to create a certificate for an SSL enabled server? [yes or no] : yes What is the name of this cert / key? [certfile] : mail.toddsmith.org Generating a 1024 bit RSA private key ..............................++++++ ............................................++++++ writing new private key to 'key.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Organization Name (company) [ToddSmith, Org]: Organizational Unit Name (department, division) [Secure Services]: Email Address [ca@toddsmith.org]: Locality Name (city, district) [Los Angeles]: State or Province Name (full name) [California]: Country Name (2 letter code) [US]: Common Name (hostname, IP, or your name) [toddsmith.org]:mail.toddsmith.org verify OK Certificate Request: Data: Version: 0 (0x0) Subject: O=ToddSmith, Org, OU=Secure Services/emailAddress=ca@toddsmith.org, L=Los Angeles, ST=California, C=US, CN=mail.toddsmith.org Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:d1:be:57:f7:e1:35:5b:01:fb:0d:20:06:23:dc: 44:f7:89:0e:f7:f6:71:5f:17:91:58:01:99:2f:75: 00:0d:e1:d7:0b:35:c1:90:e8:f9:56:a5:82:7b:a1: 97:79:b1:5b:7e:70:fd:cd:e0:95:5d:d1:f4:38:4d: 3f:00:fe:8a:a0:9a:66:2a:3c:45:27:e0:b1:98:3d: 40:2b:03:3c:5e:95:e1:48:79:a9:03:65:78:19:9b: e9:39:06:6f:d6:ad:6f:12:55:dd:18:45:76:50:fd: 40:9a:60:7e:53:fb:67:0d:1b:1e:7f:e6:70:0d:ab: 2b:4c:45:5e:0e:df:c9:3f:5d Exponent: 65537 (0x10001) Attributes: Requested Extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: 56:61:49:B0:F8:DA:58:9E:4A:14:EF:3B:61:D4:74:AF:B6:AF:3A:ED Signature Algorithm: md5WithRSAEncryption b5:8d:6f:16:87:1f:cb:78:16:03:9f:95:cf:4b:8d:b8:81:c0: a9:e4:a0:de:c1:72:b0:3c:c8:2f:26:5e:ff:af:24:de:68:76: e9:d0:f3:36:6d:d6:ea:40:27:19:33:91:ec:89:42:7b:ac:18: 82:59:bf:c3:22:83:77:79:19:a1:05:92:6f:43:be:17:0d:c0: e8:f5:f6:a0:fe:1b:05:ab:fd:56:b8:3a:3b:81:d0:e3:c4:60: 14:db:2f:de:27:a7:da:bc:72:10:e7:de:77:16:18:5e:30:81: d2:c6:1e:bf:96:f6:23:42:c2:0a:2e:3e:15:ff:bf:82:be:9d: 0d:16 Does information look correct? [yes or no] : yes Using configuration from openssl.cnf Enter pass phrase for CA/private/cakey.pem: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows organizationName RINTABLE:'ToddSmith, Org' organizationalUnitName:PRINTABLE:'Secure Services' localityName RINTABLE:'Los Angeles' stateOrProvinceName RINTABLE:'California' countryName RINTABLE:'US' commonName RINTABLE:'mail.toddsmith.org' Certificate is to be certified until Apr 2 01:42:45 2011 GMT (730 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated Do you want to strip the certificate? [yes or no] : yes Do you want to create a combined cert/key file? [yes or no] : yes tsmith@tejinashi:~/Certificate_Authority_Admin$ ls -1 CA CAAdmin.sh mail.toddsmith.org.crt.pem mail.toddsmith.org.crtkey.pem mail.toddsmith.org.key.pem mail.toddsmith.org.req.pem openssl.cnf tsmith@tejinashi:~/Certificate_Authority_Admin$
There you have it. If you want to create another key, run it again. From this point forward you will probably want to answer “no” when the script asks if you want to create a new Certificate Authority. I have not tested it.
I hope that you found this useful.