域名 SSL 证书申请

随笔

在互联网部署建站的过程中,数据安全也变的极为重要,传统的 HTTP 明文传输隐藏着的数据被劫持、泄漏安全风险,给数据加密传输也变得尤其重要,使用 SSL 对称和非对称加密技术来保证数据的安全性,能够确保数据在传输过程中不被篡改,也确保接收方收到的信息与发送方发出的信息一致。

secuity

证书颁发机构

证书颁发机构(Certificate Authority, CA)是负责签发、管理和撤销数字证书的组织,CA 的主要作用是验证申请者的身份,并为其颁发 SSL/TLS 证书,以确保安全通信,常见的免费证书颁发机构如下

证书颁发机构免费证书有效期自动续期特性备注
Let’s Encrypt90 天最广泛使用的免费 CA,自动化程度高。
ZeroSSL90 天提供手动和自动验证选项,用户友好。
Buypass Go SSL180 天适合长期使用的用户,提供稳定的服务。
Freemium SSL通常为 90 天提供免费和付费证书选项,灵活性高。

证书申请

使用 ACME(Automatic Certificate Management Environment)协议自动申请和管理 SSL/TLS 证书,可以使用 acme.sh 工具。acme.sh 是一个轻量级的 ACME 客户端,支持多种 DNS 提供商和 Web 服务器。以下是在 CentOS 7 上使用 acme.sh 申请和管理证书的详细步骤


前期准备

  • 一个注册好的域名,已接入DNS服务商。
  • 一台Linux系统服务器。
  • 服务器防火墙放行 80 / 443 端口。

配置环境

以文章本次使用的 Centos7 系统为例,进行执行安装,首先安装一下需要的环境工具。

# 更新一下系统软件包
sudo yum update -y

# 安装EPEL仓库
sudo yum install -y epel-release

# 安装 acme 运行所需依赖软件
sudo yum install -y curl socat

安装 acme.sh

安装完成后,设定一个证书注册邮箱,这里设定为你自己的邮箱,用于接收证书后续续订的通知, [email protected] 为演示邮箱,这里替换为你自己的实际邮箱地址。

# 安装 acme.sh 脚本 并生效环境变量
curl  https://get.acme.sh | sh && source ~/.bashrc

# 设定证书申请的注册帐户
acme.sh --register-account -m [email protected] 

指定颁布机构 (可选)

指定证书下发机构,可以参照这个 “表格” ,选择你要申请证书的颁布机构,一遍不选情况默认。

# 切换 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt

# 切换 Buypass
acme.sh --set-default-ca --server buypass

# 切换 ZeroSSL
acme.sh --set-default-ca --server zerossl

# 切换 Freemium
acme.sh --set-default-ca --server freemium

放行防火墙

证书申请过程中需放行80443端口,本段命令仅放行系统防火墙,如你的服务器是在阿里云Azure云,还有其他服务商,注意需要在相关的服务商面板先放行安全组,再来放行系统防火墙,避免出现端口暴漏安全风险,以下提供两种方式选择,一种申请过程中只放行 80443 端口,还有一种申请的时候临时关闭防火墙,申请完成再打开。

防火墙状态
查看防火墙运行状态

方式一

只放行需要的 80443 端口

# 开放 HTTP 端口(80)与 HTTPS 端口(443)
sudo firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp

# 重新加载防火墙规则
sudo firewall-cmd --reload

方式二

临时关闭防火墙,申请完成后再记得启动打开

# 临时关闭防火墙
sudo systemctl stop firewalld

# 申请完成,启动防火墙
sudo systemctl start firewalld

# 查看防火墙状态
sudo systemctl status firewalld

更多防火墙命令帮助
# 启动的时候开启防火墙
sudo systemctl enable firewalld

# 启动的时候禁用防火墙
sudo systemctl disable firewalld

# 查看防火墙规则
sudo firewall-cmd --list-all

# 移除端口(例如,端口 80 和 443)
sudo firewall-cmd --permanent --remove-port=80/tcp
sudo firewall-cmd --permanent --remove-port=443/tcp
sudo firewall-cmd --reload

