acme-companion 项目使用教程

acme-companion 项目使用教程

acme-companionAutomated ACME SSL certificate generation for nginx-proxy项目地址:https://gitcode.com/gh_mirrors/ac/acme-companion

项目介绍

acme-companion 是一个轻量级的容器,专为 nginx-proxy 设计。它通过 ACME 协议自动处理代理 Docker 容器的 SSL 证书的创建、更新和使用。主要功能包括:

  • 使用 acme.sh 自动创建和更新 Let's Encrypt(或其他 ACME CA)证书。
  • 支持 Let's Encrypt / ACME 域名。

项目快速启动

步骤 1:启动 nginx-proxy

首先,启动 nginx-proxy 容器:

docker run -d -p 80:80 -p 443:443 \
  --name nginx-proxy \
  --volume /path/to/certs:/etc/nginx/certs:ro \
  --volume /etc/nginx/vhost.d \
  --volume /usr/share/nginx/html \
  --volume /var/run/docker.sock:/var/run/docker.sock:ro \
  nginxproxy/nginx-proxy

步骤 2:启动 acme-companion

接着,启动 acme-companion 容器:

docker run -d \
  --name nginx-proxy-acme \
  --volumes-from nginx-proxy \
  --volume /var/run/docker.sock:/var/run/docker.sock:ro \
  --volume acme:/etc/acme.sh \
  --env "DEFAULT_EMAIL=mail@yourdomain.tld" \
  nginxproxy/acme-companion

步骤 3:启动被代理的容器

最后,启动需要被代理的容器,并设置环境变量 VIRTUAL_HOSTLETSENCRYPT_HOST

docker run -d \
  --env "VIRTUAL_HOST=yourdomain.tld" \
  --env "LETSENCRYPT_HOST=yourdomain.tld" \
  your-image

应用案例和最佳实践

应用案例

假设你有一个运行在 Docker 上的 Web 应用,你可以使用 acme-companion 来自动管理其 SSL 证书。例如,你有一个博客应用,通过以下步骤可以实现自动 SSL 证书管理:

  1. 启动 nginx-proxy 和 acme-companion 容器。
  2. 启动博客应用容器,并设置 VIRTUAL_HOSTLETSENCRYPT_HOSTblog.yourdomain.tld

最佳实践

  • 确保 DEFAULT_EMAIL 环境变量设置正确,以便接收证书过期通知。
  • 定期检查日志,确保证书自动更新正常工作。
  • 使用 Docker Compose 来管理多个容器,以便更方便地进行部署和维护。

典型生态项目

acme-companion 通常与以下项目一起使用:

  • nginx-proxy:核心代理服务,负责处理 HTTP/HTTPS 请求。
  • Docker:容器化平台,用于运行和管理所有相关容器。
  • Let's Encrypt:提供免费的 SSL 证书,通过 acme.sh 进行自动化管理。

通过这些项目的协同工作,可以实现高效的容器化应用部署和 SSL 证书管理。

acme-companionAutomated ACME SSL certificate generation for nginx-proxy项目地址:https://gitcode.com/gh_mirrors/ac/acme-companion

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个使用 acme-client-php 库实现 ACME 协议自动签发证书的示例代码: ```php use AcmePhp\Core\AcmeClient; use AcmePhp\Core\Protocol\Challenge; use AcmePhp\Ssl\Certificate; use AcmePhp\Ssl\CertificateRequest; use AcmePhp\Ssl\PrivateKey; use AcmePhp\Ssl\Signer\CertificateRequestSigner; use AcmePhp\Ssl\Signer\DataSigner; use AcmePhp\Ssl\Signer\SignerFactory; use AcmePhp\Ssl\Generator\KeyPairGenerator; use AcmePhp\Ssl\Parser\KeyParser; use AcmePhp\Ssl\Parser\CertificateParser; use AcmePhp\Ssl\Parser\CertificateRequestParser; // ACME 服务端的 API 地址 $serverUrl = 'https://acme-v02.api.letsencrypt.org/directory'; // 要签发证书的域名列表 $domains = ['example.com', 'www.example.com']; // 创建一个用于存储证书和私钥的目录 $storagePath = '/path/to/storage'; if (!file_exists($storagePath)) { mkdir($storagePath, 0777, true); } // 创建一个私钥 $keyPairGenerator = new KeyPairGenerator(); $privateKey = $keyPairGenerator->generatePrivateKey(); // 创建 ACME 客户端 $acmeClient = new AcmeClient($serverUrl, $privateKey, $storagePath); // 获取 ACME 服务端提供的签发证书所需的验证数据 $authorizationChallenges = $acmeClient->requestAuthorizationChallenges($domains); // 在域名的 DNS 记录中添加验证数据 foreach ($authorizationChallenges as $authorizationChallenge) { if ($authorizationChallenge->getType() === Challenge::TYPE_DNS) { $dnsRecordName = '_acme-challenge.' . $authorizationChallenge->getDomain(); $dnsRecordValue = $authorizationChallenge->getPayload(); // TODO: 将 $dnsRecordName 和 $dnsRecordValue 写入 DNS 记录 } } // 等待 DNS 记录生效 sleep(30); // 向 ACME 服务端验证验证数据 $acmeClient->verifyAuthorizationChallenges($authorizationChallenges); // 生成证书请求文件 $certificateRequest = new CertificateRequest($domains, $privateKey); $certificateRequestSigner = new CertificateRequestSigner(new DataSigner(SignerFactory::create()), new KeyParser()); $certificateRequestPem = $certificateRequestSigner->sign($certificateRequest)->getPEM(); // 向 ACME 服务端申请证书 $certificatePem = $acmeClient->requestCertificate($certificateRequestPem); // 解析证书和私钥 $certificateParser = new CertificateParser(); $certificate = $certificateParser->parse($certificatePem); $privateKeyParser = new KeyParser(); $privateKey = $privateKeyParser->parse($privateKey->toPem()); // 将证书和私钥保存到文件中 $certificatePath = $storagePath . '/certificate.pem'; $privateKeyPath = $storagePath . '/private-key.pem'; file_put_contents($certificatePath, $certificate->toPem()); file_put_contents($privateKeyPath, $privateKey->toPem()); // 打印证书信息 print('Certificate:\n'); print($certificate->toPem()); print("\n"); // 打印私钥信息 print('Private key:\n'); print($privateKey->toPem()); print("\n"); ``` 注意,这只是一个示例代码,需要根据自己的实际情况进行修改。特别是 DNS 记录的操作需要根据自己的 DNS 服务商进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邬筱杉Lewis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值