首页 技术文章 linux

申请let's encrypt证书

发布日期: 2024-05-11
FontSize: 【
申请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证书。
--email 指定一个电子邮件地址,以便在证书过期时接收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证书》,由于篇幅太长,此处不再累述。