申请并部署免费的 SSL/TLS 证书

简介: 本文介绍了如何免费获取和部署 SSL/TLS 证书,主要针对囊中羞涩的用户。方法包括:云服务平台的限量提供、使用 Cloudflare 等网络服务商以及直接向免费证书颁发机构(如 Let’s Encrypt 和 ZeroSSL)申请。文章重点讲述了通过自动化脚本 acme.sh 与 Let’s Encrypt 配合申请和部署证书的步骤,包括设置默认 CA、安装 acme.sh、使用 http 模式验证和部署到 nginx 服务器。此外,还提到了配置 nginx.conf 文件以启用 SSL。

对于囊中羞涩的我们来说,只要能白嫖,就绝不乱花钱。惯常申请免费 SSL/TLS 证书的途径有:

  • 各大云服务平台限量提供。比如阿里云会给每个账号每年 20 个证书的申请额度。缺点是不支持泛域名,且一年(目前已缩短至三个月)后须重新申请并部署;
  • 一些网络服务商如Cloudflare会提供自动化的证书服务,只要在它们的官网作简单配置即可。缺点是流量都要经其中转,在某些未很好覆盖的区域网站性能会受限;
  • 直接从免费证书颁发机构(CA)那里申请。通过脚本可使得获取、安装和续期 SSL/TLS 证书完全自动化。缺点是有一定的操作门槛。

本文介绍最后这种方式。

免费 CA 选择#

免费 CA,常考虑的有 Let’s EncryptZeroSSL。两者差异可自行网搜,基本上都能满足我们普通用户的需求,选择哪一个更依赖于申请过程是否顺利。

以 Let’s Encrypt 作一简单介绍。它是由 Internet Security Research Group (ISRG) 发起的公共利益项目,于2016年推出,由 Mozilla, Cisco, Akamai, Linux Foundation, Google, Microsoft, OVH 和其它一些组织支持。这个项目的主要目标是促进 HTTPS 协议的普及。Let’s Encrypt 使用 ACME 协议来验证您对给定域名的控制权并向您颁发证书,也就是说,要获得 Let’s Encrypt 证书,需要选择一个 ACME 客户端。

这里以 acme.sh 为例。acme.sh 实现了 ACME 协议, 默认 CA 是 ZeroSSL。然而笔者在申请时一直报Order status is processing, lets sleep and retry,retry 多次后报 504,不知为何。所以笔者将默认 CA 设置为 Let’s Encrypt:acme.sh --set-default-ca --server letsencrypt

申请并部署证书#

安装 acme.sh#

不清楚 docker 模式安装会否自动续期,所以直接安装到宿主机 curl https://get.acme.sh | sh -s email=xxx@xxx。直接安装会自动创建 cronjob, 每天自动检测所有的证书, 如果快过期了, 则会自动更新证书。

如前所述,设置默认 CA:acme.sh --set-default-ca --server letsencrypt

申请#

在证书申请过程中,acme.sh 需要确认域名属于你本人,有两种验证方式:http 和 dns。

  • http mode: 支持自动更新证书;不支持通配符即泛域名。
  • dns mode:支持泛域名;但如果不同时配置 Automatic DNS API,将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。所以,如果你有多个二级域名需要绑定证书,要么就使用下述 http mode 的指令,要么就去 dns 服务商处拿到 API Access(可能会有一些要求)。 参看acme.sh 支持的 dns 服务商列表

这里我们以 http mode 为例。

先设置好 DNS 解析记录,将待申请证书的域名 A 记录到服务器 IP。然后如下脚本申请证书,acme.sh 会同时进行域名验证。

Copy

acme.sh --issue -d demo.com -d www.demo.com -d admin.demo.com --webroot /srv/www/html/

只需要指定域名,并指定对应的网站根目录,acme.sh 会自动生成验证文件,并放到网站根目录,然后自动完成验证,最后会删除验证文件。

如果你用的是直接在宿主机安装的 nginx 服务器,甚至不需要指定网站根目录。acme.sh 可以智能地依据 nginx 配置自动完成验证:

Copy

acme.sh --issue -d demo.com ... --nginx

上述脚本的前提是 acme.sh 可以调用 nginx 指令,否则会报 nginx command is not found 错误。所以如果 nginx 是以 docker 方式安装,这种方式将无法成功;还是得使用 --webroot 的方式,只要将 nginx 根目录映射出来即可,如下:

Copy

docker run --name ngix -v /srv/www/html:/usr/share/nginx/html:ro -v /srv/www/nginx.conf:/etc/nginx/nginx.conf:ro -p 80:80 -p 443:443 --network inner_net --restart=always -d --label=sh.acme.autoload.domain=anything nginx:stable-alpine

注意脚本中的 label,用于后续部署证书时 acme.sh 定位该容器。这里的 anything 可以替换为任意字符。

域名验证无误的话,acme.sh 会去 CA 那里获取证书,并下载到本地。一个主域名及其多个子域名同时申请的话,CA 只为它们签发一张证书。

部署#

还是以 nginx docker 容器为例。

Copy

# The label value to find the container
# 多个不同域名申请证书时可重复使用该容器
export DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload.domain=anything

# The target file path in the container.
# The files will be copied to the position in the container.
export DEPLOY_DOCKER_CONTAINER_KEY_FILE="/etc/nginx/ssl/demo.com/key.pem"
export DEPLOY_DOCKER_CONTAINER_CERT_FILE="/etc/nginx/ssl/demo.com/cert.pem"
export DEPLOY_DOCKER_CONTAINER_CA_FILE="/etc/nginx/ssl/demo.com/ca.pem"
export DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/etc/nginx/ssl/demo.com/full.pem"

