markdown 使用Traefik设置Let的加密证书

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 使用Traefik设置Let的加密证书相关的知识,希望对你有一定的参考价值。

# Setup a Let’s Encrypt certificate with Traefik

In this post, i will explain you how to setup your first Let’s Encrypt certificate with Traefik. You need to know a little about Traefik. You can read my first post about [it](https://blog.raveland.org/post/traefik_beginner/).

## Basic setup

For this test, you need to have a machine with port 80 and 443 reachable from the internet.

For the curious, you can find more informations about Let’s Encrypt [here](https://en.wikipedia.org/wiki/Let%27s_Encrypt).

Now launch traefik:

```bash
docker run --rm --name traefik --network test --publish 80:80 --publish 443:443 --publish 8080:8080 \
       -v /var/run/docker.sock:/var/run/docker.sock \
       traefik:1.6-alpine \
       --entryPoints="Name:http Address::80" \
       --entryPoints="Name:https Address::443 TLS"  \
       --api --docker --docker.endpoint="unix:///var/run/docker.sock" --loglevel=debug \
       --acme=true --acme.entrypoint=https --acme.httpchallenge --acme.httpchallenge.entrypoint=http \
       --acme.domains="xxx.raveland.org" --acme.email="xxx@raveland.org" --acme.storage=/tmp/acme.json

```

I will now explain the new options used here :

*   entryPoints=“Name:https Address::443 TLS” : define a new entrypoint listening on port 443 and with TLS activated
*   acme=true : enable Let’s Encrypt
*   acme.entrypoint=https : Entrypoint to proxy acme challenge to
*   acme.httpchallenge : enable the HTTP\-01 challenge for Let’s Encrypt
*   acme.httpchallenge.entrypoint=http : the HTTP\-01 challenge entrypoint
*   acme.domains=“xxx.raveland.org” : the FQDN you want to protect with SSL
*   acme.email=“xxx@raveland.org” : email address used for registration
*   acme.storage=/tmp/acme.json : file used for certificates storage

**WARNING** : i will explain why you will need to change *acme.storage* later.

Wait a few seconds and you should see something like this in the logs:

```bash
time="2018-05-23T08:59:29Z" level=debug msg="Building ACME client..."
time="2018-05-23T08:59:29Z" level=debug msg="https://acme-v02.api.letsencrypt.org/directory"
time="2018-05-23T08:59:29Z" level=info msg=Register...
time="2018-05-23T08:59:32Z" level=debug msg="Using HTTP Challenge provider."
time="2018-05-23T08:59:33Z" level=debug msg="Unable to split host and port: address xxx.raveland.org: missing port in address. Fallback to request host."
time="2018-05-23T08:59:33Z" level=debug msg="Looking for an existing ACME challenge for token e-d4CY0MHvtZkZT0VSR7DSEF-Kz2bgrXmBGEneTFjJY0..."
time="2018-05-23T08:59:38Z" level=debug msg="Challenge CleanUp for domain xxx.raveland.org"
time="2018-05-23T09:00:18Z" level=debug msg="Certificates obtained for domains [xxx.raveland.org]"
time="2018-05-23T09:00:18Z" level=debug msg="Configuration received from provider ACME: ....

```

Now your certifcate is generated and you can access the URL with https.

## Tune your traefik setup

The main disadvantage of the first setup is the *acme.storage*. If the certificate is stored on the container itself, you will have to regenerate it each time the container will restart.

It’s best to store it (them) on a docker volume and to mount this volume on the container.

Here are the small optimizations we can do :

*   *entryPoints=“Name:http Address::80 Redirect.EntryPoint:https”* : It’s not necessary but with this change all the http trafic will be redirected to https
*   *\-v ${PWD}/certs:/etc/traefik\-certs* : we will mount ${PWD}/certs to the traefik container in ‘/etc/traefik\-certs’
*   *acme.storage=/etc/traefik\-certs/acme.json* : now we tell traefik to store the certificate in the file ‘/etc/traefik\-certs/acme.json’ (on the container). But this directory is a docker volume

### Hardening the configuration (by frontend)

By default, we will obtain a grade A with Traefik on [SSL Labs](https://www.ssllabs.com/ssltest/). We can obtain a grade A+ by adding more options.

These options are setup by frontend :

```bash
docker run --rm --network test --label traefik.backend=nginx1 --label traefik.port=80 \
           --label traefik.frontend.rule="Host:xxx.raveland.org" \
           --label traefik.frontend.entryPoints=https \
           --label traefik.frontend.headers.forceSTSHeader=true \
           --label traefik.frontend.headers.STSSeconds=315360000 \
           --label traefik.frontend.headers.STSIncludeSubdomains=true \
           --label traefik.frontend.headers.STSPreload=true \
           nginx:latest

```

The explanations :

*   traefik.frontend.headers.forceSTSHeader=true : adds the STS header to non\-SSL requests
*   traefik.frontend.headers.STSSeconds : sets the max\-age of the STS header
*   traefik.frontend.headers.STSIncludeSubdomains=true : adds the IncludeSubdomains section of the STS header.
*   traefik.frontend.headers.STSPreload=true : adds the preload flag to the STS header

You can find more informations about *HTTP Strict Transport Security* [here](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security)

Enjoy

以上是关于markdown 使用Traefik设置Let的加密证书的主要内容,如果未能解决你的问题,请参考以下文章

markdown 开源的反向代理与负载均衡工具Traefik

是否可以使用 Traefik 通过 SSL 代理 PostgreSQL?

如何使用 OAuth2 身份验证设置 traefik

Traefik 坏网关

traefik代理背后的Gitlab“网关超时”

使用 Eureka 和 traefik 和 docker compose 的微服务服务发现