A standard for webservers that's just right.
Go to file
AJ ONeal ed47fb80b5 specifying insecurePort 2016-10-27 02:44:14 -06:00
bin specifying insecurePort 2016-10-27 02:44:14 -06:00
lib load oauth3 device by devicename 2016-10-19 14:09:10 -06:00
stages update redirect 2016-10-07 11:23:43 -06:00
.gitignore Initial commit 2015-06-24 14:38:30 -06:00
LICENSE Initial commit 2015-06-24 14:38:30 -06:00
README.md add options 2016-10-17 17:52:32 -06:00
package.json v2.0.4 2016-10-26 22:41:32 -06:00
test-chain.sh custom https certs, http-to-https redirects 2015-07-08 00:43:46 -06:00

README.md

serve-https

A simple HTTPS static file server with valid TLS (SSL) certs.

Comes bundled a valid certificate for localhost.daplie.com, which is great for testing and development, and you can specify your own.

Also great for testing ACME certs from letsencrypt.org.

Install

npm install --global serve-https
serve-https
Serving /Users/foo/ at https://localhost.daplie.com:8443

Usage

Examples:

node serve.js --servername jane.daplie.me --agree-tos --email jane@example.com --tunnel

Options:

  • -p <port> - i.e. sudo serve-https -p 443 (defaults to 80+443 or 8443)

  • -d <dirpath> - i.e. serve-https -d /tmp/ (defaults to pwd)

  • -c <content> - i.e. server-https -c 'Hello, World! ' (defaults to directory index)

  • --express-app <path> - path to a file the exports an express-style app (function (req, res, next) { ... })

  • --livereload - inject livereload into all html pages (see also: fswatch), but be careful if <dirpath> has thousands of files it will spike your CPU usage to 100%

  • --email <email> - email to use for Let's Encrypt, Daplie DNS, Daplie Tunnel

  • --agree-tos - agree to terms for Let's Encrypt, Daplie DNS

  • --servername <servername> - use <servername> instead of localhost.daplie.com

  • --tunnel - make world-visible (must use --servername)

Specifying a custom HTTPS certificate:

  • --key /path/to/privkey.pem specifies the server private key
  • --cert /path/to/fullchain.pem specifies the bundle of server certificate and all intermediate certificates
  • --root /path/to/root.pem specifies the certificate authority(ies)

Note: --root may specify single cert or a bundle, and may be used multiple times like so:

--root /path/to/primary-root.pem --root /path/to/cross-root.pem

Other options:

  • --serve-root true alias for -c with the contents of root.pem
  • --servername example.com changes the servername logged to the console
  • --letsencrypt-certs example.com sets and key, fullchain, and root to standard letsencrypt locations

Examples

serve-https -p 1443 -c 'Hello from 1443' &
serve-https -p 2443 -c 'Hello from 2443' &
serve-https -p 3443 -d /tmp &

curl https://localhost.daplie.com:1443
> Hello from 1443

curl --insecure https://localhost:2443
> Hello from 2443

curl https://localhost.daplie.com:3443
> [html index listing of /tmp]

And if you tested http://localhost.daplie.com:3443 in a browser, it would redirect to https://localhost.daplie.com:3443 (on the same port).

(in curl it would just show an error message)

Testing ACME Let's Encrypt certs

In case you didn't know, you can get free https certificates from letsencrypt.org (ACME letsencrypt) and even a free subdomain from https://freedns.afraid.org.

If you want to quickly test the certificates you installed, you can do so like this:

sudo serve-https -p 8443 \
  --letsencrypt-certs test.mooo.com \
  --serve-root true

which is equilavent to

sudo serve-https -p 8443 \
  --servername test.mooo.com
  --key /etc/letsencrypt/live/test.mooo.com/privkey.pem \
  --cert /etc/letsencrypt/live/test.mooo.com/fullchain.pem \
  --root /etc/letsencrypt/live/test.mooo.com/root.pem \
  -c "$(cat 'sudo /etc/letsencrypt/live/test.mooo.com/root.pem')"

and can be tested like so

curl --insecure https://test.mooo.com:8443 > ./root.pem
curl https://test.mooo.com:8843 --cacert ./root.pem