发布于 2026-01-06 10 阅读
0

如何创建自签名证书

如何创建自签名证书

前缀

之前所有关于Squid 缓存服务器的系列文章都讨论了 SSL 证书提升,并包含了创建自签名证书的步骤。也就是说,这个问题已经被讨论得太多了。

  • 你可以在互联网上找到许多其他讨论这个话题的博客/文章。此外,
  • Stack Overflow 上有一个问题获得了超过一千个赞。

那为什么还要再来一个?

  • 首先,很多这类博客/文章只是泛泛而谈,给出一些命令,却没有详细解释参数(就像我们在本系列文章中提到的前两篇一样)。例如,评论-nodes并不意味着“nodes”命令在被采纳的答案添加解释之前就已经获得了超过四百个赞。
  • 你会发现,互联网上所有这些博客/文章,每一篇都略有不同。那么,为什么会有这些差异呢?还有,它们当中有过时的吗?
  • 最重要的是,被采纳的答案并非唯一答案。如果你向下滚动页面,就会发现除了被采纳的答案之外,还有很多需要注意的地方。例如:
  • “现代浏览器现在会对格式良好的自签名证书抛出安全错误……因此,许多开发者的教程和书签突然过时了。”这条评论很容易被忽略,因为它被埋没在所有其他答案中,而且位于最底部,需要滚动很长一段距离才能看到。

这是我关于Squid 缓存服务器系列的事实收集博客的一部分,扩展了创建自签名证书的部分,结合了 Linode 的“创建自签名 TLS 证书”中的图像和文字以及上述stackoverflow 问题的答案

什么是自签名TLS证书?

自签名 TLS 证书适用于个人用途或组织内部使用的应用程序。如果您打算在网站上使用 SSL 证书,请在完成本指南中概述的步骤后,参阅我们 (linode.com) 的NGINX TLS 启用指南。

创建证书 - 入门指南

再次转载自linode的文章

  1. 切换到root您要创建证书和密钥对的用户,并切换到相应的目录。该位置会根据您的需求而有所不同。这里我们将使用/root/certs

    su - root
    mkdir /root/certs && cd /root/certs
    
  2. 创建证书:

    openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out MyCertificate.crt -keyout MyKey.key
    

系统会提示您向证书添加网站或组织的识别信息。由于自签名证书不会公开使用,因此无需提供此信息。如果此证书将提交给证书颁发机构进行签名,则信息必须尽可能准确。

以下是对本命令中使用的 OpenSSL 选项的详细说明。还有许多其他选项可用,但这些选项将创建一个有效期为一年的基本证书。更多信息,请查看man openssl终端。

  • -newkey rsa:4096创建一个 4096 位 RSA 密钥用于证书。RSA 2048这是较新版本 OpenSSL 的默认设置,但为了确保密钥长度正确,您应该在创建过程中指定密钥长度。
  • -x509创建自签名证书。
  • -sha256使用 265 位 SHA(安全哈希算法)生成证书请求。
  • -days:确定证书的有效期(以天为单位)。对于自签名证书,可以根据需要增加此值。
  • -nodes创建无需密码的证书。如果排除此选项,则每次重启使用该证书的应用程序时,都需要在控制台中输入密码。
  1. 限制密钥的权限,使其仅能root被指定人员访问:

    chmod 400 /root/certs/MyKey.key
    
  2. 将您的证书和密钥备份到外部存储设备。这是非常重要的一步,切勿跳过!

制作证书——全部流程

这一点很清楚。可惜的是,它现在被归入了那些“突然过时”的开发者教程和书签之列,因为“现代浏览器现在会抛出安全错误”。以下是我所知的对上述 Stack Overflow 问题的总结。

创建不追溯到受信任锚点的自签名证书需要以下步骤:

  1. 创建您自己的权威机构(即,成为特许会计师)
  2. 为服务器创建证书签名请求 (CSR)
  3. 使用您的 CA 密钥对服务器的 CSR 进行签名。

