diff --git a/Makefile b/Makefile index 2d84336905ffb0da39217584b89c84c4c40f28fd..5dc07d6c41ced9b25300ccbbe08f33e7c2ad65d6 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ install: install -m 755 src/${APP}-addcert ${DESTDIR}${PREFIX}/bin install -m 755 src/${APP}-addlist ${DESTDIR}${PREFIX}/bin install -m 755 src/${APP}-addemail ${DESTDIR}${PREFIX}/bin + install -m 755 src/${APP}-renew-cert ${DESTDIR}${PREFIX}/bin mkdir -m 755 -p ${DESTDIR}${PREFIX}/share/man/man1 install -m 644 man/${APP}.1.gz ${DESTDIR}${PREFIX}/share/man/man1 install -m 644 man/${APP}-prep.1.gz ${DESTDIR}${PREFIX}/share/man/man1 @@ -29,6 +30,7 @@ install: install -m 644 man/${APP}-addcert.1.gz ${DESTDIR}${PREFIX}/share/man/man1 install -m 644 man/${APP}-addlist.1.gz ${DESTDIR}${PREFIX}/share/man/man1 install -m 644 man/${APP}-addemail.1.gz ${DESTDIR}${PREFIX}/share/man/man1 + install -m 644 man/${APP}-renew-cert.1.gz ${DESTDIR}${PREFIX}/share/man/man1 uninstall: rm -f ${PREFIX}/share/man/man1/${APP}.1.gz rm -f ${PREFIX}/share/man/man1/${APP}-prep.1.gz @@ -39,6 +41,7 @@ uninstall: rm -f ${PREFIX}/share/man/man1/${APP}-addcert.1.gz rm -f ${PREFIX}/share/man/man1/${APP}-addlist.1.gz rm -f ${PREFIX}/share/man/man1/${APP}-addemail.1.gz + rm -f ${PREFIX}/share/man/man1/${APP}-renew-cert.1.gz rm -rf ${PREFIX}/share/${APP} rm -f ${PREFIX}/bin/${APP} rm -f ${PREFIX}/bin/${APP}-prep @@ -49,6 +52,7 @@ uninstall: rm -f ${PREFIX}/bin/${APP}-addcert rm -f ${PREFIX}/bin/${APP}-addlist rm -f ${PREFIX}/bin/${APP}-addemail + rm -f ${PREFIX}/bin/${APP}-renew-cert clean: rm -f \#* \.#* debian/*.substvars debian/*.log rm -fr deb.* debian/${APP} diff --git a/debian/source/include-binaries b/debian/source/include-binaries index 56c3b6c7fb90aaed721dbebb8f2f27fba2963ada..410b25149832c490df236d1508c4b78744f8f0b6 100644 --- a/debian/source/include-binaries +++ b/debian/source/include-binaries @@ -7,3 +7,4 @@ man/freedombone-sec.1.gz man/freedombone-addcert.1.gz man/freedombone-addlist.1.gz man/freedombone-addemail.1.gz +man/freedombone-renew-cert.1.gz diff --git a/man/freedombone-renew-cert.1.gz b/man/freedombone-renew-cert.1.gz new file mode 100644 index 0000000000000000000000000000000000000000..2a25a24f664ea7f36c48e4341da7f0e4cfea0045 Binary files /dev/null and b/man/freedombone-renew-cert.1.gz differ diff --git a/src/freedombone-renew-cert b/src/freedombone-renew-cert new file mode 100755 index 0000000000000000000000000000000000000000..9a8a84d2f4f8ab7d88f498d47a6bbb386e2e28fd --- /dev/null +++ b/src/freedombone-renew-cert @@ -0,0 +1,177 @@ +#!/bin/bash +# A script for renewing SSL/TLS certificates + +# License +# ======= +# +# Copyright (C) 2015 Bob Mottram <bob@robotics.uk.to> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +HOSTNAME= +PROVIDER='startssl' + +function show_help { + echo '' + echo 'freedombone-renew-cert -h [hostname] -p [provider]' + echo '' + echo 'Makes it easier to renew a ssl/tls certificate for a website' + echo '' + echo ' --help Show help' + echo ' -h --hostname [name] Hostname' + echo ' -p --provider [name] eg. startssl' + echo '' + exit 0 +} + +function renew_startssl { + echo 'Renewing StartSSL certificate' + if [ -s /etc/ssl/certs/$HOSTNAME.new.crt ]; then + if ! grep -q "-BEGIN CERTIFICATE-" /etc/ssl/certs/$HOSTNAME.new.crt; then + echo '/etc/ssl/certs/$HOSTNAME.new.crt does not contain a public key' + return + fi + + cp /etc/ssl/certs/$HOSTNAME.new.crt /etc/ssl/certs/$HOSTNAME.crt + + if [ ! -d /etc/ssl/roots ]; then + mkdir /etc/ssl/roots + fi + if [ ! -d /etc/ssl/chains ]; then + mkdir /etc/ssl/chains + fi + + # download intermediate certs + wget "http://www.startssl.com/certs/ca.pem" --output-document="/etc/ssl/roots/startssl-root.ca" + wget "http://www.startssl.com/certs/sub.class1.server.ca.pem" --output-document="/etc/ssl/chains/startssl-sub.class1.server.ca.pem" + wget "http://www.startssl.com/certs/sub.class2.server.ca.pem" --output-document="/etc/ssl/chains/startssl-sub.class2.server.ca.pem" + wget "http://www.startssl.com/certs/sub.class3.server.ca.pem" --output-document="/etc/ssl/chains/startssl-sub.class3.server.ca.pem" + ln -s "/etc/ssl/roots/startssl-root.ca" "/etc/ssl/roots/$HOSTNAME-root.ca" + ln -s "/etc/ssl/chains/startssl-sub.class1.server.ca.pem" "/etc/ssl/chains/$HOSTNAME.ca" + cp "/etc/ssl/certs/$HOSTNAME.crt" "/etc/ssl/certs/$HOSTNAME.crt+chain+root" + test -e "/etc/ssl/chains/$HOSTNAME.ca" && cat "/etc/ssl/chains/$HOSTNAME.ca" >> "/etc/ssl/certs/$HOSTNAME.crt+chain+root" + test -e "/etc/ssl/roots/$HOSTNAME-root.ca" && cat "/etc/ssl/roots/$HOSTNAME-root.ca" >> "/etc/ssl/certs/$HOSTNAME.crt+chain+root" + + # remove the password from the private cert + openssl rsa -in /etc/ssl/private/$HOSTNAME.key -out /etc/ssl/private/$HOSTNAME.new.key + cp /etc/ssl/private/$HOSTNAME.new.key /etc/ssl/private/$HOSTNAME.key + shred -zu /etc/ssl/private/$HOSTNAME.new.key + + # bundle the cert + cat /etc/ssl/certs/$HOSTNAME.crt /etc/ssl/chains/startssl-sub.class1.server.ca.pem > /etc/ssl/certs/$HOSTNAME.bundle.crt + + # add it to mycerts + cp /etc/ssl/certs/$HOSTNAME.bundle.crt /etc/ssl/mycerts + cat /etc/ssl/mycerts/*.crt > /etc/ssl/freedombone-bundle.crt + tar -czvf /etc/ssl/freedombone-certs.tar.gz /etc/ssl/mycerts/*.crt + + # create backups + if [ ! -d /etc/ssl/backups ]; then + mkdir /etc/ssl/backups + fi + if [ ! -d /etc/ssl/backups/certs ]; then + mkdir /etc/ssl/backups/certs + fi + if [ ! -d /etc/ssl/backups/private ]; then + mkdir /etc/ssl/backups/private + fi + cp /etc/ssl/certs/$HOSTNAME* /etc/ssl/backups/certs/ + cp /etc/ssl/private/$HOSTNAME* /etc/ssl/backups/private/ + chmod -R 400 /etc/ssl/backups/certs/* + chmod -R 400 /etc/ssl/backups/private/* + + rm /etc/ssl/certs/$HOSTNAME.new.crt + rm /etc/ssl/requests/$HOSTNAME.csr + echo 'Certificate installed' + service nginx restart + return + fi + + if [ -f /etc/ssl/requests/$HOSTNAME.csr ]; then + echo 'Certificate request already created:' + echo '' + cat /etc/ssl/requests/$HOSTNAME.csr + echo '' + echo "Save the requested public key to /etc/ssl/certs/$HOSTNAME.new.crt" + echo 'then run this command again.' + echo '' + return + fi + openssl genrsa -out /etc/ssl/private/$HOSTNAME.new.key 2048 + chown root:ssl-cert /etc/ssl/private/$HOSTNAME.new.key + chmod 440 /etc/ssl/private/$HOSTNAME.new.key + if [ ! -d /etc/ssl/requests ]; then + mkdir /etc/ssl/requests + fi + openssl req -new -sha256 -key /etc/ssl/private/$HOSTNAME.new.key -out /etc/ssl/requests/$HOSTNAME.csr + echo '' + cat /etc/ssl/requests/$HOSTNAME.csr + echo '' + echo 'On the StartSSL site select Certificates Wizard then' + echo 'Web server SSL/TLS Certificate. You can then click on "skip"' + echo 'and then copy and paste the above certificate request into the text' + echo 'entry box. You may now need to wait a few hours for a confirmation' + echo 'email indicating that the new certificate was created.' + echo '' + echo 'Once you have retrieved the new public certificate paste it to:' + echo "/etc/ssl/certs/$HOSTNAME.new.crt then run this command again." + echo '' +} + +while [[ $# > 1 ]] +do +key="$1" + +case $key in + --help) + show_help + ;; + -h|--hostname) + shift + HOSTNAME="$1" + ;; + -p|--provider) + shift + PROVIDER="$1" + ;; + *) + # unknown option + ;; +esac +shift +done + +if [ ! $HOSTNAME ]; then + echo 'No hostname specified' + exit 5748 +fi + +if ! which openssl > /dev/null ;then + echo "$0: openssl is not installed, exiting" 1>&2 + exit 5689 +fi + +# check that the web site exists +if [ ! -f /etc/nginx/sites-available/$HOSTNAME ]; then + echo "/etc/nginx/sites-available/$HOSTNAME does not exist" + return 7598 +fi + +if [[ $PROVIDER == 'startssl' || $PROVIDER == 'StartSSL' ]]; then + renew_startssl +else + echo "$PROVIDER is not currently supported" +fi + +exit 0