Let's Encrypt SSL证书申请
当前环境:
- 阿里云CoreOS
- 所绑定的域名,解析管理也在阿里这儿,在该文档中使用
example.com
作为示例。 - Docker 镜像
acme.sh:2.8.8
- nginx 申请证书并使用
- 使用Docker-Compose
- SSL证书为泛域名证书
实际应用中可以参考下面两篇文章:
- 2. Deploy certs from a container to another container 第二部分
- DNS API 参考这部分
11. Use Aliyun domain API to automatically issue cert
acme.sh
dns模式支持Cloudflare
,DNSPod.cn
,CloudXNS.com
,GoDaddy.com
,Amazon Route53
,Aliyun
,Linode
,FreeDNS
,DigitalOcean
等大概一百多个域名解析提供商,本文使用的是阿里云域名解析,申请SSL的时候会往域名解析力添加一条TXT记录来验证域名所有权。
目的:
- 在阿里云CoreOS操作环境中绑定 Let's Encrypt SSL证书并使用。(不是很清楚使用这种方式能否实现证书自动续费,证书是3个月有效期,也许3个月之后就可以知道了。)
下载所需镜像
个人习惯喜欢先把所需要的镜像给下载下来,不喜欢用latest标签,因为觉得如果新版本有功能更新的话,会让人迷糊。
Docker-Compose的安装略过。
$ sudo docker pull nginx:1.19.6-alpine
$ sudo docker pull neilpang/acme.sh:2.8.8
创建docker-compose.yml
文件
version: '3'
services:
runNginx:
image: nginx:1.19.6-alpine
container_name: runNginx
volumes:
- /data/docker_config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- /data/docker_config/nginx/ssl:/etc/nginx/ssl
ports:
- 80:80
- 443:443
depends_on:
- runAcmesh
environment:
- NGINX_PORT=80
labels:
- sh.acme.autoload.domain=example.com
runAcmesh:
image: neilpang/acme.sh:2.8.8
container_name: runAcmesh_example.com
command: daemon
volumes:
- /data/docker_config/acme.sh:/acme.sh
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload.domain=example.com
- DEPLOY_DOCKER_CONTAINER_KEY_FILE="/etc/nginx/ssl/example.com/key.pem"
- DEPLOY_DOCKER_CONTAINER_CERT_FILE="/etc/nginx/ssl/example.com/cert.pem"
- DEPLOY_DOCKER_CONTAINER_CA_FILE="/etc/nginx/ssl/example.com/ca.pem"
- DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/etc/nginx/ssl/example.com/full.pem"
- DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="service nginx force-reload"
修改 /data/docker_config/nginx/nginx.conf
启用 ssl, Configuring HTTPS servers
# HTTPS server
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com/cert.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;;
location / {
root html;
index index.html index.htm;
}
}
启动 docker-compose
进入dockerr-compose.yml
所在的目录启动容器 sudo docker-compose up -d
没猜错的话启动结果应该是nginx启动失败,acme.sh启动成功,启动失败无所谓,部署完SSL证书以后会进行一次重启。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64879a113906 nginx:1.19.6-alpine "/docker-entrypoint.…" About an hour ago Exited ... 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp runNginx
bfa2973c990a neilpang/acme.sh:2.8.8 "/entry.sh daemon" About an hour ago Up About an hour runAcmesh_guorenjun.com.cn
申请证书
第一步需要获取你的阿里云 API Key, 既API KEY
和API Security
,官方推荐使用子账户来申请,但是不确定需要赋值哪个权限,总是提示Invalid Domain,用了Root的API Key一次申请通过,看了一下权限列表好像是这个AliyunDNSFullAccess 管理云解析(DNS)的权限
。阿里云APIKEY管理页面在这里:https://ak-console.aliyun.com/#/accesskey
获取API KEY之后,执行如下命令:
sudo docker exec -e Ali_Key="iAihASlUDxxxxxxx" -e Ali_Secret="FaYpsThfLRbQ99UaHWvvibqxxxxxxx" runAcmesh_example.com --issue --dns dns_ali -d *.example.com
Ali_Key
和 Ali_Secret
就是获取的阿里云访问权限的KEY, runAcmesh_example.com
是已运行的容器名字,也可以用容器ID来代替, *.example.com
要申请的域名,这个是泛域名,如果不想申请泛域名,只想申请 www.example.com
和 example.com
的话,可以指定多个 -d
参数,例如 -d www.example.com -d example.com -d test.example.com
不过好像每次申请的SSL证书有域名大小限制。
如果顺利的话输出内容如下:
[Sat Jan 9 08:20:20 UTC 2021] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Sat Jan 9 08:20:20 UTC 2021] Creating domain key
[Sat Jan 9 08:20:20 UTC 2021] The domain key is here: /acme.sh/*.example.com/*.example.com.key
[Sat Jan 9 08:20:20 UTC 2021] Single domain='*.example.com'
[Sat Jan 9 08:20:20 UTC 2021] Getting domain auth token for each domain
[Sat Jan 9 08:20:27 UTC 2021] Getting webroot for domain='*.example.com'
[Sat Jan 9 08:20:27 UTC 2021] Adding txt value: ToXXnzTdkmwb6Yqn85bl01MzbdrgVCpITb0U7_cB4nI for domain: _acme-challenge.example.com
[Sat Jan 9 08:20:28 UTC 2021] The txt record is added: Success.
[Sat Jan 9 08:20:28 UTC 2021] Let's check each DNS record now. Sleep 20 seconds first.
[Sat Jan 9 08:20:48 UTC 2021] Checking example.com for _acme-challenge.example.com
[Sat Jan 9 08:20:52 UTC 2021] Domain guorenjun.com.cn '_acme-challenge.example.com' success.
[Sat Jan 9 08:20:52 UTC 2021] All success, let's return
[Sat Jan 9 08:20:52 UTC 2021] Verifying: *.example.com
[Sat Jan 9 08:20:57 UTC 2021] Success
[Sat Jan 9 08:20:57 UTC 2021] Removing DNS records.
[Sat Jan 9 08:20:57 UTC 2021] Removing txt: ToXXnzTdkmwb6Yqn85bl01MzbdrgVCpITb0U7_cB4nI for domain: _acme-challenge.example.com
[Sat Jan 9 08:20:59 UTC 2021] Removed: Success
[Sat Jan 9 08:20:59 UTC 2021] Verify finished, start to sign.
[Sat Jan 9 08:20:59 UTC 2021] Lets finalize the order.
[Sat Jan 9 08:20:59 UTC 2021] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/108848397/721xxxxxxx'
[Sat Jan 9 08:21:01 UTC 2021] Downloading cert.
[Sat Jan 9 08:21:01 UTC 2021] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/0335cdb097496f91f09c53ea7af14xxxxxxx'
[Sat Jan 9 08:21:03 UTC 2021] Cert success.
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
[Sat Jan 9 08:21:03 UTC 2021] Your cert is in /acme.sh/*.example.com/*.example.com.cer
[Sat Jan 9 08:21:03 UTC 2021] Your cert key is in /acme.sh/*.example.com/*.example.com.key
[Sat Jan 9 08:21:03 UTC 2021] The intermediate CA cert is in /acme.sh/*.example.com/ca.cer
[Sat Jan 9 08:21:03 UTC 2021] And the full chain certs is there: /acme.sh/*.example.com/fullchain.cer
在docker-compose.yml
中已经将/acme.sh
目录link到了/data/docker_config/acme.sh
目录,在该目录可以看到申请的一套ssl证书。
部署SSL证书
还差最后一步部署SSL证书,执行如下命令:
$ sudo docker exec runAcmesh_example.com --deploy -d *.example.com --deploy-hook docker
输出如下命令:
[Sat Jan 9 08:22:53 UTC 2021] Container id: 64879a113906f04d0227b8fc26321bc030cd38a2b69d7fe7462c2e7726bxxxxx
[Sat Jan 9 08:22:53 UTC 2021] Copying file from /acme.sh/*.example.com/*.example.com.key to /etc/nginx/ssl/example.com/key.pem
[Sat Jan 9 08:22:54 UTC 2021] Copying file from /acme.sh/*.example.com/*.example.com.cer to /etc/nginx/ssl/example.com/cert.pem
[Sat Jan 9 08:22:54 UTC 2021] Copying file from /acme.sh/*.example.com/ca.cer to /etc/nginx/ssl/example.com/ca.pem
[Sat Jan 9 08:22:55 UTC 2021] Copying file from /acme.sh/*.example.com/fullchain.cer to /etc/nginx/ssl/example.com/full.pem
[Sat Jan 9 08:22:55 UTC 2021] Reloading: service nginx force-reload
[Sat Jan 9 08:22:56 UTC 2021] Success
至此部署完成.
docker-compose.yml
中的配置项/data/docker_config/nginx/ssl:/etc/nginx/ssl
,猜测部署是把SSL文件移动到nginx容器中,但是容器重启会将文件丢失,所以link到了物理机上面,在执行 docker-compose up
文件是否会自动复制没有进行验证,只是多做了一步link。
不出意外的话,用https协议访问网址应该就没问题了。
其他不知道有没用的参考:
Let's Encrypt SSL证书申请的更多相关文章
- ZeroSSL,支持多域名的在线 Let's Encrypt SSL 证书申请工具
前言: 微信需要ssl证书,很多网站都有免费一年的证书:免费一年的证书叫做单域名证书,iis没办法配置多个子站点443端口:我有很多客户需要用我的的域名,同一个域名配置多个ssl,或者支持多个子域名: ...
- Let's Encrypt 免费通配符 SSL 证书申请教程——但是也需要email,域名所有权等,如果是黑产用的话会这样用吗?会不会暴露自己身份???
Let's Encrypt 免费通配符 SSL 证书申请教程 from:https://blog.csdn.net/English0523/article/details/79608464 2018 ...
- StartSSL免费SSL证书申请和账户注册完整过程
StartSSL算是比较早提供免费SSL证书的第三方提供商,我们可以免费申请且免费续期使用到有需要HTTPS网址的用户.关于网站使用SSL证书主要还是因为谷歌在向导说明中提到如果一个网站使用到SSL证 ...
- 【http转https】其之一:腾讯云 DV SSL证书申请实验
文:铁乐猫 2016年1月 前言 大概2017年12月28日左右公司提出以后需要将公司网站由http提升到https级别,以便谷歌和火狐浏览器将之认定为安全网站. 主要是出于客户.用户那边用火狐或谷歌 ...
- 免费SSL证书申请及部署实践
网络上关于如何签发免费SSL证书的博文一大片,但是真正操作起来的能让新手不迷惑的却很少,很多操作步骤受限于国内无法访问外网的阻碍,导致无法真正实施成功. 实际上,关于申请免费SSL证书主要涉及两大部分 ...
- 新版startssl 免费SSL证书申请 (实测 笔记 https http2 必要条件)
简单说明: 目前多个大型网站都实现全站HTTPS,而SSL证书是实现HTTPS的必要条件之一. StartSSL是StartCom公司旗下的.提供免费SSL证书服务并且被主流浏览器支持的免费SSL.包 ...
- 分享一个免费SSL证书申请网站,给网站开启https协议 | 张戈博客
这些天,由于公司的业务需求,接触到了ssl证书和https协议.博客前几篇文章也分享了在WEB服务器上安装SSL证书,为网站开启https协议的教程,感兴趣的童鞋可以前往查看相关文章: <Lin ...
- SSL 证书申请(居然还可以在淘宝上购买)
免费的目前有 2 个国内的:免费SSL证书申请国外的:StartSSL™ Certificates & Public Key Infrastructure 备注:其实,国内的这家的根证书,也是 ...
- 阿里云免费SSL证书申请与安装使用(IIS7)
准备: 阿里云已完成备案的域名一个 第一步:免费SSL证书申请 登陆阿里云平台,在域名控制台下,选择你的域名,点击“SSL”证书,如图所示 再跳转后的页面,选择“单域名免费证书”,并补全域名,非二级域 ...
随机推荐
- PyQt(Python+Qt)学习随笔:Qt Designer中怎么给toolBar添加按钮
在Designer中创建了一个MainWindow窗体,当想在其中的toolBar中添加toolButton时发现怎么也放不上去,最终才发现toolBar中的按钮只能通过直接拖拽Action编辑器中的 ...
- 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis由低级别(C)升级到高级别(P)的步骤和注意事项, 及对用户现有应用的潜在影响,是否需要停机时间窗口,以及这个时间窗口需要多少的预估问题
问题描述 由于Azure Redis的性能在不同级别表现不同,当需要升级/缩放Redis的时候,从使用者的角度,需要知道有那些步骤? 注意事项? 潜在影响?停机事件窗口? 升级预估时间? 解决方案 从 ...
- 【JAVA】SSM开源项目源码--城市学院移动后勤-毕业设计(Spring SpringMvc Mybatis Mui Redis )
项目简介 大学时期老师给我做的项目,学校后勤管理中心,也作为毕业设计项目. 有 后勤保修 二手交易 失物招领 后勤通知 等功能. 城市学院移动后勤 有APP端(webapp)和WEB端(PC) 后端使 ...
- WEB安全漏洞挖掘向入坑指北
这个指北不会给出太多的网站和方向建议,因为博主相信读者能够从一个点从而了解全局,初期的时候就丢一大堆安全网址导航只会浇灭人的热情,而且我也不适合传道授业解惑hhh 安全论坛: 先知社区 freebuf ...
- HuangB2ydjm
Hi! 我现在呢还是学生,想想初中的同学都结婚生子了,自己,嗯.(啊!!!) 本科以及硕士读的都是应用统计 在这里请广大网友多多指教了! 如果有机会的话,大家可以一起造轮子 you can catch ...
- Notepad++ 使用步骤,熟练掌握notepad++的使用技巧,无疑会大大提升专业技能。以及快捷键操作
官方下载地址: https://notepad-plus.en.softonic.com/ 1.安装 双击安装包出现以下界面 2.点击我接受 3.安装地址 继续下一步 4.默认即可,继续下一步 5.根 ...
- Java中多线程安全问题实例分析
案例 1 package com.duyang.thread.basic.basethread; 2 3 /** 4 * @author :jiaolian 5 * @date :Created in ...
- java-01-基础语法
1. 注释 单行注释 格式: // 注释信息 多行注释 格式: /* 注释信息 */ 文档注释 格式: /** 注释信息 */ 2. 常量 定义:在程序运行过程中,其值不可发生改变的量 分类: 常量类 ...
- react第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)
第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能) #课程目标 理解因为react的单向数据流 理解表单组件会因为react数据流变的不好维护 理解受控组件与非受控组件的实质区别 理解 ...
- 每天学一点ES6(一)开始
最近学习vue,发现很多用法都不会了,虽然照猫画虎可以跑起来,但是总感觉很朦胧,是是而非的感觉不太好. 听说这些都是ES6的用法,所以决定要学习一下ES6 ES6 全称:ECMASctipt 6 简称 ...