开发知识

无需花一分钱:轻松获取SSL证书的三种方法

来源: 凡夫编程  日期:2024-04-01 20:52:12  点击:24  属于:开发知识

前言

这篇精彩文章详细介绍了三种获取免费 SSL 证书的方式,让你轻松提升网站安全性。不论你是刚入门的新手还是经验丰富的专业人士,都能从中找到实用指南和方法。

获取SSL证书的主要途径

一般获取 SSL 证书的途径也就那么几个,以下是一些常见的途径:

  • 商业证书颁发机构(CA):你可以选择购买商业 CA(如 Comodo、DigiCert、GlobalSign、Symantec 等)颁发的 SSL 证书。这些证书通常提供更多的功能和保障,适用于各种企业级需求。
  • 托管服务提供商:如果你使用云托管服务(国外如 AWS、Azure、Google Cloud 等,国内,如阿里云、腾讯云等),这些平台通常提供集成的 SSL 证书管理服务,可以方便地获取和配置 SSL 证书。
  • Let's Encrypt:Let's Encrypt 是一个免费的证书颁发机构,通过他们的服务可以获取免费的 SSL 证书,支持自动化签发和更新。
  • 第三方证书市场:有一些第三方的证书市场(如 SSLs.com、Namecheap 等)也提供各种类型的 SSL 证书选择,你可以在这些市场上购买并获取证书。
  • 自签名证书:如果你只是在内部环境或测试目的下使用 SSL 加密,你也可以生成自签名证书来使用。不过需要注意的是,自签名证书在公共网络中可能会受到不信任。

openssl

OpenSSL是一个强大的开源加密库,它提供了各种密码学功能,包括对称加密、非对称加密、数字证书、消息摘要等。它也包含了SSL和TLS协议的实现,因此可以用于安全地传输数据和建立安全的通信连接。

OpenSSL支持常见的加密算法,如AES、DES、RSA、DSA等,同时还提供了各种工具和命令行实用程序,以便用户进行加密、解密、签名、验证等操作。除此之外,OpenSSL还能够生成和管理数字证书,用于网络安全、身份认证和数据完整性验证。

由于其广泛的应用和强大的功能,OpenSSL已经成为许多软件和系统中不可或缺的组件,被广泛应用于网络安全领域、Web服务器、虚拟私有网络(VPN)、电子商务等各种场景中。

下面就详细分享一下如何使用 OpenSSL 生成 SSL 数字证书:

生成私钥(Key)

使用以下命令生成一个 RSA 私钥文件,私钥文件名字叫 my-key.pem:

#生成到根目录下
openssl genrsa -out my-key.pem 2048
#生成到/opt/ssl目录下
openssl genrsa -out /opt/ssl/my-key.pem 2048

关于生成私钥命令的解读:

  • openssl genrsa:表示要执行 OpenSSL 的 RSA 密钥对生成操作。
  • -out my-key.pem:指定了生成的私钥文件的输出路径和文件名,这里是 my-key.pem,表示当前目录是根目录,生成私钥文件的名字是my-key.pem。
  • 2048:指定了生成的私钥的长度为 2048 位。RSA 密钥对的安全性与密钥长度密切相关,2048 位长度目前被认为是足够安全的长度。

生成证书签名请求

使用指定的私钥文件(my-key.pem)生成一个新的证书签名请求(CSR),并将生成的 CSR 写入到指定的输出文件中(my-csr.pem)

#生成到根目录下
openssl req -new -key key.pem -out csr.pem
#生成到/opt/ssl目录下
openssl req -new -key /opt/ssl/my-key.pem -out /opt/ssl/my-csr.pem

图片图片

在生成证书签名请求命令中有几个关键信息:

  • openssl req:表示要执行 OpenSSL 的证书请求(req)操作。
  • -new:表示生成一个新的证书请求。
  • -key my-key.pem:指定了私钥文件的路径和文件名,这里是 my-key.pem,表示在目录下,文件名叫my-key.pem。证书请求需要使用私钥进行加密,因此需要指定私钥文件的位置。
  • -out my-csr.pem:指定了生成的证书签名请求(CSR)的输出文件路径和文件名,这里是 my-csr.pem,表示在目录下,文件名叫my-csr.pem。生成的 CSR 文件包含了公钥以及与证书相关的信息,用于向证书颁发机构申请签发数字证书。

