申请let's encrypt证书

如果您的网站还在使用http协议,或不是https协议,您应该与时俱进了,如果您觉得SSL证书比较贵,那您可以申请免费的证书,除了在服务商那里申请免费证书外,您还可以自己申请免费证书,例如let's encrypt证书。
Let's Encrypt免费证书
Let's Encrypt是一个免费的,自动化的,开放的证书颁发机构(CA),为公众的利益而运行。它的初衷是降低SSL/TLS证书的成本和复杂性,同时提高互联网上的安全性。Let's Encrypt证书是免费的,并且可以自动签发和更新。
申请Let's Encrypt证书,需要借助一些工具或第三方库。例如Certbot和ACME.sh。
使用php获取Let's Encrypt免费证书
<?php
$domain = "example.com";//您要为哪个域名申请证书
$email = "email@example.com";//您的邮箱
$certDir = "/path/to/cert-dir";//证书目录
// 执行Certbot命令来获取和安装证书,并指定自定义的证书目录
$command = "certbot certonly --webroot -w /var/www/html -d " . $domain . " --email " . $email . " --agree-tos --non-interactive --config-dir " . $certDir;
$output = shell_exec($command);
echo $output;
?>
上面示例,您需要在服务器上安装Certbot,以及允许shell_exec,为了安全,shell_exec可能已被禁用。为了正方便的找到证书的位置,建议在创建证书的时候指定目录,示例中,生成的证书文件将保存在自定义目录/path/to/cert-dir/live/example.com/,如果没有设置目录,证书的目录可能是/etc/letsencrypt/live/domain/,domain是您申请证书的域名。
Certbot安装
yum install certbot
很糟糕,测试安装的时候出错了。No package certbot available. Error: Nothing to do,因为是生产环境,所以避免出现意外,换一台新服务器测试。
执行yum install certbot
Dependencies resolved.
=============================================================================================================
Package Architecture Version Repository Size
=============================================================================================================
Installing:
certbot noarch 1.22.0-1.el8 epel 54 k
Installing dependencies:
python3-acme noarch 1.22.0-4.el8 epel 96 k
python3-certbot noarch 1.22.0-1.el8 epel 426 k
python3-configargparse noarch 0.14.0-6.el8 epel 36 k
python3-distro noarch 1.4.0-2.1.module+al8+10+4ba10e20 alinux3-module 37 k
python3-josepy noarch 1.9.0-1.el8 epel 103 k
python3-parsedatetime noarch 2.5-1.el8 epel 79 k
python3-pyrfc3339 noarch 1.1-1.el8 epel 19 k
python3-requests-toolbelt noarch 0.9.1-4.el8 epel 91 k
python3-zope-component noarch 4.3.0-8.el8 epel 313 k
python3-zope-event noarch 4.2.0-12.el8 epel 210 k
python3-zope-interface x86_64 4.6.0-1.el8 epel 158 k
Installing weak dependencies:
python-josepy-doc noarch 1.9.0-1.el8 epel 23 k
Transaction Summary
==============================================================================================================
Install 13 Packages
Total download size: 1.6 M
Installed size: 6.2 M
Is this ok [y/N]:
按y确认继续
Installed:
certbot-1.22.0-1.el8.noarch python-josepy-doc-1.9.0-1.el8.noarch python3-acme-1.22.0-4.el8.noarch python3-certbot-1.22.0-1.el8.noarch
python3-configargparse-0.14.0-6.el8.noarch python3-distro-1.4.0-2.1.module+al8+10+4ba10e20.noarch python3-josepy-1.9.0-1.el8.noarch python3-parsedatetime-2.5-1.el8.noarch
python3-pyrfc3339-1.1-1.el8.noarch python3-requests-toolbelt-0.9.1-4.el8.noarch python3-zope-component-4.3.0-8.el8.noarch python3-zope-event-4.2.0-12.el8.noarch
python3-zope-interface-4.6.0-1.el8.x86_64
Complete!
成功安装了13个软件包,查询一下安装是否成功:
certbot --version
certbot 1.22.0 #显示结果
如果使用yun安装失败,可以尝试一下官网的安装方法,官方地址:https://certbot.eff.org。
apache+centos7上的安装方法:
首先需要添加EPEL(Extra Packages for Enterprise Linux)仓库。EPEL是一个由Fedora项目维护的第三方软件仓库,包含了许多在默认CentOS仓库中找不到的软件包。
安装snapd:在EPEL仓库添加后,使用yum安装snapd软件包。执行以下命令:
sudo yum install snapd
启用snapd的systemd单元:安装snapd后,需要启用一个systemd单元,以便管理snap通信所需的套接字。执行以下命令:
sudo systemctl enable --now snapd.socket
启用经典snap支持:为了启用经典snap支持,需要在/var/lib/snapd/snap和/snap之间创建一个符号链接。执行以下命令:
sudo ln -s /var/lib/snapd/snap /snap
注意:如果您已经使用操作系统的包管理器(如apt、dnf或yum)安装了Certbot软件包,您需要先将其删除,以确保在运行certbot命令时使用的是snap版本,而不是从操作系统包管理器安装的版本。例如:
sudo apt-get remove certbot
sudo dnf remove certbot
sudo yum remove certbot。
OK,现在,可以使用snap来安装certbox
sudo snap install --classic certbot
执行以下指令,以确保certbot命令可以运行。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
使用certbox命令创建Let's Encrypt免费证书
您也可以直接在linux中使用certbot命令来创建证书,而不使用php。
Certbot提供了两种运行方式:
1、自动获取证书并配置Apache:运行以下命令,Certbot将自动获取SSL证书,并自动编辑Apache配置以启用HTTPS访问
sudo certbot --apache
2、仅获取证书:如果您希望手动处理Apache配置,可以运行以下命令仅获取SSL证书
sudo certbot certonly --apache
一般情况下,我们倾向于使用第二种方法,仅获取证书。
certbot的一些常用参数:
参数 | 说明 |
--apache | 指示Certbot使用Apache软件包管理器(如a2enmod和a2dismod)自动配置Apache Web服务器。这个参数通常与--install-cert一起使用,以便在获取证书后自动配置Apache。 |
--cert-name <name> | 为证书指定一个自定义名称。这可以帮助您在多个域名或站点中管理多个证书。 |
--certonly | 仅获取证书,而不进行任何额外的配置。获取后需要手动配置Web服务器。 |
--dry-run | 执行一个模拟运行,以测试证书续期或其他操作,不会实际更新证书或修改配置。 |
--expand | 在扩展证书的有效期时,同时更新证书。 |
--force-renewal | 强制为所有证书执行续期操作。 |
--install-cert | 在获取证书后,自动安装并配置证书,通常与--apache一起使用。 |
--keep-until-expiring | 在证书即将过期时保留旧证书,以便在续期失败时可以回滚。 |
--nginx | 指示Certbot使用Nginx软件包管理器自动配置Nginx Web服务器。这个参数通常与--install-cert一起使用,以便在获取证书后自动配置Nginx。 |
--post-hook | 指定在证书更新成功后运行的自定义脚本或命令。 |
--pre-hook | 指定在证书更新之前运行的自定义脚本或命令。 |
--quiet | 在执行Certbot时,减少输出信息。 |
--renew-hook | 指定在证书续期成功后运行的自定义脚本或命令。 |
--webroot | 指定Web服务器的Web根目录,以便Certbot可以验证域名所有权。 |
--standalone | 用于在没有Web服务器的情况下获取SSL证书。 |
指定一个电子邮件地址,以便在证书过期时接收Let's Encrypt发送的通知。 | |
-d | 用于指定要为其获取SSL证书的域名。 |
-w | 用于指定Web服务器的Web根目录。 |
-v | 参数是用于增加输出详细程度的选项,结果输出更多关于正在执行的操作和遇到的问题的信息。 |
生成的证书文件一般包括:
- privkey.pem:与证书对应的私钥文件。私钥用于解密通过公钥加密的数据。
- fullchain.pem:完整的证书链文件,它包括了您的域名证书和中间证书,但不包括根证书。
- cert.pem:您的域名的公钥证书文件。它包含了用于加密通信的公钥。
- chain.pem:证书链文件,它包含了整个证书链,从您的域名证书到根证书的所有中间证书。
示例:
sudo certbot certonly --webroot -w /mnt/www/mall -d z.lichil.com --email emailname@qq.com
其中:
-w /mnt/www/mall为网站目录;
-d z.lichil.com为申请证书的域名;
--email emailname@qq.com为邮箱,实际应用中请更改为自己的,包括上面两项。
证书申请成功,结果显示:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for z.lichil.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/z.lichil.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/z.lichil.com/privkey.pem
This certificate expires on 2024-05-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
如果您想指定证书目录,可能添加上参数--cert-kpath:
sudo certbot certonly --webroot -w /mnt/www/mall -d z.lichil.com --cert-path /mnt/www/mall/fullchain.pem --key-path /mnt/www/mall/privkey.pem --email emailname@qq.com -v
证书更新:
sudo certbot renew
sudo certbot renew命令会尝试自动更新您已经申请过的所有证书。Certbot会检查每个证书的有效期,如果它们即将过期或已过期,Certbot将自动为您更新这些证书。
如果自动更新无法成功,可以尝试手动更新,即将申请证书的命令再执行一次。
使用php库acmephp创建Let's Encrypt免费证书
acmephp 是一个用于实现 ACME 协议(Let's Encrypt 使用的协议)的 PHP 库,可以用于自动获取和安装 Let's Encrypt SSL 证书。
安装acmephp:
composer require acmephp/acmephp
测试时版本为:2.1.0
由于2.1.0 版本依赖于guzzlehttp/psr7 1.0版本,但是项目中已经锁定了guzzlehttp/psr7版本2.6.1,所以安装失败。
官方地址:https://acmephp.github.io/
官方具体安装与使用详见《acmephp获取let's encrypt证书》,由于篇幅太长,此处不再累述。