Let's Encrypt Without Port 80
=============================

If you're an regular reader of this
irregular phlog, you'll know that my
VPS hosting company discontinued its
OpenVZ service a few days ago, which
disrupted the circumlunar.space
XMPP service that I host, and left
me scrambling to find a new VPS.
One of my self-imposed conditions was
to find a VPS outside the United
States. I would have preferred a
server in Canada (like the old one),
but could not find one at a reasonable
price. The new one is in Germany.

My absolutely favoured solution would
have been to host the XMPP service
from home, on the raspberry pi zero w
that hosts my personal gopher site.
But that seemed near impossible. My
ISP blocks port 80 and a host of
others. Without port 80, obtaining a
Let's Encrypt certificate was a
challenge. I need the certificate to
secure the XMPP tx/rx, and also wanted
it so that I could host webdav /
caldav / cardav in the future. This
could be done with a self-signed
certificate, but getting the
certificate out to a number of people
(and having them all install it)
seemed too awkward.

After getting the new server set up, I
learned that my ISP does not block
port 443 (which is used for secure
http connections). That led me to
acme.sh[1], which provides a means to
obtain a Let's Encrypt certificate
over port 443. The remainder of this
phlog entry is in the nature of some
"how-to" notes, so that I don't forget
how to do this in the future, when I
will move the XMPP server to the
raspberry pi. Since many of you
self-host, I thought it would be great
information to share.

This all applies to a server running
Debian 9 (actually, Raspbian in my
case). I should also add that while
this setup will work well for my
purposes (dav and XMPP), it is not a
great method for serving web pages,
since there's no way (that I know of
yet) to force https, given that port
80 is blocked so the regular methods
of pushing a visitor from http to
https don't work. That means that
visitors have to enter
https://yourwebsite.com in order to
see it. Entering either
http://yourwebsite.com or
yourwebsite.com will lead them to a
dead end.


Certificates
============

acme.sh installation: various methods
are described on the official github
README.md. I used the following
method, though I know many people
cringe at the curl/sh combination:

curl https://get.acme.sh | sh

acme.sh will tell you to install a
couple of other pieces of software
that it needs to work. Make a note of
them and do it before proceeding to
the next step.

To install the certificates and make
it so that they will work with the
lighttpd web server, I cobbled
together the following script from
various sources on the internet:



#!/bin/bash

/root/.acme.sh/acme.sh --issue -d yourserver.com --alpn --force \
--cert-file      /path/to/your/server/yourserver.com/cert.pem  \
--key-file       /path/to/your/server/yourserver.com/privkey.pem  \
--fullchain-file /path/to/your/server/yourserver.com/fullchain.crt \
--capath         /path/to/your/server/yourserver.com/chain.pem

cat /path/to/your/server/yourserver.com/privkey.pem /path/to/your/server/yourserver.com/cert.pem > /path/to/your/server/yourserver.com/merged.pem



The path is simply a path to wherever
you want to store your certificates. A
typical choice would be:
/etc/letsencrypt/yourserver.com/

You can omit the --force switch if you
like. I included it in case I need to
use the script to renew in the future.

Set the permissions on those
directories (/etc/letsencrypt/ and
/etc/letsencrypt/yourserver/) in the
manner described in step 3 of this
guide:
https://www.vultr.com/docs/setup-let-s-encrypt-with-lighttpd-on-ubuntu-16-04

The final 'cat' line is lighttpd
specific, to produce the  merged
certificate lighttpd needs. I also
included instructions to acme.sh to
install all of the certificates I
thought that I might possibly need in
the future.

When you run acme.sh, it will set up a
cron job for renewal. I don't know if
it will work properly. I doubt it,
because it needs the webserver shut
down in order to work.

As noted, I want to set up various dav
servers and XMPP.


DAV Setup
=========

For the dav portion, I am using
lighttpd.

Lighttpd Setup Notes:

Lighttpd with SSL Guide:
https://www.vultr.com/docs/setup-let-s-encrypt-with-lighttpd-on-ubuntu-16-04

You won't need steps one and two.
Adapt steps three through five to your
purpose.

Lighttpd Webdav Guide:
https://www.howtoforge.com/tutorial/how-to-install-webdav-with-lighttpd-on-debian-jessie/


XMPP Setup
==========

Prosody (XMPP) Setup:

Use the official documentation.
https://prosody.im/doc

Prosody is one of the best-documented
pieces of open source software that I
have come across.


[1] https://github.com/acmesh-official/acme.sh