Ada permasalahan saat menggunakan acme.sh pada sebuah aplikasi yang dijalankan menggunakan reverse proxy di Apache, yaitu disaat Let’s Encrypt melakukan proses verifikasi dengan mengakses http://web.site.kita.com/.well-known/acme-challenge/hashid-challenge-lets-encrypt, akan selalu terjadi kegagalan karena acme.sh melakukan generate content challenge tersebut (check doc di: https://letsencrypt.org/docs/challenge-types/) bukan pada tempat yang dikenali oleh apache.
Sebelumnya, pada aplikasi yang berjalan menggunakan reverse proxy di Apache paling tidak berisikan virtualhost seperti berikut:
<VirtualHost *:80>
ServerName web.site.kita.com
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /root/ssl/ca.pem
SSLCertificateKeyFile /root/ssl/web.site.kita.com.pem
ServerName web.site.kita.com
ServerAdmin webmaster@web.site.kita.com
ProxyPass / http://localhost:3000/ nocanon
ProxyPassReverse / http://localhost:3000/
LogLevel info ssl:warn
ErrorLog /home/log/website/web.site.kita.com/error.log
CustomLog /home/log/website/web.site.kita.com/access.log combined
</VirtualHost>
Pada setting virtualhost di atas, semua koneksi akan dilarikan ke jaringan HTTPS tanpa terkecuali. Untuk itu, supaya proses verifikasi Let’s Encrypt bisa dijalankan dengan baik kita harus menyediakan mekanisme rewrite url pada koneksi HTTP, di mana koneksi tidak akan di-redirect ke HTTPS apabila merupakan proses verikasi Let’s Encrypt; atau koneksi tersebut mengakses url /.well-known/acme-challenge/. Sebagai asumsi bahwa SSL certificate yang digunakan di atas berada di /root/ssl/ca.pem dan /root/ssl/web.site.kita.com.pem dan ini akan kita lakukan perubahan.
Untuk itu kita lakukan penambahan perintah untuk melakukan exclude pada RewriteCond, serta di sini kita akan menempatkan file hasil generate dari mekanisme challenge di folder /var/www/html. Hasilnya adalah seperti ini:
<VirtualHost *:80>
ServerName web.site.kita.com
RewriteEngine On
# jangan di redirect ke https bila let's encrypt challenge
RewriteCond %{REQUEST_URI} !^/\.well\-known/
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
# hanya untuk set lets encrypt menggunakan reverseproxy
DocumentRoot /var/www/html
<Directory /var/www/html>
Order allow,deny
Allow from all
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Setelah melakukan perubahan ini agar dilakukan test untuk mengakses ke url web.site.kita.com/.well-known dengan membuat sebuah file testing. Misalnya:
# echo "test 123" > /var/www/html/.well-known/test123.txt
# apache2ctl configtest
# service apache2 reload
Apabila setting di atas berjalan ( jangan lupa melakukan reload pada service apache2 ), maka dilakukan ujicoba akses ke url web.site.kita.com/.well-known/test123.txt. Apabila berhasil, bisa dilanjutkan dengan langkah berikutnya.
Agar memudahkan pemeliharaan, SSL certificate hasil generate menggunakan tools acme.sh akan disimpan di folder /etc/apache2/acmesh-ssl/, sehingga dilakukan pembuatan folder-nya.
# mkdir /etc/apache2/acmesh-ssl/
Langkah berikutnya adalah melakukan setting terhadap lokasi SSL certificate-nya pada virtualhost.
<VirtualHost *:443>
SSLEngine on
ServerName web.site.kita.com
ServerAdmin webmaster@web.site.kita.com
ProxyPass / http://localhost:3000/ nocanon
ProxyPassReverse / http://localhost:3000/
LogLevel info ssl:warn
SSLCipherSuite HIGH:!aNULL:!MD5
SSLCertificateFile /etc/apache2/acmesh-ssl/web.site.kita.com-cert.pem
SSLCertificateKeyFile /etc/apache2/acmesh-ssl/web.site.kita.com-key.pem
SSLCertificateChainFile "/etc/apache2/acmesh-ssl/letsencrypt.pem"
ErrorLog /home/log/website/web.site.kita.com/error.log
CustomLog /home/log/website/web.site.kita.com/access.log combined
</VirtualHost>
Setelah semua proses tersebut di atas, jangan lupa melakukan generate SSL menggunakan tool acme.sh dan instalasi ke /etc/apache2/acmesh-ssl sebagaimana yang terdokumentasikan.
# apache2ctl configtest
# service apache2 reload
# acme.sh --issue -d web.site.kita.com -w /var/www/html/
# acme.sh --install-cert -d web.site.kita.com \
> --cert-file /etc/apache2/acmesh-ssl/web.site.kita.com-cert.pem \
> --key-file /etc/apache2/acmesh-ssl/web.site.kita.com-key.pem \
> --fullchain-file /etc/apache2/acmesh-ssl/letsencrypt.pem \
> --reloadcmd "service apache2 reload"
Kemudian dilanjutkan dengan testing menggunakan tool online atau langsung diujicoba melakukan akses ke url utama.
Notes: terkadang membutuhkan restart pada service apache2.
Referensi: