If you’re using cPanel DNS only you probably know that AutoSSL feature isn’t available on it. Reason for that is because DNSOnly cPanel installation doesn’t have web server running as classic version does.
To circumvent this you may use certbot
standalone mode to issue a Let’s encrypt certificate. Command you would use is:
certbot certonly --standalone -d HOSTNAME -n -m CONTACT@EMAIL.EXAMPLE --agree-tos
Ok, if domain resolves to the correct server certbot
will launch its built-in web server and perform verification and hopefully certificate should be issued. Now it is only a matter of installing it via “Manage service SSL Certificates” option in WHM.
To automate whole process I’ve stumbled upon neat python script on cPanel’s feature request page. For archiving purposes I’ll attach whole script below as well:
#!/bin/env python
import sys, urllib, re
from subprocess import call
if len(sys.argv) < 2:
print "The hostname must be specified."
exit(1)
hostname = sys.argv[1]
hostname_pattern = re.compile("^[a-z0-9\.-]+$", re.IGNORECASE)
if not hostname_pattern.match(hostname):
print "The hostname contains invalid characters."
exit(1)
file_cert = open("/etc/letsencrypt/live/" + hostname + "/cert.pem")
file_privkey = open("/etc/letsencrypt/live/" + hostname + "/privkey.pem")
file_chain = open("/etc/letsencrypt/live/" + hostname + "/chain.pem")
cert = file_cert.read()
privkey = file_privkey.read()
chain = file_chain.read()
file_cert.close
file_privkey.close
file_chain.close
cert = urllib.quote(cert)
privkey = urllib.quote(privkey)
chain = urllib.quote(chain)
call(["/usr/sbin/whmapi1", "install_service_ssl_certificate", "service=cpanel", "crt=" + cert, "key=" + privkey, "cabundle=" + chain])
call(["systemctl", "restart", "cpanel"])</code>
Add that script somewhere on your server:
/usr/local/bin/whmcert.py
Give it execution permissions:
chmod 0700 /usr/local/bin/whmcert.py
And install certificate with it:
/usr/local/bin/whmcert.py HOSTNAME
Reason why you may prefer this in script is automation of renewal. This way you can simply add following entry in your crontab to automate renewal process:
0 0 * * 1 /usr/bin/certbot renew --quiet --post-hook "/usr/local/bin/whmcert.py HOSTNAME"