# 永久性添加端口(例如,端口 80 和 443)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

# 查看所有可用区域
sudo firewall-cmd --get-zones

# 切换活动区域
sudo firewall-cmd --set-default-zone=public

# 查看日志
sudo journalctl -u firewalld

# 更多帮助信息
firewall-cmd --help


证书签发

验证域名所有权完成证书的下发,命令行中的 example.com 替换为你实际需要申请证书的域名,以下命令选择一条验证类型即可。

 证书签发注意 !
除DNS验证方式,其他验证方式,过程中必须确保 “防火墙” 80 跟 443 端口是开放的,否则会导致证书签发验证失败。

HTTP 验证方式

HTTP 验证方式是最常用的方式之一,适用于大多数 Web 服务器环境。acme.sh 会在指定的 Web 根目录下创建一个临时文件,用于验证域名所有权。

此验证方式需要你自带Web环境,比如系统已安装好 Nginx 或 Apache
acme.sh --issue -d example.com --webroot /var/www/html

Standalone 验证方式

适用于无法使用 HTTP 验证的情况。acme.sh 会在指定的端口上启动一个临时的 Web 服务器,用于验证域名所有权, 上述都无法申请成功,强烈推荐这个。

如你的系统环境非常纯净,只想开放端口申请证书,强烈推荐选择这个,省心事少
acme.sh --issue -d example.com --standalone --keylength ec-256

DNS 验证方式

DNS 验证方式适用于无法公开访问的服务器或需要在不同环境中验证域名所有权的情况。acme.sh 会生成一个 DNS 记录,你需要在你的 DNS 提供商处添加这个记录。

非常适合家庭无公网但有域名的内部网络,需要自己注册一个DNS解析服务提供商

Cloudflare 服务商申请

# 设置 Cloudflare API 密钥和邮箱变量
export CF_Key="cloudflare_api_key"
export CF_Email="cloudflare_email"

# 使用 Cloudflare DNS 验证方式申请证书
acme.sh --issue --dns dns_cf -d example.com

查看更多的服务商申请方式

阿里云服务商申请

# 设置阿里云密钥ID和密钥变量
export Ali_Key="aliyun_access_key_id"
export Ali_Secret="aliyun_access_key_secret"

# 使用阿里云 DNS 验证方式申请证书
acme.sh --issue --dns dns_ali -d example.com

腾讯云服务商申请

# 设置腾讯云密钥ID和密钥变量
export TX_Key="tencent_cloud_secret_id"
export TX_Secret="tencent_cloud_secret_key"

# 使用腾讯云 DNS 验证方式申请证书
acme.sh --issue --dns dns_tx -d example.com

使用GoDaddy服务商申请

# 设置 GoDaddy API和密钥
export GD_Key="godaddy_api_key"
export GD_Secret="godaddy_api_secret"

# 使用 GoDaddy DNS 验证方式申请
acme.sh --issue --dns dns_gd -d example.com

TLS-ALPN 验证方式

适用于已经运行 HTTPS 的服务器。acme.sh 会通过 TLS-ALPN 协议进行域名验证。

这种验证方式比较冷门,需要你在本地自签一个证书,开启HTTPS后申请验证
acme.sh --issue -d example.com --alpn

成功签发

完成上述域名验证后,证书就开始下发,由于系统刚安装,没有安装任何Web服务,系统比较干净,博主使用的是 Standalone 验证方式 进行证书签发,下图为成功签发证书图。

ssl证书
证书申请成功

证书安装开启SSL

证书申请成功后,通常会将证书文件存储在 ~/.acme.sh 目录下,再把证书文件配置到Web服务器,常见的 Nginx / Apache 按照以下配置,命令中的 example.com 替换为你自己实际申请成功的域名,安装证书前需安装好对应Web服务。


安装Web服务

已安装Web可以跳过,博主这里以安装Nginx服务作为演示。

# 安装 Nginx 并 启动服务
yum install -y nginx && systemctl start nginx

# 设置 Nginx 开机自启
systemctl enable nginx


安装证书

Nginx