但魔鬼藏在细节里:

  • 上述操作可能需要几个步骤,但也可以一步完成。
  • 一些过时的文章中使用的命令使用了SHA-1哈希算法,这会导致许多浏览器在控制台中发出警告,因为现在“SHA-1 证书”被认为不安全。因此,请记住使用-sha256基于 SHA-256 的证书进行生成。
  • 然而,有说法认为,使用自签名证书并不会增加其安全性(2018年5月更新)。如果您对此感到担忧,请点击此处SHA-2查看详情
  • 系统将提示您添加身份信息,因此请使用-subj '/CN=localhost'(替换localhost为您所需的域名)来抑制有关证书内容的所有问题。但是,请注意CN,由于以下原因,此方法现已弃用。
  • 现代浏览器现在会对格式良好的自签名证书抛出安全错误,如果缺少主题备用名称SAN(Subject Alternate Name),则会导致许多开发者的教程和书签突然过时。OpenSSL 之前一直无法提供命令行方法来指定主题备用名称SAN,用户必须先创建一个简短的独立配置文件。许多示例仍然采用这种方式。
  • 截至 2019 年,所有操作都可以用一条命令完成,包括SAN
  • 需要注意的是,浏览器遵循的是证书颁发机构/浏览器论坛(CA/Browser Forum)的策略,而不是互联网工程任务组(IETF)的策略,这使得情况更加复杂。这就是为什么使用 OpenSSL(通常遵循 IETF 策略)创建的证书有时无法在浏览器(浏览器遵循 CA/B 策略)下验证的原因之一。它们是不同的标准,具有不同的颁发策略和不同的验证要求。
  • 因此,务必将 DNS 名称放在 `<username>`SAN而不是 `<username>`中CN,因为 IETF 和 CA/浏览器论坛都明确规定了这种做法。他们还指出,`<username>` 中的 DNS 名称CN已被弃用(但并未禁止)。如果您将 DNS 名称放在 `<username>` 中,则必须根据策略CN将其包含在 ` <username>` 中。因此,您无法避免使用主题备用名称 (Subject Alternate Name) SANCA/BSAN
  • 自签名证书提供的加密级别与受信任机构签名的证书相同(每年费用约为 1000 至 2000 美元),但除非您将其导入浏览器一次,否则它不会经过任何第三方验证。

创建证书 -实际命令

截至 2019 年,以下命令可以满足您的所有需求,包括 SAN:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout example.key -out example.crt -extensions san -config <(echo "[req]"; echo distinguished_name=req; echo "[san]"; echo subjectAltName=DNS:example.com,DNS:example.net,IP:10.0.0.1) -subj /CN=example.com
Enter fullscreen mode Exit fullscreen mode

此外,对于 OpenSSL ≥ 1.1.1 版本,可以将其简化为:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout example.key -out example.crt -subj /CN=example.com -addext subjectAltName=DNS:example.com,DNS:example.net,IP:10.0.0.1
Enter fullscreen mode Exit fullscreen mode

它会创建一个证书,该证书是

  • 适用于域example.comexample.net(SAN),
  • 也适用于 IP 地址10.0.0.1(SAN),
  • 相对较强(截至2019年)
  • 有效期为数3650天(约10年)。

它会创建以下文件:

  • 私钥:example.key
  • 证书:example.crt

所有信息均在命令行中提供。无需繁琐的交互式输入,也无需修改配置文件。所有必要步骤均通过一次 OpenSSL 调用完成:从私钥生成到自签名证书。

备注 1:加密参数

由于证书是自签名的,需要用户手动接受,因此使用较短的有效期或弱加密技术是没有意义的。

未来,您可能需要使用超过4096100 位的 RSA 密钥以及更强的哈希算法sha256,但截至 2019 年,这些值都是合理的。它们强度足够,并且所有现代浏览器都支持。

备注 2:参数“ -nodes

理论上,您可以省略该-nodes参数(即“不使用 DES 加密”),在这种情况下example.key,数据将使用密码加密。然而,这对于服务器安装几乎毫无用处,因为您要么需要在服务器上存储密码,要么需要在每次重启后手动输入密码。

备注 3:MinGW

在 Windows 系统下的 MinGW bash 中,您应该在命令前加上冒号 ( MSYS_NO_PATHCONV=1:)。

MSYS_NO_PATHCONV=1 openssl ...
Enter fullscreen mode Exit fullscreen mode

或者,直接在 Windows 命令提示符中运行该命令cmd.exe

备注 4:另请参阅

将私钥.key和证书合并.crt到一个.pem文件中:

cat server.crt server.key > cert.pem

此外,要使用自签名证书,您必须:

  • 在服务器上安装服务器证书
  • 在客户端上安装 CA 证书

这一点我们在之前的文章中已经介绍过了。

创建证书 - 参数说明

以下是文档中更详细的选项描述:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
Enter fullscreen mode Exit fullscreen mode
req

PKCS#10 证书请求和证书生成工具。

-x509

此选项会输出自签名证书,而不是证书请求。
这通常用于生成测试证书或自签名根证书颁发机构 (CA)。

-newkey arg

此选项会创建一个新的证书请求和一个新的私钥。参数
可以采用多种形式。例如,rsa:nbits,其中nbits是位数,会生成一个nbits大小的
RSA 密钥。

-keyout filename

这将指定要写入新创建的私钥的文件名。

-out filename

这可以指定要写入的输出文件名,默认情况下为标准输出。

-days n

使用-x509选项时,该选项指定
证书的有效天数。默认值为 30 天。

-nodes

如果指定此选项,则创建的私钥将不会被加密。

实际上,文档比以上摘要更加详细。

创建证书 - 公开

如果您想获得一份任何人都能在公共互联网上识别的真实证书,那么请按以下步骤操作。

  1. 生成私钥
  2. 使用该私钥创建 CSR 文件
  3. 向 CA(Verisign 或其他机构等)提交 CSR
  4. 将从 CA 收到的证书安装到 Web 服务器上
  5. 根据证书类型,向身份验证链中添加其他证书。

详情请见此处

文章来源:https://dev.to/suntong/how-to-create-a-self-signed-certificate-1aib