#!/usr/bin/env sh
# TESTING!!! #
#Here is a script to deploy cert to apache server.
#returns 0 means success, otherwise error.
#acme.sh --install-cert -d example.com \
#--cert-file /path/to/certfile/in/apache/cert.pem \
#--key-file /path/to/keyfile/in/apache/key.pem \
#--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
#--reloadcmd "service apache2 force-reload"
######## Public functions #####################
set -x
# get rid of _APACHECTL, and _exec after testing
_APACHECTL='httpd'
_exec() {
eval "$@"
}
## $1 : new cert location $2: cp to location
_cpCert() {
#return 0
if cp -f ${1} ${2} && chmod 600 ${2}; then
return 0
fi
return 1
}
_vhostBackupConf() {
#return 0
if cp -f "${1}" "${1}.bak"; then
return 0
fi
return 1
}
_vhostRestoreConf() {
#return 0
if cp -f "${1}.bak" "${1}"; then
return 0
fi
return 1
}
_testConf() {
if ! _exec $_APACHECTL -t; then
return 1
fi
return 0
}
## $1 : vhost config file to check and edit. $2: domain $3: port
_vhostConf() {
if ! _vhostBackupConf "$1"; then
# do something
testvar=''
fi
serverName=$(awk '/ServerName/,/$/' "$1")
serverName=$(awk -F ' ' '{print $2}' <<< ${serverName})
serverAlias=$(awk '/ServerAlias/,/$/' "$1")
serverAlias=$(awk -F ' ' '{print $2}' <<< ${serverAlias})
docRoot=$(awk '/DocumentRoot/,/$/' "$1")
docRoot=$(awk -F ' ' '{print $2}' <<< ${docRoot})
rootParent=$(dirname ${docRoot})
pri=$rootParent/ssl/private
pub=$rootParent/ssl/public
mkdir -m 700 -p ${pri:1}
mkdir -m 700 -p ${pub:1}
sslEng=$(awk '/SSLEngine/,/$/' "$1")
sslEng=$(awk -F ' ' '{print $2}' <<< ${sslEng})
sslPro=$(awk '/SSLProtocol/,/$/' "$1")
sslPro=$(awk -F ' ' '{print $2}' <<< ${sslPro})
sslCiph=$(awk '/SSLCipherSuite/,/$/' "$1")
sslCiph=$(awk -F ' ' '{print $2}' <<< ${sslCiph})
ciphOrd=$(awk '/SSLHonorCipherOrder/,/$/' "$1")
ciphOrd=$(awk -F ' ' '{print $2}' <<< ${ciphOrd})
crtFile=$(awk '/SSLCertificateFile/,/$/' "$1")
crtFile=$(awk -F ' ' '{print $2}' <<< ${crtFile})
keyFile=$(awk '/SSLCertificateKeyFile/,/$/' "$1")
keyFile=$(awk -F ' ' '{print $2}' <<< ${keyFile})
chainFile=$(awk '/SSLCertificateChainFile/,/$/' "$1")
chainFile=$(awk -F ' ' '{print $2}' <<< ${chainFile})
locSec1='
RewriteEngine On
RewriteRule .* https://${matchServerName}/%{REQUEST_URI}/ [R=301,L,QSA]
EOF
)
sed -i '/"${reWriteBlock}"/i ' "${confMatch}"
return 0
fi
return 1
fi
if grep -q 'SSLEngine' "$1"; then
sed -i '/SSLEngine /c\SSLEngine On' "$1"
sed -i '/SSLProtocol /c\SSLProtocol -all +TLSv1.2' "$1"
sed -i '/SSLCipherSuite /c\SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS' "$1"
sed -i '/SSLHonorCipherOrder /c\SSLHonorCipherOrder on' "$1"
sed -i '/SSLCertificateFile /c\SSLCertificateFile ${rootParent}/ssl/public/${serverName}.crt' "$1"
sed -i '/SSLCertificateChainFile /c\SSLCertificateChainFile ${rootParent}/ssl/public/${serverName}.chain.crt' "$1"
sed -i '/SSLCertificateKeyFile /c\SSLCertificateKeyFile ${rootParent}/ssl/private/${serverName}.key' "$1"
testvar=''
else
sslBlock=$(cat <
ServerName ${serverName}
DocumentRoot ${docRoot}
SSLEngine On
SSLProtocol -all +TLSv1.2
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
SSLHonorCipherOrder on
SSLCertificateFile ${rootParent}/ssl/public/${serverName}.crt
SSLCertificateChainFile ${rootParent}/ssl/public/${serverName}.chain.crt
SSLCertificateKeyFile ${rootParent}/ssl/private/${serverName}.key
${locSec}
DirectorySlash On
EOF
)
echo "${sslBlock}" >> "$1"
fi
#look for a location section eg.
if grep -q ${locSec} "$1"; then
if grep -q ${dirSlash} "$1"; then
#set dir slash on
sed -i '/DirectorySlash /c\DirectorySlash On' "$1"
testvar=''
else
#append dir slash here
sed -i '/${locSec}/a DirectorySlash On' "$1"
testvar=''
fi
else
locBlock=$(cat <
EOF
)
# insert the new block here...
sed -i '/<\/virtualhost>/i ${locBlock}' "$1"
fi
#look for mod_rewrite section
modReWrite=''
if grep -q ${modReWrite} "$1"; then
if grep -q "RewriteEngine On" "$1"; then
#set rewrite rules for ssl
# too many ways to redirect ssl for me to check....
testvar=''
else
#append rewrite rules for ssl
sed -i '/${modReWrite}/a RewriteEngine On' "$1"
sed -i '/RewriteEngine On/a RewriteCond %{HTTPS} !on [OR]' "$1"
sed -i '/RewriteCond %{HTTPS} !on [OR]/a RewriteCond %{HTTP_HOST} ^www\. [NC] [OR]' "$1"
sed -i '/RewriteCond %{HTTP_HOST} ^www\. [NC] [OR]/a RewriteCond %{REQUEST_URI} !(.*)/$' "$1"
sed -i '/RewriteCond %{REQUEST_URI} !(.*)/$/a ${newRwRuleSsl}' "$1"
testvar=''
fi
else
reWriteBlock=$(cat <
RewriteEngine On
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC] [OR]
RewriteCond %{REQUEST_URI} !(.*)/$
${newRwRuleSsl}
EOF
)
# insert the new block here...
sed -i '/<\/virtualhost>/i ${reWriteBlock}' "$1"
fi
return
}
apache_deploy() {
_cdomain="$1"
_ckey="$2"
_ccert="$3"
_cca="$4"
_cfullchain="$5"
all_hosts=$(eval "$_APACHECTL -S" | awk '/namevhost/,/\)/')
#echo "$all_hosts"
oldIFS=$IFS
IFS='
'
loopLog=''
for h in $all_hosts; do
d=$(awk -F ' ' '{print $4}' <<< "${h}")
c=$(awk -F ' ' '{print $5}' <<< "${h}")
c=$(echo "$c" | awk -v FS="(\\\\(|\\\\:)" '{print $2}')
p=$(awk -F ' ' '{print $2}' <<< "${h}")
#echo "$d $p $c"
if echo ${d} | grep -q ${_cdomain}; then
if _vhostConf "$c" "$d" "$p"; then
c1='/ssl/public/'
c2='/ssl/private/'
k='.key'
k1=$rootParent$c2$d$k
c3='.crt'
c4='.chain.crt'
c5=$rootParent$c1$d$c3
c6=$rootParent$c1$d$c4
cp -f $_ckey ${k1:1}
cp -f $_ccert ${c5:1}
cp -f $_cfullchain ${c6:1}
fi
fi
done
IFS=$oldIFS
}
apache_deploy idragonfly.net /path/to/test.key /path/to/test.crt /path/to/test.cacert.crt /path/to/test.chain.crt
#echo "$testLog" >> test.log
set +x