sudo mkdir -p /etc/nginx/ssl && acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.key \
--fullchain-file /etc/nginx/ssl/example.fullchain.cer \
--reloadcmd "systemctl restart nginx"
博主安装证书命令修改示列

以博主实际域名为 exple.58r.my 修改实际命令如下,关于参数解释

  • 使用 指定要安装证书的域名。-d exple.58r.my
  • 使用 指定私钥文件的存储路径。--key-file /etc/nginx/ssl/exple.58r.key
  • 使用 指定证书链文件的存储路径。--fullchain-file /etc/nginx/ssl/exple.58r.fullchain.cer
sudo mkdir -p /etc/nginx/ssl && acme.sh --install-cert -d exple.58r.my \
--key-file /etc/nginx/ssl/exple.58r.key \
--fullchain-file /etc/nginx/ssl/exple.58r.fullchain.cer \
--reloadcmd "systemctl restart nginx"

成功安装到web目录
成功安装到Web目录

Apache

acme.sh --install-cert -d example.com \
--key-file /etc/pki/tls/private/example.key \
--fullchain-file /etc/pki/tls/certs/example.fullchain.cer \
--reloadcmd "systemctl restart httpd"

站点启用HTTPS

以 Nginx 为例,证书已安装到到Web服务目录,现在只需要通过添加Web配置启用证书,随便创建一个配置文件,并绑定好已申请好证书的域名,以博主文章申请成功的域名exple.58r.my为例,按照下面的注释根据实际情况修改。


Nginx配置

server
{
    #监听ipv6与ipv4端口
    listen 80;
    listen 443 ssl http2 ;
    listen [::]:443 ssl http2 ;
    listen [::]:80;
    #绑定域名为 “exple.58r.my”
    server_name exple.58r.my;
    index index.php index.html index.htm;
    #指定Web页面根目录
    root /usr/share/nginx/html;
    #error_page 404/404.html;
    #指定 SSL 证书文件路径,修改成刚才申请证书文件存储位置
    ssl_certificate  /etc/nginx/ssl/exple.58r.fullchain.cer;
    #指定 SSL 私钥文件路径, 修改刚才申请的证书私钥存储位置
    ssl_certificate_key  /etc/nginx/ssl/exple.58r.key;
    #启用 SSL 安全相关支持
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;

}

最后博主根据上面的配置文件,写入到Nginx配置文件位置,下图是域名启用成功HTTPS后的完成图,不同的Web服务可能证书位置有偏差,但同理一样方式申请 。

贴一下博主写入配置文件命令,仅供参考,根据实际情况修改写入到配置文件。
sudo bash -c 'cat > /etc/nginx/conf.d/exple.58r.my.conf' <<EOF
server {
    # 监听 IPv6 与 IPv4 端口
    listen 80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    listen [::]:80;

    # 绑定域名为 “exple.58r.my”
    server_name exple.58r.my;

    # 指定 Web 页面根目录
    root /usr/share/nginx/html;

    # 指定索引文件
    index index.php index.html index.htm;

    # 指定 SSL 证书文件路径,修改为刚才申请证书文件存储位置
    ssl_certificate /etc/nginx/ssl/exple.58r.fullchain.cer;

    # 指定 SSL 私钥文件路径,修改为刚才申请的证书私钥存储位置
    ssl_certificate_key /etc/nginx/ssl/exple.58r.key;

    # 启用 SSL 安全相关支持
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497 https://$host$request_uri;
}
EOF

#重载配置文件
sudo systemctl reload nginx

加密小锁
浏览器访问域名小🔒已经开启加密

最后

上述内容就是acme脚本申请证书使用全过程,特别注意的是申请过程中防火墙,还有提前把域名解析到你申请证书的服务器地址上,以上内容有点干,希望能帮到您。

Tips:为啥不使用宝塔一键申请,多方便 😂

博主:有道理,但记录一下原生方式申请😄

希望以上内容对你有所帮助
- 作者:MarTaSai
- 博客:CheesiT 's blog
版权声明:写作不易,转载文章内容记得注明本文地址以及作者,文章采用 CC BY-NC-SA 4.0 协议。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