security/ssl-admin for ordinary SSL/TLS services
I came across Dan Langille post on security/ssl-admin and figured I should try it before my old certificates expires later in 2016.
ssl-admin exists mainly for managing OpenVPN certificates, and with some tweaking you can make it work for ordinary SSL/TLS services.
Begin by installing security/ssl-admin, e.g.:
portupgrade -Nfprv security/ssl-admin
If you don’t intend to use ssl-admin for managing OpenVPN certificates, slightly edit the /usr/local/bin/ssl-admin Perl script and disable the check for /usr/local/etc/ssl-admin/packages/client.ovpn:
--- ssl-admin.orig 2016-05-09 19:18:36.205421000 +0200
+++ ssl-admin 2016-05-31 15:32:04.677924000 +0200
@@ -609,9 +609,9 @@
# Make sure packaged ca.crt is up to date.
system("cp $working_dir/active/ca.crt $working_dir/packages/");
-if ( ! -e "$working_dir/packages/client.ovpn"){
- print "OPTIONAL: I can't find your OpenVPN client config. Please copy your config to\n$working_dir/packages/client.ovpn";
-}
+#if ( ! -e "$working_dir/packages/client.ovpn"){
+# print "OPTIONAL: I can't find your OpenVPN client config. Please copy your config to\n$working_dir/packages/client.ovpn";
+#}
while ($menu_item ne "q"){
main_menu();
}
Copy /usr/local/etc/ssl-admin/ssl-admin.conf.sample to /usr/local/etc/ssl-admin/ssl-admin.conf, and edit the file to your satisfaction. I ended up with:
## Set default values here.
#
# The following values can be changed without affecting
# your CA key.
$ENV{'KEY_SIZE'} = "4096";
$ENV{'KEY_DAYS'} = "7305";
$ENV{'KEY_CN'} = "";
$ENV{'KEY_CRL_LOC'} = "URI:http://CRL_URI";
## WARNING!!! ##
#
# Changing the following values has vast consequences.
# These values must match what's in your root CA certificate.
$ENV{'KEY_COUNTRY'} = "NO";
$ENV{'KEY_PROVINCE'} = "Oppland";
$ENV{'KEY_CITY'} = "Gjøvik";
$ENV{'KEY_ORG'} = "Private";
$ENV{'KEY_EMAIL'} = 'hostmaster@ximalas.info';
Ensure this file is stored with UTF-8 encoding if you use non-latin letters.
Copy /usr/local/etc/ssl-admin/openssl.conf.sample to /usr/local/etc/ssl-admin/openssl.conf, and edit the file to your satisfaction. I ended up with these changes:
--- openssl.conf.sample 2016-05-09 19:18:36.203343000 +0200 +++ openssl.conf 2016-05-31 15:39:16.945184000 +0200 @@ -13,7 +13,7 @@ private_key = $dir/active/ca.key default_days = $ENV::KEY_DAYS default_crl_days = 30 -default_md = sha1 +default_md = sha512 preserve = no email_in_dn = yes nameopt = default_ca @@ -40,7 +40,7 @@ [ req ] default_bits = $ENV::KEY_SIZE default_keyfile = privkey.pem -default_md = md5 +default_md = sha512 string_mask = nombstr distinguished_name = req_distinguished_name req_extensions = v3_req
Now, it’s time to run ssl-admin and create the CA root certificate:
# ssl-admin
This program will walk you through requesting, signing,
organizing and revoking SSL certificates.
Looks like this is a new install, installing...
You will first need to edit the /usr/local/etc/ssl-admin/ssl-admin.conf
default variables. Have you done this? (y/n): y
I need the CA credentials. Would you like to create a new CA key and
certificate now? (y/n): y
Please enter certificate owner's name or ID.
Usual format is first initial-last name (jdoe) or
hostname of server which will use this certificate.
All lower case, numbers OK.
Owner []: Hostmaster ximalas.info
File names will use Hostmaster_ximalas.info.
===> Creating private key with 4096 bits and generating request.
Do you want to password protect your CA private key? (y/n): y
Generating RSA private key, 4096 bit long modulus
......................................................++
............++
e is 65537 (0x10001)
Enter pass phrase for Hostmaster_ximalas.info.key:
Verifying - Enter pass phrase for Hostmaster_ximalas.info.key:
===> Self-Signing request.
Enter pass phrase for /usr/local/etc/ssl-admin/Hostmaster_ximalas.info.key:
===> Moving certficate and key to appropriate directory.
===> Creating initial CRL.Using configuration from /usr/local/etc/ssl-admin/openssl.conf
Enter pass phrase for /usr/local/etc/ssl-admin/active/ca.key:
ssl-admin installed tir 31 mai 2016 15:52:59 CEST
=====================================================
# SSL-ADMIN v1.2.1 #
=====================================================
Please enter the menu option from the following list:
1) Update run-time options:
Key Duration (days): 7305
Current Serial #: 01
Key Size (bits): 4096
Intermediate CA Signing: NO
2) Create new Certificate Request
3) Sign a Certificate Request
4) Perform a one-step request/sign
5) Revoke a Certificate
6) Renew/Re-sign a past Certificate Request
7) View current Certificate Revokation List
8) View index information for certificate.
i) Generate a user config with in-line certifcates and keys.
z) Zip files for end user.
dh) Generate Diffie Hellman parameters.
CA) Create new Self-Signed CA certificate.
S) Create new Signed Server certificate.
q) Quit ssl-admin
Menu Item:
On line 1 I ran ssl-admin. On line 7 I indicated the existence and the correctness of the configuration files. On line 9 I indicated that I wanted to create a self-signed CA certificate. On line 14 I entered my CA identification string. On line 21 I indicated the need for passphrase/password protection of the CA. On lines 26, 27, 29, and 32, I entered the passphrase for my CA. Line 56 is the menu option for creating server certificates, while line 59 is obviously where ssl-admin is awaiting your selection.
It might be sensible to adjust the expiration time of future certificates, so they expire a day before the CA certificate. Enter q to quit ssl-admin, and edit /usr/local/etc/ssl-admin/ssl-admin.conf:
## Set default values here.
#
# The following values can be changed without affecting
# your CA key.
$ENV{'KEY_SIZE'} = "4096";
$ENV{'KEY_DAYS'} = "7304";
$ENV{'KEY_CN'} = "";
$ENV{'KEY_CRL_LOC'} = "URI:http://CRL_URI";
## WARNING!!! ##
#
# Changing the following values has vast consequences.
# These values must match what's in your root CA certificate.
$ENV{'KEY_COUNTRY'} = "NO";
$ENV{'KEY_PROVINCE'} = "Oppland";
$ENV{'KEY_CITY'} = "Gjøvik";
$ENV{'KEY_ORG'} = "Private";
$ENV{'KEY_EMAIL'} = 'hostmaster@ximalas.info';
Next, I set out to create a new certificate for my SMTP service:
=====================================================
# SSL-ADMIN v1.2.1 #
=====================================================
Please enter the menu option from the following list:
1) Update run-time options:
Key Duration (days): 7304
Current Serial #: 01
Key Size (bits): 4096
Intermediate CA Signing: NO
2) Create new Certificate Request
3) Sign a Certificate Request
4) Perform a one-step request/sign
5) Revoke a Certificate
6) Renew/Re-sign a past Certificate Request
7) View current Certificate Revokation List
8) View index information for certificate.
i) Generate a user config with in-line certifcates and keys.
z) Zip files for end user.
dh) Generate Diffie Hellman parameters.
CA) Create new Self-Signed CA certificate.
S) Create new Signed Server certificate.
q) Quit ssl-admin
Menu Item: S
Please enter certificate owner's name or ID.
Usual format is first initial-last name (jdoe) or
hostname of server which will use this certificate.
All lower case, numbers OK.
Owner []: smtp.ximalas.info
File names will use smtp.ximalas.info.
Please enter certificate owner's name or ID.
Usual format is first initial-last name (jdoe) or
hostname of server which will use this certificate.
All lower case, numbers OK.
Owner [smtp.ximalas.info]:
Would you like to password protect the private key (y/n): n
Generating a 4096 bit RSA private key
....................................................................................................................++
...............................................++
writing new private key to 'smtp.ximalas.info.key'
-----
===> Serial Number = 01
Using configuration from /usr/local/etc/ssl-admin/openssl.conf
Enter pass phrase for /usr/local/etc/ssl-admin/active/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'NO'
stateOrProvinceName :PRINTABLE:'Oppland'
localityName :T61STRING:'Gj\0xFFFFFFC3\0xFFFFFFB8vik'
organizationName :PRINTABLE:'Private'
commonName :PRINTABLE:'smtp.ximalas.info'
emailAddress :IA5STRING:'hostmaster@ximalas.info'
Certificate is to be certified until May 30 14:08:01 2036 GMT (7304 days)
Write out database with 1 new entries
Data Base Updated
=========> Moving certificates and keys to /usr/local/etc/ssl-admin/active for production.
Can I move signing request (smtp.ximalas.info.csr) to the csr directory for archiving? (y/n): y
===> smtp.ximalas.info.csr moved.
=====================================================
# SSL-ADMIN v1.2.1 #
=====================================================
Please enter the menu option from the following list:
1) Update run-time options:
Key Duration (days): 7304
Current Serial #: 02
Key Size (bits): 4096
Intermediate CA Signing: NO
2) Create new Certificate Request
3) Sign a Certificate Request
4) Perform a one-step request/sign
5) Revoke a Certificate
6) Renew/Re-sign a past Certificate Request
7) View current Certificate Revokation List
8) View index information for certificate.
i) Generate a user config with in-line certifcates and keys.
z) Zip files for end user.
dh) Generate Diffie Hellman parameters.
CA) Create new Self-Signed CA certificate.
S) Create new Signed Server certificate.
q) Quit ssl-admin
Menu Item:
On line 24 I entered S as indicated by line 21. On line 29 I entered the DNS domain name for my SMTP service. On line 37 I accepted the currently entered identifier. On line 38 I declined passphrase/password protection of the certificate. On line 46 I entered the passphrase for the CA certificate. On line 61 I let ssl-admin move the unsigned certificate to the /usr/local/etc/ssl-admin/csr directory. At line 88, ssl-admin is ready for another selection, usually S or q.
You’ll find the signed files in the /usr/local/etc/ssl-admin/active directory. The *.crt and *.pem files are the public keys (the certificates) with some vital information decoded for your convenience. The *.key files are the private keys. The CA is stored as ca.crt and ca.key, not Hostmaster_ximalas.info.* as you might believe. All files are stored in base64 encoding.
Copy and/or concatenate the certificate and private key files as necessary for each service.
If you want to start fresh after experimenting with ssl-admin, simply delete the directories:
/usr/local/etc/ssl-admin/active/usr/local/etc/ssl-admin/csr/usr/local/etc/ssl-admin/packages/usr/local/etc/ssl-admin/prog/usr/local/etc/ssl-admin/revoked