@@ -3,183 +3,45 @@
3 3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
One of the [many ways](./ssl.wiki) to provide TLS-encrypted HTTP access
4 4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(a.k.a. HTTPS) to Fossil is to run it behind a web proxy that supports
5 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TLS. This document explains how to use the powerful [nginx web
6 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
server](http://nginx.org/) to do that.
7 7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ## Benefits
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- This scheme is complicated, even with the benefit of this guide and
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pre-built binary packages. Why should you put up with this complexity?
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Because it gives many benefits that are difficult or impossible to get
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- with the less complicated options:
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * **Power** — nginx is one of the most powerful web servers in the
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- world. The chance that you will run into a web serving wall that you
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- can’t scale with nginx is very low.
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To give you some idea of the sort of thing you can readily
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- accomplish with nginx, your author runs a single public web server
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that provides transparent name-based virtual hosting for four
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- separate domains:
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * One is entirely static, not involving any dynamic content or
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil integration at all.
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * Another is served almost entirely by Fossil, with a few select
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static content exceptions punched past Fossil, which are handled
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- entirely via nginx.
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * The other two domains are aliases for one another — e.g.
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `example.com` and `example.net` — with most of the content being
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static. This pair of domains has three different Fossil repo
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proxies attached to various sections of the URI hierarchy.
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- All of this is done with minimal configuration repetition between
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the site configurations.
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * **Integration** — Because nginx is so popular, it integrates with
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- many different technologies, and many other systems integrate with it in
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- turn. This makes it great middleware, sitting between the outer web
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- world and interior site services like Fossil. It allows Fossil to
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- participate seamlessly as part of a larger web stack.
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * **Availability** — nginx is already in most operating system binary
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- package repositories, so you don’t need to go out of your way to get it.
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ## Fossil Remote Access Methods
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil provides four major ways to access a repository it’s serving
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- remotely, three of which are straightforward to use with nginx:
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * **HTTP** — Fossil has a built-in HTTP server: `fossil server`.
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- While this method is efficient and it’s possible to use nginx to
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proxy access to another HTTP server, this option is overkill for our
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- purposes. nginx is itself a fully featured HTTP server, so we will
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- choose in this guide not to make nginx reinterpret Fossil’s
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- implementation of HTTP.
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * **CGI** — This method is simple but inefficient, because it launches
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a separate Fossil instance on every HTTP hit.
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Since Fossil is a relatively small self-contained program, and it’s
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- designed to start up quickly, this method can work well in a
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- surprisingly large number of cases.
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Nevertheless, we will avoid this option in this document because
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- we’re already buying into a certain amount of complexity here in
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- order to gain power. There’s no sense in throwing away any of that
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- hard-won performance on CGI overhead.
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * **SCGI** — The [SCGI protocol][scgi] provides the simplicity of CGI
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- without its performance problems.
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * **SSH** — This method exists primarily to avoid the need for HTTPS
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in the first place. There is probably a way to get nginx to proxy
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil to HTTPS via SSH, but it would be pointlessly complicated.
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SCGI it is, then.
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Installing
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The first step is to install the pieces we’ll be working with. This
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- varies on different operating systems, so to avoid overcomplicating this
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- guide, we’re going to assume you’re using Ubuntu Server 18.04 LTS, a
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- common Tier 1 offering for [virtual private servers][vps].
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SSH into your server, then say:
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $ sudo apt install certbot fossil nginx
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- For other operating systems, simply visit [the front Certbot web
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- page][cb] and tell it what OS and web stack you’re using. Chances are
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- good that they’ve got a good guide for you already.
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Running Fossil in SCGI Mode
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- You presumably already have a working Fossil configuration on the public
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- server you’re trying to set up and are just following this guide to
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- replace HTTP service with HTTPS.
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (You can adjust the advice in this guide to get both HTTP *and* HTTPS
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- service on the same site, but I strongly recommend that you do not do
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that: the good excuses remaining for continuing to allow HTTP on public
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- web servers are running thin these days.)
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- I run my Fossil SCGI server instances with a variant of [the `fslsrv`
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- shell script](/file/tools/fslsrv) currently hosted in the Fossil source
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- code repository. You’ll want to download that and make a copy of it, so
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- you can customize it to your particular needs.
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- This script allows running multiple Fossil SCGI servers, one per
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repository, each bound to a different high-numbered `localhost` port, so
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that only nginx can see and proxy them out to the public. The
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- “`example`” repo is on TCP port localhost:12345, and the “`foo`” repo is
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- on localhost:12346.
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- As written, the `fslsrv` script expects repositories to be stored in the
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- calling user’s home directory under `~/museum`, because where else do
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- you keep Fossils?
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- That home directory also needs to have a directory to hold log files,
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `~/log/fossil/*.log`. Fossil doesn’t put out much logging, but when it
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- does, it’s better to have it captured than to need to re-create the
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- problem after the fact.
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The use of `--baseurl` in this script lets us have each Fossil
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repository mounted in a different location in the URL scheme. Here, for
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- example, we’re saying that the “`example`” repository is hosted under
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the `/code` URI on its domains, but that the “`foo`” repo is hosted at
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the top level of its domain. You’ll want to do something like the
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- former for a Fossil repo that’s just one piece of a larger site, but the
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- latter for a repo that is basically the whole point of the site.
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- You might also want another script to automate the update, build, and
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- deployment steps for new Fossil versions:
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #!/bin/sh
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cd $HOME/src/fossil/trunk
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil up
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- make -j11
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- killall fossil
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sudo make install
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fslsrv
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The `killall fossil` step is needed only on OSes that refuse to let you
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- replace a running binary on disk.
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- As written, the `fslsrv` script assumes a Linux environment. It expects
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `/bin/bash` to exist, and it depends on non-POSIX tools like `pgrep`.
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- It should not be difficult to port to systems like macOS or the BSDs.
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This document is an extension of the [Serving via nginx on Debian][nod]
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document. Please read that first, then come back here to extend its
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configuration with TLS.
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [nod]: ./server/debian/nginx.md
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Install Certbot
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The [nginx-on-Debian document][nod] had you install a few non-default
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ packages to the system, but there’s one more you need for this guide:
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ sudo apt install certbot
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You can extend this guide to other operating systems by following the
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ instructions found via [the front Certbot web page][cb] instead, telling
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it what OS and web stack you’re using. Chances are good that they’ve got
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a good guide for you already.
156 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
157 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
158 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Configuring Let’s Encrypt, the Easy Way
159 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
160 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
If your web serving needs are simple, [Certbot][cb] can configure nginx
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for you and keep its certificates up to date. You can follow the Certbot
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- documentation for [nginx on Ubuntu 18.04 LTS guide][cbnu] as-is, though
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- we’d recommend one small change: to use the version of Certbot in the
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Ubuntu package repository rather than the first-party Certbot package
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that the guide recommends.
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The primary local configuration you need is to tell nginx how to proxy
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- certain URLs down to the Fossil instance you started above with the
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `fslsrv` script:
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- location / {
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- include scgi_params;
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- scgi_pass 127.0.0.1:12345;
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- scgi_param HTTPS "on";
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- scgi_param SCRIPT_NAME "";
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The TCP port number in that snippet is the key: it has to match the port
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- number generated by `fslsrv` from the base port number passed to the
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `start_one` function.
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for you and keep its certificates up to date. Simply follow Certbot’s
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [nginx on Ubuntu 18.04 LTS guide][cbnu]. We’d recommend one small
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ change: to use the version of Certbot in the Ubuntu package repository
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rather than download it from the Certbot site.
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You should be able to use the nginx configuration given in our [Serving
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ via nginx on Debian][nod] guide with little to no change. The main thing
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to watch out for is that the TCP port number in the nginx configuration
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ needs to match the value you gave when starting Fossil. If you followed
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that guide’s advice, it will be 9000. Another option is to use [the
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `fslsrv` script](/file/tools/fslsrv), in which case the TCP port number
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ will be 12345 or higher.
181 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
182 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
183 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Configuring Let’s Encrypt, the Hard Way
184 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
185 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
If you’re finding that you can’t get certificates to be issued or
@@ -193,11 +55,12 @@
193 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Environment][acme] protocol (ACME) to determine whether a given client
194 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
actually has control over the domain(s) for which it wants a certificate
195 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
minted. Let’s Encrypt will not blithely let you mint certificates for
196 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
`google.com` and `paypal.com` just because you ask for it!
197 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Your author’s configuration, glossed above, is complicated enough that
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Your author’s configuration, glossed [in the HTTP-only guide][nod],
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is complicated enough that
199 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the current version of Certbot (0.28 at the time of this writing) can’t
200 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cope with it. That’s the primary motivation for me to write this guide:
201 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
I’m addressing the “me” years hence who needs to upgrade to Ubuntu 20.04
202 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
or 22.04 LTS and has forgotten all of this stuff. 😉
203 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -216,24 +79,12 @@
216 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
entirely.
217 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
218 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
219 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Step 2: Configuring nginx
220 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- On Ubuntu systems, at least, the primary user-level configuration file
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is `/etc/nginx/sites-enabled/default`. For a configuration like I
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- described at the top of this article, I recommend that this file contain
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- only a list of include statements, one for each site that server hosts:
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- include local/example
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- include local/foo
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Those files then each define one domain’s configuration. Here,
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `/etc/nginx/local/example` contains the configuration for
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `*.example.com` and `*.example.net`; and `local/foo` contains the
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- configuration for `*.foo.net`.
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Here’s an example configuration:
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This is a straightforward extension to [the HTTP-only
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configuration](./server/debian/nginx.md#config):
235 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
236 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
server {
237 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
server_name .foo.net;
238 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
239 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
include local/tls-common;
@@ -268,12 +119,13 @@
268 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
include local/http-certbot-only;
269 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
access_log /var/log/nginx/foo.net-http-access.log;
270 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
error_log /var/log/nginx/foo.net-http-error.log;
271 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
272 123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Notice that we need two `server { }` blocks: one for HTTPS service, and
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- one for HTTP-only service:
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ One big difference between this and the HTTP-only case is
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that we need two `server { }` blocks: one for HTTPS service, and
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ one for HTTP-only service.
275 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
276 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
277 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
### HTTP over TLS (HTTPS) Service
278 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
279 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
The first `server { }` block includes this file, `local/tls-common`:
@@ -385,43 +237,17 @@
385 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Force everything else to HTTPS with a permanent redirect.
386 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#return 301 https://$host$request_uri;
387 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
388 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
As written above, this configuration does nothing other than to tell
389 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nginx that it’s allowed to serve content via HTTP on port 80 as well.
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
391 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
We’ll uncomment the `rewrite` and `return` directives below, when we’re
392 243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ready to begin testing.
393 244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #### Why the Repetition?
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- These `server { }` blocks contain several directives that have to be
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- either completely repeated or copied with only trivial changes when
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- you’re hosting multiple domains from a single server.
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- You might then wonder, why haven’t I factored some of those directives
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- into the included files `local/tls-common` and
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `local/http-certbot-only`? Why can’t the HTTP-only `server { }` block
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- above be just two lines? That is, why can I not say:
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- server_name .foo.net;
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- include local/http-certbot-only;
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Then in `local/http-certbot-only` say:
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- root /var/www/$host;
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- access_log /var/log/nginx/$host-http-access.log;
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- error_log /var/log/nginx/$host-http-error.log;
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Sadly, nginx doesn’t allow variable substitution into these particular
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- directives. As I understand it, allowing that would make nginx slower,
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- so we must largely repeat these directives in each HTTP `server { }`
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- block.
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- These configurations are, as shown, as small as I know how to get them.
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If you know of a way to reduce some of this repetition, [I solicit your
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- advice][fd].
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Notice that this configuration is very different from that in the
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [HTTP-only nginx on Debian][nod] guide. Most of that guide’s nginx
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ directives moved up into the TLS `server { }` block, because we
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eventually want this site to be as close to HTTPS-only as we can get it.
423 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
424 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
425 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Step 3: Dry Run
426 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
427 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
We want to first request a dry run, because Let’s Encrypt puts some
@@ -541,29 +367,19 @@
541 367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
it would actually [cause an infinite redirect loop if
542 368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enabled](./ssl.wiki#rloop).
543 369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
544 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
545 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ## Step 6: Re-Sync Your Repositories
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Step 6: Re-Point Fossil at Your Repositories
547 373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Now that the repositories hosted by this server are available via HTTPS,
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- you need to tell Fossil about it:
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ As of Fossil 2.9, the permanent HTTP-to-HTTPS redirect we enabled above
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ causes Fossil to remember the new URL automatically the first time it’s
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ redirected to it. All you need to do to switch your syncs to HTTPS is:
550 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
551 378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
$ cd ~/path/to/checkout
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- $ fossil sync https://example.com/code
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Once that’s done per repository file, all checkouts of that repo will
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- from that point on use the HTTPS URI to sync.
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- You might wonder if that’s necessary, since we have the automatic
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- HTTP-to-HTTPS redirect on this site now. If you clone or sync one of
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- these nginx-hosted Fossil repositories over an untrustworthy network
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that allows [MITM attacks][mitm], that redirect won’t protect you from a
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sufficiently capable and motivated attacker unless you’ve also gone
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ahead and [enabled HSTS](#hsts). You can put off the need to enable
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- HSTS by explicitly using HTTPS URIs.
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil sync
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
565 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
566 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Step 7: Renewing Automatically
567 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
568 384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Now that the configuration is solid, you can renew the LE cert with the
569 385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
`certbot` command from above without the `--dry-run` flag plus a restart
@@ -588,27 +404,21 @@
588 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-----------
589 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
590 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<a id=”evolution”></a>
591 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**Document Evolution**
592 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- TLS and web proxying are a constantly evolving technology. This article
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- replaces my [earlier effort][2016], which had whole sections that were
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- basically obsolete within about a year of posting it. Two years on, and
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- I was encouraging readers to ignore about half of that HOWTO. I am now
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- writing this document about 3 years later because Let’s Encrypt
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- deprecated key technology that HOWTO depended on, to the point that
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- following that old HOWTO is more likely to confuse than enlighten.
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Large parts of this article have been rewritten several times now due to
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shifting technology in the TLS and proxying spheres.
600 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
601 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
There is no particularly good reason to expect that this sort of thing
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- will not continue to happen, so this effort is expected to be a living
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ will not continue to happen, so we consider this to be a living
603 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document. If you do not have commit access on the `fossil-scm.org`
604 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
repository to update this document as the world changes around it, you
605 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
can discuss this document [on the forum][fd]. This document’s author
606 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
keeps an eye on the forum and expects to keep this document updated with
607 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ideas that appear in that thread.
608 419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [2016]: https://www.mail-archive.com/[email protected] /msg22907.html
610 420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[acme]: https://en.wikipedia.org/wiki/Automated_Certificate_Management_Environment
611 421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[cb]: https://certbot.eff.org/
612 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[cbnu]: https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx
613 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[fd]: https://fossil-scm.org/forum/forumpost/ae6a4ee157
614 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[hsts]: https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
@@ -616,7 +426,5 @@
616 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[mitm]: https://en.wikipedia.org/wiki/Man-in-the-middle_attack
617 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[nest]: https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/
618 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[ocsp]: https://en.wikipedia.org/wiki/OCSP_stapling
619 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[qslc]: https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices
620 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[qslt]: https://www.ssllabs.com/ssltest/
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [scgi]: https://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [vps]: https://en.wikipedia.org/wiki/Virtual_private_server
623 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!