Skip to content

certbot生成https证书

证书申请有两种验证方式

  • DNS
  • 文件验证

除了这两种,就没有别的验证方式了,衍生出来各种自动续期或者申请的方式都是以这两者为基础的, 而如果生成通配符证书,必须要使用DNS验证.

certbot安装

首先安装certbot, 根据不同系统安装方式各有不同,可以参考这个网站 https://certbot.eff.org/instructions
当执行 certbot -h 出现帮助文档,说明安装成功了.

certbot命令

  • 列出所有子命令
sh
$ sudo certbot help commands

certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...

Certbot can obtain and install HTTPS/TLS/SSL certificates.  By default,
it will attempt to use a webserver both for obtaining and installing the
certificate. The full list of available SUBCOMMANDS is:

certificates       List certificates managed by Certbot
certonly           Obtain or renew a certificate, but do not install it
delete             Clean up all files related to a certificate
enhance            Add security enhancements to your existing configuration
install            Install an arbitrary certificate in a server
plugins            List plugins that are installed and available on your system
reconfigure        Update renewal configuration for a certificate specified by
--cert-name
register           Register for account with Let's Encrypt / other ACME server
renew              Renew all certificates (or one specified with --cert-name)
revoke             Revoke a certificate specified with --cert-path or
--cert-name
rollback           Roll back server conf changes made during certificate
installation
run (default)      Obtain/renew a certificate, and install it
show_account       Show account details from an ACME server
unregister         Irrevocably deactivate your account
update_account     Update existing account with Let's Encrypt / other ACME
server

You can get more help on a specific subcommand with --help SUBCOMMAND
  • 列出所有已生成的证书
sh
sudo certbot certificates
  • 删除所有已生成的证书,直接回车(enter)可以删除所有证书
sh
sudo certbot delete --cert-name [domain] -n
  • --cert-name [domain] 删除指定名称的证书
  • -n 不需要交互,直接删除

手动生成证书

如果不在域名指定的服务器上生成证书,启动服务这些是不可以的,在不生成通配符证书的情况下,可以使用http文件认证的方式生成,下面是手动生成的命令

sh
sudo certbot certonly --email luoage@gmail.com --agree-tos --manual \
    --preferred-challenges=http-01 -d  www.luoage.com
  • certonly 只获取证书,不做其余操作 only get cert
  • --email 指定email,一开始需要指定email,后面的操作就不需要了
  • --agree-tos 同意条款
  • --manual 手动处理

如果没有初始化操作没有指定email会出现错误: You should register before running non-interactively, or provide --agree-tos and --email <email_address> flags.

如需要手动处理DNS,可以使用下面命令

sh
sudo certbot certonly --email luoage@gmail.com --agree-tos --manual \
    --preferred-challenges=dns -d  www.luoage.com

多个域名还可以使用逗号分隔,或者使用-d [domain1] -d [domain2]

sh
sudo certbot certonly --email luoage@gmail.com --agree-tos --manual \
    --preferred-challenges=dns -d  "www.luoage.com,*.luoage.com"

续期证书

sh
sudo certbot renew -n

-n 全称--non-interactive 不出现交互 或者 sudo certbot renew --cert-name www.luoage.com

阿里云DNS自动生成证书

阿里云自动生成证书需要使用certbot的dns-aliyun插件, 当安装完插件后,再执行 certbot help all 会发现dns插件多增加了dns-aliyun选项

sh
dns-aliyun:
  Obtain certificates using a DNS TXT record (if you are using Aliyun DNS).

  --dns-aliyun-propagation-seconds DNS_ALIYUN_PROPAGATION_SECONDS
                        The number of seconds to wait for DNS to propagate before asking the
                        ACME server to verify the DNS record. (default: 30)
  --dns-aliyun-credentials DNS_ALIYUN_CREDENTIALS
                        Aliyun DNS credentials INI file. (default: None)

接着到阿里云上获取对应权限的key和secret放到文件中,文件名自定义

sh
# aliyun.ini
dns_aliyun_access_key = 12345678
dns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef

有了配置,接下来执行下面的命令,插件会自动做DNS的TXT解析,解析完成后自动删除, 强烈推荐👍🏻

sh
certbot certonly \
    --authenticator=dns-aliyun \
    --dns-aliyun-credentials='/path/to/aliyun.ini' \
    -d "*.example.com,example.com"

如果你是初始操作,也没有sudo权限,更不想做交互操作,直接执行下面的命令即可得到证书, 注意把email和域名设置成自己的😄!