# The command to reload the service in the container.
export DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="nginx -s reload"

# -d 指定 acme.sh --issue 时第一个[二级]域名或其执行结果产生的目录名
acme.sh --deploy --deploy-hook docker -d demo.com

笔者尚不清楚自动更新证书时是否会将新证书自动拷贝至容器内,推测应该是会的,这些临时环境变量应该会以当前申请的域名配置项的形式固化到磁盘中。

配置 nginx.conf#

在 http 节中加入如下配置

Copy

server {
     listen 443 ssl;
     # 二级域名配置相同,本文略过
     server_name demo.com;
     root /usr/share/nginx/html;
     # 上一步证书拷贝的地址
     ssl_certificate /etc/nginx/ssl/demo.com/cert.pem;
     ssl_certificate_key /etc/nginx/ssl/demo.com/key.pem;
 
     ssl_session_cache shared:SSL:1m;
     ssl_session_timeout 5m;
 
     #默认加密套件
     ssl_ciphers HIGH:!aNULL:!MD5;
     #表示优先使用服务端加密套件。默认开启
     ssl_prefer_server_ciphers on; 
 
    location / {
           index index.html index.htm;
    }
}
相关文章
|
7天前
|
安全 网络安全
如何给网站添加ssl安全证书
如何给网站添加ssl安全证书
19 1
|
8天前
|
安全 网络安全 Windows
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
在访问App Service的KUDU工具或使用`az webapp deploy`时遇到SSL错误:`SSL: CERTIFICATE_VERIFY_FAILED`。解决方法是临时禁用Azure CLI的SSL验证。在PowerShell中,设置`$env:ADAL_PYTHON_SSL_NO_VERIFY`和`$env:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION`为1;在Windows命令提示符中,使用`set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1`。注意,这可能引入安全风险,应仅在必要时使用。
|
26天前
|
云安全 算法 数据建模
阿里云SSL证书免费版申请流程,收费版证书收费标准及证书类型选择参考
SSL证书是实现网站https访问必须购买的云安全类产品,现在很多用户在网站做好之后,下一步通常都是给网站域名购买SSL证书实现网站的https访问,阿里云提供申请SSL证书服务,现在每个阿里云个人或企业用户(以实名认证为准)每年可以一次性申请20张免费Digicert DV单域名试用证书(以下简称免费证书),本文为大家介绍具体的申请流程和收费证书的最新收费标准以及不同种类的证书选择参考。
阿里云SSL证书免费版申请流程,收费版证书收费标准及证书类型选择参考
|
23天前
|
网络安全 安全 Java
Java一分钟之-SSL/TLS:安全套接字层与传输层安全
【6月更文挑战第2天】本文介绍了SSL/TLS协议在保护数据传输中的作用,以及Java中使用JSSE实现SSL/TLS的基础。内容涵盖SSL/TLS工作流程、版本、常见问题及解决办法。通过`SSLSocket`和`SSLServerSocket`示例展示了服务器和客户端的实现,并强调证书管理、配置检查和依赖更新的最佳实践,以确保安全的通信。
50 4
|
19天前
|
前端开发 Java 网络安全
基于Java Socket实现的SMTP邮件客户端 - 全面支持SSL, TLS
基于Java Socket实现的SMTP邮件客户端 - 全面支持SSL, TLS
19 0
|
19天前
|
应用服务中间件 网络安全 数据安全/隐私保护
SSL证书在IIS上部署使用
该文介绍了如何在IIS上部署SSL证书以实现HTTPS访问。首先建议使用nginx,但若需使用IIS,需有SSL证书(fullchain.pem和privkey.pem)并熟悉IIS操作。文中提供了两种证书转换方法:已有openssl,使用命令`openssl pkcs12 -export`生成.pfx文件;无openssl,通过Python脚本(pyOpenSSL v23.2.0)转换。转换后的.pfx文件导入Windows,选择“本地用户”并输入密码。最后在IIS中绑定证书,测试https访问应能正常工作。
31 0
|
21天前
|
网络协议 安全 应用服务中间件
阿里云申请免费ssl证书并配置nginx
阿里云申请免费ssl证书并配置nginx
104 0
|
1月前
|
安全 搜索推荐 数据建模
解决网站“不安全”、“不受信”、“排名下降”,你需要——「SSL证书」
SSL证书是网络安全的关键,用于加密和验证网站身份,保护用户数据安全,防止信息被窃取。它分为DV、OV、EV和IV四种类型,每种验证网站身份的程度不同。DV证书快速签发,OV和EV证书提供更高级别的身份验证,EV证书曾在浏览器地址栏显示绿色。目前,DV证书占据市场大部分份额。SSL证书还有单域、通配符和多域之分,有效期曾从多年逐渐缩短至90天,以增强安全性。部署SSL证书能提升用户信任,优化SEO排名,并符合网络安全法规要求。
解决网站“不安全”、“不受信”、“排名下降”,你需要——「SSL证书」
|
1月前
|
存储 算法 安全
ssl 证书名词解释--crt和pem
ssl 证书名词解释--crt和pem
140 0
|
1月前
|
Linux 应用服务中间件 网络安全
linux ssl 证书 --本地制作数字证书并进行程序的数字签名
linux ssl 证书 --本地制作数字证书并进行程序的数字签名
34 0