How to setup your own Certificate Authority | |
=========================================== | |
Note: this howto requires the openssl binary, as well as classic | |
UNIX tools (cat, touch, echo). If you use Windows, please consider | |
installing Cygwin -- see http://cygwin.com/ | |
1. Configure OpenSSL | |
-------------------- | |
First of all, create sslconf.txt in the current directory | |
(a basic example is provided at the end of this file). | |
cat > sslconf.txt <<"EOF" | |
[paste contents here] | |
EOF | |
Then you need to create the database and a starting serial number: | |
touch index | |
echo "01" > serial | |
mkdir newcerts | |
2. Generate the CA certificate | |
------------------------------ | |
openssl req -config sslconf.txt -days 3653 -x509 -newkey rsa:2048 \ | |
-set_serial 0 -text -keyout test-ca.key -out test-ca.crt | |
3. Generate the private keys and certificate requests | |
----------------------------------------------------- | |
openssl genrsa -out server1.key 2048 | |
openssl genrsa -out server2.key 2048 | |
openssl genrsa -out client1.key 2048 | |
openssl genrsa -out client2.key 2048 | |
openssl req -config sslconf.txt -new -key server1.key -out server1.req | |
openssl req -config sslconf.txt -new -key server2.key -out server2.req | |
openssl req -config sslconf.txt -new -key client1.key -out client1.req | |
openssl req -config sslconf.txt -new -key client2.key -out client2.req | |
4. Issue and sign the certificates | |
---------------------------------- | |
openssl ca -config sslconf.txt -in server1.req -out server1.crt | |
openssl ca -config sslconf.txt -in server2.req -out server2.crt | |
openssl ca -config sslconf.txt -in client1.req -out client1.crt | |
openssl ca -config sslconf.txt -in client2.req -out client2.crt | |
5. To revoke a certificate and update the CRL | |
--------------------------------------------- | |
openssl ca -config sslconf.txt -revoke server1.crt | |
openssl ca -config sslconf.txt -revoke client1.crt | |
openssl ca -config sslconf.txt -gencrl -out crl.pem | |
6. To display a certificate and verify its validity | |
--------------------------------------------------- | |
openssl x509 -in server2.crt -text -noout | |
cat test-ca.crt crl.pem > ca_crl.pem | |
openssl verify -CAfile ca_crl.pem -crl_check server2.crt | |
rm ca_crl.pem | |
7. To export a certificate into a .pfx file | |
------------------------------------------- | |
openssl pkcs12 -export -in client2.crt -inkey client2.key \ | |
-out client2.pfx | |
##================================================================ | |
##============== Example OpenSSL configuration file ============== | |
##================================================================ | |
# References: | |
# | |
# /etc/ssl/openssl.conf | |
# http://www.openssl.org/docs/apps/config.html | |
# http://www.openssl.org/docs/apps/x509v3_config.html | |
[ ca ] | |
default_ca = my_ca | |
[ my_ca ] | |
certificate = test-ca.crt | |
private_key = test-ca.key | |
database = index | |
serial = serial | |
new_certs_dir = newcerts | |
default_crl_days = 60 | |
default_days = 730 | |
default_md = sha1 | |
policy = my_policy | |
x509_extensions = v3_usr | |
[ my_policy ] | |
countryName = optional | |
stateOrProvinceName = optional | |
organizationName = match | |
organizationalUnitName = optional | |
commonName = supplied | |
emailAddress = optional | |
[ req ] | |
distinguished_name = my_req_dn | |
x509_extensions = v3_ca | |
[ my_req_dn ] | |
countryName = Country Name.............. | |
countryName_min = 2 | |
countryName_max = 2 | |
stateOrProvinceName = State or Province Name.... | |
localityName = Locality Name............. | |
0.organizationName = Organization Name......... | |
organizationalUnitName = Org. Unit Name............ | |
commonName = Common Name (required).... | |
commonName_max = 64 | |
emailAddress = Email Address............. | |
emailAddress_max = 64 | |
[ v3_ca ] | |
basicConstraints = CA:TRUE | |
subjectKeyIdentifier = hash | |
authorityKeyIdentifier = keyid:always,issuer:always | |
[ v3_usr ] | |
basicConstraints = CA:FALSE | |
subjectKeyIdentifier = hash | |
authorityKeyIdentifier = keyid,issuer | |