sh
home=~

certbot certonly --email=luoage@msn.cn -n --agree-tos \
    --authenticator=dns-aliyun \
    --dns-aliyun-credentials $home/certbot/aliyun.ini \
    -d "*.example.com,example.com" \
    --config-dir=$home/certbot/config \
    --work-dir=$home/certbot/work \
    --logs-dir=$home/certbot/logs

附上阿里云生成key和secret教程 https://blog.csdn.net/liming1016/article/details/137881296

安装证书

  • 证书文件

证书会生成4个文件, 但是这个文件只是软连到对应的证书文件,并非是可以直接使用的,如果发布到自己的服务器上,需要使用archive中的文件,这点要小心注意

sh
$ certbot ls -al config/live/abc.luoage.com

total 8
drwxr-xr-x  7 falling  staff  224 Jun 26 00:11 .
drwx------  4 falling  staff  128 Jun 26 00:11 ..
-rw-r--r--  1 falling  staff  692 Jun 26 00:11 README
lrwxr-xr-x  1 falling  staff   38 Jun 26 00:11 cert.pem -> ../../archive/abc.luoage.com/cert1.pem
lrwxr-xr-x  1 falling  staff   39 Jun 26 00:11 chain.pem -> ../../archive/abc.luoage.com/chain1.pem
lrwxr-xr-x  1 falling  staff   43 Jun 26 00:11 fullchain.pem -> ../../archive/abc.luoage.com/fullchain1.pem
lrwxr-xr-x  1 falling  staff   41 Jun 26 00:11 privkey.pem -> ../../archive/abc.luoage.com/privkey1.pem

cp命令-L参数可以直接复制目标文件, 把cert.pem复制到当前目录

sh
cp -L config/live/abc.luoage.com/cert.pem .

另外我们只需要使用 privkey.pemfullchain.pem这两个文件即可,前者是 ssl_certificate 后者是 ssl_certificate_key, 针对这四文件各自的具体作用,可以参考这里 https://eff-certbot.readthedocs.io/en/latest/using.html#where-are-my-certificates

  • nginx证书配置
nginx
server {
  listen 443 ssl;
  server_name www.luoage.com;

  ssl_certificate cert/www.luoage.com/fullchain.pem;
  ssl_certificate_key cert/www.luoage.com/privkey.pem;

  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 5m;

  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;

  index index.html;

  location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://utility.luoage;
  }
}

证书签名几个问题

  • 为什么签名证书需要dns或者网站文件验证呢?为什么浏览器会信任let's encrypt的证书呢?

证书签名机构(Certificate Authority,CA)在签发证书之前需要进行验证的原因是确保证书持有者对所申请的域名或网站具有控制权。这种验证是为了防止恶意行为者滥用证书签发机构的权威性,以获取未经授权的证书。

在证书签发过程中,常见的验证方法包括 DNS 验证和网站文件验证:

DNS 验证:在 DNS 验证中,证书签发机构会向申请者提供的域名的 DNS 记录中添加一个特定的验证记录。证书签发机构会查询域名的 DNS 记录,以确认申请者对该域名具有控制权。申请者需要在其域名的 DNS 设置中添加正确的验证记录,以便证书签发机构进行验证。

网站文件验证:在网站文件验证中,证书签发机构会要求申请者在其网站的特定目录下放置一个特定的验证文件。证书签发机构会通过 HTTP 或 HTTPS 请求访问该验证文件,并验证其内容是否正确。这种验证方法要求申请者有对其网站的文件系统访问权限。
这些验证方法的目的是确保证书持有者对所申请的域名或网站具有控制权,从而防止恶意攻击者伪造证书并冒充合法的网站。

浏览器之所以信任 Let's Encrypt 的证书,是因为 Let's Encrypt 是一个公共信任的证书颁发机构。它的根证书已经内置在大多数现代浏览器和操作系统中,因此浏览器可以信任由 Let's Encrypt 颁发的证书。

Let's Encrypt 的证书签发过程也包括验证申请者对域名的控制权,以确保颁发的证书的合法性和安全性。通过使用自动化的验证流程,Let's Encrypt 使证书获取过程更加简化和普及化,使网站管理员能够轻松获得有效的证书,从而提高了整体网络的安全性。

  • 证书签名机构有哪些,他们生成的证书也被信任吗?我可以做证书签名机构吗?

有许多证书签名机构(Certificate Authorities,CA)在互联网上提供证书颁发服务。以下是一些广为人知的证书签名机构:

