====== certificates - letsencrypt ======
[[https://letsencrypt.org|LetsEncrypt]] provides free SSL certs that you renew every few weeks.
It strongly suggests python27, so for CentOS, you'll need to use SCL or some other option.
===== Setup =====
- install packages:yum install centos-release-SCL
yum install git python27 openssl-devel
yum install gcc libffi-devel openssl-devel
- clone repo: git clone https://github.com/letsencrypt/letsencrypt
- new get letsencrypt to install itself: # scl enable python27 './letsencrypt-auto --help'
- some examples (YMMV - read the letsencrypt docs for specifics on the different certification renewal/request options):
# scl enable python27 './letsencrypt-auto certonly --webroot -w /path/site1/htdocs/ -d site1.net,www.site1.net'
# scl enable python27 './letsencrypt-auto certonly --webroot -w /path/site2/htdocs/ -d site2.com,www.site2.com -w /lamp/sub.site2/htdocs/ -d sub.site2.com'
===== Cron =====
* cron: 10 8 * * * /usr/bin/scl enable python27 '/bin/bash /usr/local/sbin/letsencrypt_cron.sh'
* script ''(/usr/local/sbin/letsencrypt_cron.sh''):
#!/bin/bash
#
# letsencrypt cert renewal script
#
# Author: John Friar
# Info: https://wiki.thoughtbit.com/linux:server:certificates_letsencrypt
#
# CDIR can be used by cfg mgmt to copy certs into place/restart webserver
CDIR=/cert_staging/ssl_certs
# letsencrypt installation dir
LEPATH=/opt/letsencrypt
LDIR=/etc/letsencrypt/live
# the key is the letsencrypt dir within LDIR
# the value is the dir within CDIR to copy in the cert to
declare -A CERTS
CERTS["site1.net-0001"]="site1.net"
CERTS["mysite.com"]="www"
CERTS["wiki.mysite.com"]="wiki"
# run letsencrypt
run_letsencrypt() {
conf=$1
if ! ${LEPATH}/letsencrypt-auto -c $conf -vv certonly; then
echo "letsencrypt failed!"
fi
}
# return true if certs are the same
compare_certs() {
src_name=$1
dst_name=$2
src=`md5sum ${src_name} |awk '{ print $1 }'`
dst=`md5sum ${dst_name} |awk '{ print $1 }'`
# diff returns true if no matches
if ! diff -sq <(echo $src) <(echo $dst) &>/dev/null; then
return 1
fi
return 0
}
# parse our array and do the things
for cert in "${!CERTS[@]}"; do
name="${CERTS[$cert]}"
# run letsencrypt
run_letsencrypt $CDIR/$name/letsencrypt.ini &>> $CDIR/$name/letsencrypt.log
# compare the certs
new_cert=$LDIR/$cert/cert.pem
cur_cert=$CDIR/$name/$name.crt
new_key=$LDIR/$cert/privkey.pem
cur_key=$CDIR/$name/$name.key
new_chain=$LDIR/$cert/chain.pem
cur_chain=$CDIR/$name/$name-chain.crt
# returns true if no matches
if ! compare_certs $new_cert $cur_cert; then
echo >> $CDIR/$name/letsencrypt.log
echo 'new cert' >> $CDIR/$name/letsencrypt.log
cp -f $new_cert $cur_cert &>> $CDIR/$name/letsencrypt.log
fi
if ! compare_certs $new_key $cur_key; then
echo >> $CDIR/$name/letsencrypt.log
echo 'new key' >> $CDIR/$name/letsencrypt.log
cp -f $new_key $cur_key &>> $CDIR/$name/letsencrypt.log
fi
if ! compare_certs $new_chain $cur_chain; then
echo >> $CDIR/$name/letsencrypt.log
echo 'new chain' >> $CDIR/$name/letsencrypt.log
cp -f $new_chain $cur_chain &>> $CDIR/$name/letsencrypt.log
fi
echo >> $CDIR/$name/letsencrypt.log
echo "$(date) Done" >> $CDIR/$name/letsencrypt.log
done
===== Reference =====
* https://letsencrypt.readthedocs.org/en/latest/using.html
* https://letsencrypt.org/getting-started/
* https://letsencrypt.org/howitworks/
* https://digitz.org/blog/lets-encrypt-ssl-centos-7-setup/
==
{{tag>:linux:server :linux}}