另外,在执行生成证书签名请求的命令时,系统会提示你输入一些信息,这些信息将被包含在你的证书请求中。那么输入的这些信息是什么意思呢?且往下看:

图片图片

  • Country Name (2 letter code) [XX]:国家代码,通常是两个字母的国家缩写。我在这里输入 "CN" 代表中国。
  • State or Province Name (full name):州或省份名称的全称。我在这里输入 "HN",代表河南。
  • Locality Name (eg, city) [Default City]:地理位置名称,例如城市。我在这里输入 "ZZ",代表郑州。
  • Organization Name (eg, company) [Default Company Ltd]:组织名称,例如公司名称。我在这里输入 "YZXA",代表组织或公司名称。
  • Organizational Unit Name (eg, section):组织单位名称,例如部门。在这里输入 "YZXA",代表组织单位名称。
  • Common Name (eg, your name or your server's hostname):通用名称,可以是你的名字或服务器的主机名。我在这里输入 "my-test",这个没有具体含义。
  • Email Address:电子邮件地址。在这里输入 "fox9916@163.com",联系邮箱地址。
  • A challenge password:挑战密码,用于加密私钥。在这里输入 "fanfu",是为了保护私钥而设置的密码。
  • An optional company name:可选的公司名称。在这里输入 "yzxa",代表与公司相关的信息。

生成自签名证书

通过上面面两步,钥文件、证书签名请求文件都有了,然后使用以下命令生成一个自签名的 X.509 证书文件(例如 cert.pem),有效期可以根据需求自行调整:

#生成到根目录下
openssl req -x509 -days 365 -key my-key.pem -in my-csr.pem -out my-cert.pem
#生成到/opt/ssl目录下
openssl req -x509 -days 365 -key /opt/ssl/my-key.pem -in /opt/ssl/my-csr.pem -out /opt/ssl/my-cert.pem

在生成自签名证书的命令中也有几个关键参数信息:

  • openssl req:表示要执行 OpenSSL 的证书请求(req)操作。
  • -x509:表示生成自签名证书而不是证书签名请求(CSR)。X.509是一种公钥基础设施(PKI)标准,用于数字证书的格式和结构。X.509证书包含了公钥、证书所有者的信息、证书颁发机构的信息以及数字签名等内容,用于实现安全通信和验证身份。
  • -days 365:指定证书的有效期为365天,即一年。
  • -key my-key.pem:指定了私钥文件的路径和文件名,这里是 my-key.pem。生成自签名证书需要使用私钥进行签名。
  • -in my-csr.pem:指定了证书签名请求(CSR)文件的路径和文件名,这里是 my-csr.pem。该 CSR 包含了公钥以及与证书相关的信息。
  • -out my-cert.pem:指定了生成的自签名证书的输出文件路径和文件名,这里是 my-cert.pem。生成的自签名证书包含了公钥、证书信息以及使用私钥签名后的数字签名。

查看生成的证书

可以使用以下命令查看生成的证书内容:

#查询根目录下的证书
openssl x509 -in my-cert.pem -text -noout
#查询/opt/ssl目录下的证书
openssl x509 -in /opt/ssl/my-cert.pem -text -noout

图片图片

在根目录下执行ls -l命令,可以看到ssl证书已经生成了;

ls -l | grep my

my-cert.pem:自签名的ssl证书;

my-key.pem:私钥文件;

my-csr.pem:证书签名请求文件;

图片图片

let's encrypt

Let's Encrypt 是一个免费、自动化的证书颁发机构,提供了简单、开放、免费的数字证书服务。以下是 Let's Encrypt 的一些关键特点:

  • 免费:Let's Encrypt 提供的证书完全免费,无需支付费用即可获取,使得网站加密变得更加容易和经济。
  • 自动化:Let's Encrypt 提供了自动化的证书签发和更新机制,可以通过软件工具自动获取和更新证书,无需人工干预。
  • 开放:Let's Encrypt 的所有软件工具和证书签发流程都是开放源代码的,任何人都可以查看和审查其代码,确保了透明度和安全性。
  • 支持HTTPS:Let's Encrypt 的证书可以用于启用网站的 HTTPS 加密连接,保护用户数据在传输过程中的安全性和隐私。
  • 通用性:Let's Encrypt 的证书与所有现代浏览器和操作系统兼容,可以在各种平台上广泛使用。
  • 联盟支持:Let's Encrypt 得到了一些知名互联网公司和组织的支持,如 Mozilla、Google、Cisco 等。

安装 Certbot

Certbot 是 Let's Encrypt 提供的官方工具,用于自动化获取、验证和安装 SSL 证书,这里我使用的服务器操作系统是CentOS.

先添加 EPEL 存储库:Certbot 可以从 EPEL 存储库中获取。如果你的系统已经安装了 EPEL 存储库,可以忽略这一步。如果尚未安装,可以使用以下命令安装:

sudo yum install epel-release

安装 Certbot:一旦安装了 EPEL 存储库,就可以通过以下命令安装 Certbot:

sudo yum install certbot

选择验证方式

在获取证书的过程中,Let's Encrypt 提供了多种验证方式,来验证你对域名的控制权。这里我使用的cert版本是certbot 1.11.0,有两种验证方式:

图片图片

Spin up a temporary webserver (standalone):通过临时启动一个 web 服务器来完成认证。

工作过程:

  1. Certbot 会在你的服务器上临时启动一个简单的 web 服务器,监听80端口,该服务器仅用于在认证期间提供 ACME 验证文件。
  2. 然后,证书颁发机构(CA)将向该临时 web 服务器发送验证请求,并要求在特定的 URL 上放置特定的验证文件。
  3. Certbot 在收到验证请求后,会将验证文件放置在临时 web 服务器的指定路径上,以完成验证。
  4. 一旦验证通过,Certbot 将关闭临时 web 服务器,并从证书颁发机构那里获取 SSL 证书。

Place files in webroot directory (webroot):将认证文件放置在 web 服务器的根目录下完成认证。

工作过程:

  1. 在这种方式下,你需要将你的 web 服务器配置为一个指定的根目录,以便能够从外部访问其中的文件。
  2. Certbot 将生成特定的验证文件,并将其保存在你 web 服务器的根目录中(通常是通过文件系统的操作实现)。
  3. 然后,证书颁发机构(CA)将尝试从互联网上访问这些文件,以完成认证流程。
  4. 一旦认证通过,Certbot 将从证书颁发机构那里获取 SSL 证书,并将其保存到指定的位置供你使用。

standalone和webroot方式有什么区别?

这两种认证方式在工作原理和最终目的上是相同的,都是为了完成对域名的控制权验证以获取 SSL 证书。然而,它们之间存在一些关键区别:

Standalone 模式:

  • 临时启动一个独立的 web 服务器来处理验证请求。
  • 不需要依赖现有的 web 服务器或文件结构,适用于没有现成 web 服务器或无法修改现有配置的情况。
  • 但是需要注意的是,在使用 Standalone 模式时,确保 80 端口和 443 端口都没有被占用,以便 Certbot 启动临时的 HTTPS 服务器进行验证,否则可能会导致端口冲突,如下图。

图片图片

Webroot 模式:

  • 将验证文件放置在现有 web 服务器的根目录下进行验证。
  • 需要有现有的 web 服务器且能够修改其配置来指定验证文件的位置。
  • 更容易集成到已有的 web 服务器环境中,不会引起端口冲突。

建议:如果你有现成的 web 服务器并且能够修改其配置,通常推荐使用 Webroot 模式。如果你的环境中没有现成的 web 服务器或者无法修改配置,则可以选择 Standalone 模式来完成 SSL 证书的获取

运行 Certbot

在正式运行certbot,开始获取证书前,需要做一点准备工作:

确定80、443端口可以通过防火墙

sudo firewall-cmd --list-port

如果80、443端口不能通过防火墙,可以依次执行下面的命令开放端口权限

sudo firewall-cmd --permanent --znotallow=public --add-port=80/tcp

确定https服务可以通过防火墙

sudo firewall-cmd --list-service

如果https不能通过防火墙,可以依次执行下面的命令开放服务权限

sudo firewall-cmd --permanent --add-service=https

通常情况下,数字证书只会分布给正常的域名服务,不会颁布给IP地址,你需要准备一个能够正常访问的域名;所以这里我是这样做的:

我使用了一个名字叫做Natapp的内网穿透工具,在这个工具上的申请一个免费隧道,申请成功后配置一下映射到的本地的IP和端口,在服务器上启动natapp的客户端软件,客户端软件启动成功后,会分配一个随机域名映射本地ip上,通过随机分配的域名就可以把本地环境暴露到公网上,后面将针对这个随机的域名来获取一个免费的SSL证书;(这里需要提醒的是即使拿到ssl证书,也用不了,因为免费用户不能使用https访问,除非升级VIP);

Natapp官网地址:https://natapp.cn/

图片图片

图片图片

图片图片

在免费隧道配置页里配置好本地IP和要映射的端口,保存后会分配 个authtoken,这个后面启动客户端软件的时候要用;

下载客户端软件,并上传服务器的/opt目录下;

在/opt目录下执行下面的命令来启动natapp,这里就用到上面提到的authtoken;

./natapp -authtoken=xxxxx

natapp启动成功后的样子,本地IP地址192.168.111.166,80端口被映射到了unp8pa.natappfree.cc这个域名上;

图片图片

到这里准备工作差不多了,再梳理一下准备了哪些内容:

  1. 防火墙开通80、443端口、https访问;
  2. 一个可以正常正常访问的域名(natapp给的随机域名,natapp重启后,会变化的)

在上面选择验证方式部分,已经简单讲了一下certbot获取数字证书的过程中的两种验证方式的工作过程,下面的示例我选择使用Certbot 的 certonly 模式,手动获取 SSL 证书:

certbot certonly

这是一个交互式的命令,正常情况下需要两步就可以得SSL证书,第一步:选择验证方式;第二步:输入准备好的有效域名;如果是certbot安装后的第一次使用,可能还会要求输入一个联系邮箱地址;

图片图片

这里解读一下,这段交互内容包含了哪些关键信息和过程:

  • Saving debug log to /var/log/letsencrypt/letsencrypt.log:这是 certbot 正在保存调试日志到指定目录的提示。
  • How would you like to authenticate with the ACME CA?:certbot 询问你想要如何与 ACME CA(Let's Encrypt)进行认证。
  • 1: Spin up a temporary webserver (standalone) 和 2: Place files in webroot directory (webroot):展示了两种认证方式,一种是通过在临时 web 服务器上进行认证,另一种是将文件放置在 web 根目录下进行认证。你选择了第一种方式(standalone)。
  • Requesting a certificate for unp8pa.natappfree.cc:certbot 开始为你请求 unp8pa.natappfree.cc 的证书。
  • Performing the following challenges: http-01 challenge for unp8pa.natappfree.cc:certbot 正在执行 HTTP-01 挑战,这是 Let's Encrypt 使用的一种验证方法,用于确认你对该域名的控制权。
  • IMPORTANT NOTES: 之后列出了几个重要的提示:

Congratulations! Your certificate and chain have been saved at::恭喜你,你的证书和证书链已经保存在指定的路径下。

/etc/letsencrypt/live/unp8pa.natappfree.cc/fullchain.pem:证书链的路径。

/etc/letsencrypt/live/unp8pa.natappfree.cc/privkey.pem:私钥的路径。

Your certificate will expire on 2024-06-24.:你的证书将在 2024 年 6 月 24 日到期。

To obtain a new or tweaked version of this certificate in the future, simply run certbot again.:如果需要获取新的证书或者修改当前证书,在未来只需要再次运行 certbot。

To non-interactively renew all of your certificates, run "certbot renew":如果需要无需交互地更新所有证书,可以运行 "certbot renew" 命令。

最后是一些关于支持 certbot 和 Let's Encrypt 的捐赠链接,以及 certbot 的工作结束提示。

进到/etc/letsencrypt/live/unp8pa.natappfree.cc目录查看一证书文件,确实已经生成:

图片

执行cat /etc/letsencrypt/live/unp8pa.natappfree.cc/README,查看README的内容,可以看到这几个文件的解释:

cat /etc/letsencrypt/live/unp8pa.natappfree.cc/README

  • privkey.pem:是用于你证书的私钥,用于加密和解密通信内容。
  • fullchain.pem:是证书文件,通常在大多数服务器软件中使用,包含了你的证书以及中间证书(intermediate certificate)链。
  • chain.pem:用于在 Nginx 版本大于等于 1.3.7 中进行 OCSP Stapling(在线证书状态协议)的设置,可以提高证书验证的效率和安全性。
  • cert.pem:原文的解释是:该文件可能会破坏许多服务器的配置,因此在使用之前建议仔细阅读更多相关文档,需要注意的是,如果没有进一步的了解和配置,最好不要使用该文件。看着就感觉很重要。事实上确实重要。cert.pem 文件是 SSL 证书链中的证书文件,包含了你的域名证书以及中间证书(intermediate certificate)。这个文件通常用于在服务器软件(如 Nginx、Apache 等)中配置 SSL/TLS 加密连接。在证书链中,cert.pem 文件处于完整证书链的中间位置,用于构建信任链并确保客户端能够验证你的 SSL 证书的有效性。因此,cert.pem 文件是 SSL/TLS 加密连接中的一个重要组成部分,它将你的域名证书与中间证书链接在一起,以确保浏览器和客户端能够正确地验证和信任你的 SSL 证书。

配置服务器

Certbot 在成功获取证书后,在你的 Web 服务器(如 Apache、Nginx 等)配置这些证书,配置完成后,重启web服务器,就可以通过HTTPS安全的访问网站了;

还记得不?客户端浏览器是会检查证书中的主机名与客户端正在连接的服务器主机名是否匹配。如果你在web服务器软件上配置的主机名和申请证书时用到的域名不一致就会有下面的提示:

图片图片

定期更新证书

Let's Encrypt 的证书有效期为90天,你需要定期更新证书以确保持续的加密连接。Certbot 可以自动处理证书的更新工作。

1、打开 Crontab 编辑器,运行以下命令来编辑当前用户的 Crontab 文件:

crontab -e

2、添加定时任务,在打开的 Crontab 编辑器中,添加以下内容来创建一个每月执行一次的任务:

0 0 1 * * /usr/bin/certbot renew --quiet

这行指令表示在每个月的1号的凌晨0点0分执行 ,/usr/bin/certbot是certbot在服务器上安装路径;3、保存你的修改并退出编辑器。

4、查看crontab任务是否成功创建

crontab -l

图片图片

阿里云

自2021年01月01日起,每个阿里云个人或企业用户(以实名认证为准)每年可以一次性申请20张免费Digicert DV单域名试用证书。据阿里云官网介绍免费证书一般仅用于个人网站或测试使用,不建议业务成熟的企业类型网站使用。如果你使用的是企业类型网站,建议购买付费证书。对于政府、金融、电子商务、医疗等组织或机构,推荐使用OV型证书或安全等级较高的EV型证书。

阿里云的SSL免费证书与付费证书的区别

图片图片

领取与使用规则

  • 每个阿里云个人或企业用户(以实名认证为准),在每一个自然年内,可以通过数字证书管理服务的免费证书购买页,免费获取20个DV单域名证书。自然年是每年的01月01日~12月31日。免费领取的证书资源包在每个自然年末将未申请的额度清零(每年12月31日24:00:00,已签发的证书不受影响),你需要等到第二年的1月1日00:00:00后申请领取当年的免费证书资源包
  • 同一实名认证的企业主体下有多个阿里云账号时,仅支持其中一个账号一次性申领20张免费证书
  • 免费证书仅支持绑定一个单域名,不支持绑定通配符域名或者IP。不支持后缀为特殊词的域名申请免费证书。此类特殊词包括但不限于:.edu、.gov、.org、.jp、.pay、.bank、.live和.nuclear
  • 免费证书不支持多张证书合并等高级特性
  • 免费证书不支持任何免费的人工技术支持或安装指导
  • 免费证书吊销成功后,不会返还消耗的免费证书个数。
  • 免费SSL证书领取后不支持取消订单。
  • 证书服务周期支持3个月,过期后须重新申请和安装证书
  • 在免费证书即将过期时(即证书剩余有效期小于30个自然日),可以使用剩余的免费证书个数申请签发新的免费证书,替换即将过期的证书。

领取入口:

图片图片

图片图片

领取免费的证书完成后,提交申请,使用证书

图片图片