Let's Encrypt
Comodo
Symantec (现在是 DigiCert)
GlobalSign
GoDaddy
GeoTrust
Thawte
Entrust
这些证书签名机构的根证书已经内置在大多数现代浏览器和操作系统中,因此由它们颁发的证书通常会被信任。

在成为一个证书签名机构之前,需要满足一些严格的要求和标准,并接受相应的审查和验证过程。这些要求包括技术能力、安全控制、流程规范等等。此外,证书签名机构还需要与根证书颁发机构建立信任关系,以使其颁发的证书被广泛接受和信任。

对于个人或普通用户来说,成为一个证书签名机构是非常困难和昂贵的,因为它涉及到复杂的技术和法律要求。通常,这项工作由专业的证书签名机构来完成,以确保证书的安全性和可信度。

如果你需要在内部环境中使用自签名证书或者在开发和测试环境中使用临时证书,可以使用工具如 OpenSSL 来生成自签名证书。但要注意,自签名证书在公共网络环境中可能会触发安全警告,因为它们没有经过公共信任的根证书颁发机构的验证。因此,在公共网络环境中,建议使用受信任的证书签名机构颁发的证书。

  • 商业签名证书和免费签名证书有什么不同?

商业签名证书和免费签名证书之间存在以下几个主要区别:

价格:商业签名证书通常需要支付一定费用,而免费签名证书是免费提供的。商业签名证书的价格因证书签发机构、证书类型和有效期而异。
受信任性:商业签名证书由受信任的证书签发机构颁发,其根证书已经内置在大多数现代浏览器和操作系统中。因此,商业签名证书被广泛信任,并且不会在大多数情况下触发安全警告。相比之下,免费签名证书通常由特定的证书签发机构(如Let's Encrypt)颁发,它们的根证书也被广泛内置在现代浏览器和操作系统中。虽然免费签名证书也被许多浏览器信任,但在某些情况下可能会触发安全警告或受到一些限制。
验证过程:商业签名证书的颁发过程通常包括严格的验证流程,以确保申请者对域名或网站的控制权。这可能涉及验证域名所有权、组织身份等信息。相比之下,免费签名证书的验证过程通常更简化,通常采用自动化的验证流程,例如通过 DNS 验证或网站文件验证。
支持和保证:商业签名证书通常提供更全面的客户支持和服务,包括额外的保证和责任承担。这可能包括更高的保险金额、更快的证书吊销和更新等。免费签名证书通常不提供这些额外的支持和保证。
总体而言,商业签名证书提供更高的信任和可靠性,并得到广泛的支持和接受。免费签名证书适用于许多个人和小型组织,特别是在需要简化和快速获得证书的情况下,但在商业环境或对于需要更高级别的保证和支持的组织来说,商业签名证书可能更为适合。

自签名证书

要创建自签名证书,你可以使用 OpenSSL 工具。OpenSSL 是一个开源的加密工具包,可以用于生成自签名证书以及其他与证书相关的操作。

以下是使用 OpenSSL 创建自签名证书的基本步骤:

安装 OpenSSL:首先,确保你的系统上已经安装了 OpenSSL 工具。具体安装步骤因操作系统而异。在大多数 Linux 发行版中,你可以通过包管理器进行安装。在 Windows 上,你可以下载 OpenSSL 的预编译二进制文件并进行安装。
生成私钥:使用以下命令生成一个私钥文件(例如 private.key):

sh
openssl genpkey -algorithm RSA -out private.key

在生成私钥时,你需要指定加密算法。上述命令使用 RSA 算法生成私钥。

sh
openssl req -new -key private.key -out csr.csr

在生成 CSR 时,你需要提供一些信息,如国家、组织、通用名称等。这些信息将用于创建证书。
创建自签名证书:使用以下命令生成一个自签名证书(例如 certificate.crt):

sh
openssl x509 -req -days 365 -in csr.csr -signkey private.key -out certificate.crt

在生成自签名证书时,你需要指定证书有效期(以天为单位)。上述命令将使用私钥和 CSR 来创建自签名证书。
完成上述步骤后,你将获得一个自签名证书文件(certificate.crt)和一个私钥文件(private.key)。你可以将这些文件用于你的内部服务,并按照所使用的服务器或应用程序的要求进行配置。

请注意

自签名证书不会被公共信任的证书颁发机构所信任,因此在使用这些证书时,用户或客户端可能会看到安全警告。如果你希望在公共网络中使用证书而不触发安全警告,建议考虑使用受信任的公共证书颁发机构颁发的证书。

Reference