为什么 Firefox 不信任我的自签名证书?

Mar*_*her 18 trust ssl firefox certificate keychain

我有一个本地域(markfisher.local),我为其制作了自签名证书,并将其添加到钥匙串访问中的证书中(我使用的是 Mac)。这会导致该证书在 Chrome 和 Safari 中受到信任。如果我将 KeyChain Access 中的证书信任编辑为“从不信任”,则 Chrome 和 Safari 不再接受它,然后如果我将其改回“始终信任”,则我可以再次访问 markfisher.local。

但是当我在 Firefox 中访问该网站时,我得到以下信息:

markfisher.local 使用无效的安全证书。该证书不是来自受信任的来源。错误代码:MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY

我已按照此答案中的建议security.enterprise_roots.enabled设置为。另外,转到“首选项”>“隐私和安全”>“查看证书”,我可以看到我的证书位于“权限”选项卡中,并且我已在“编辑信任”对话框中选中“此证书可以识别网站”。原来没有检查这个true

但是 Firefox 拒绝接受该证书。我怎样才能解决这个问题?

tor*_*tte 12

这个答案是对Patrick Mevzek 答案的扩展。去引用:

\n
\n

请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=1034124和\n具体答案:

\n
\n

看起来该证书有一个带有 \n 的 basicConstraints 扩展value cA: TRUE。我们停止允许 CA 证书充当\n最终实体证书。应重新生成该证书\n而不带basicConstraints扩展名。

\n
\n

这也在https://wiki.mozilla.org/SecurityEngineering/x509Certs中进行了解释

\n
\n

错误代码:MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY

\n

含义:具有基本约束扩展的证书cA:TRUE被用作最终实体证书

\n

我能做什么:重新生成不带基本约束扩展的最终实体证书

\n
\n
\n
\n

简而言之,要在 Firefox 中使用自签名 SSL 证书(例如,用于测试 HTTPS),您必须走很长的路来创建和使用您自己的公钥基础设施 (PKI):

\n

步骤 1. 建立您的私有证书颁发机构(CA)

\n

通过创建私钥自签名证书

\n
openssl req -x509 -nodes \\\n  -newkey RSA:2048       \\\n  -keyout root-ca.key    \\\n  -days 365              \\\n  -out root-ca.crt       \\\n  -subj \'/C=US/ST=Denial/L=Earth/O=Atest/CN=root_CA_for_firefox\'\n
Run Code Online (Sandbox Code Playgroud)\n

生成的文件:

\n\n

步骤 2.为您的服务器创建私钥证书签名请求(CSR)

\n
openssl req -nodes   \\\n  -newkey rsa:2048   \\\n  -keyout server.key \\\n  -out server.csr    \\\n  -subj \'/C=US/ST=Denial/L=Earth/O=Dis/CN=anything_but_whitespace\'\n
Run Code Online (Sandbox Code Playgroud)\n

生成的文件:

\n
    \n
  • server.key:私钥
  • \n
  • server.csr:证书签名请求;没有指定任何域名。
  • \n
\n

步骤 3. 为您的服务器生成证书

\n
\n

注意
\n请确保在以下部分使用正确的域名subjectAltName = DNS:<domain>

\n
\n
openssl x509 -req    \\\n  -CA root-ca.crt    \\\n  -CAkey root-ca.key \\\n  -in server.csr     \\\n  -out server.crt    \\\n  -days 365          \\\n  -CAcreateserial    \\\n  -extfile <(printf "subjectAltName = DNS:localhost\\nauthorityKeyIdentifier = keyid,issuer\\nbasicConstraints = CA:FALSE\\nkeyUsage = digitalSignature, keyEncipherment\\nextendedKeyUsage=serverAuth")\n
Run Code Online (Sandbox Code Playgroud)\n

<(..)部分在 Bash 中称为进程替换。如果您使用没有此功能的其他 shell,则只需将文本放在文件中的双引号内,用换行符替换“\\n”,然后指定文件代替-extfile.

\n

生成的文件:

\n
    \n
  • root-ca.srl: 我一般都会忽略
  • \n
  • server.crt:要在您的服务器上使用的证书
  • \n
\n

步骤 4. 添加root-ca.crt到 Firefox 的信任存储区

\n

通过执行以下步骤

\n
\n

注意
\n正如 @sstchur 在评论中指出的那样,如果选项

\n
    \n
  • security.certerrors.mitm.auto_enable_enterprise_roots
  • \n
  • security.enterprise_roots.enabled
  • \n
\n

被设置为true. (有关详细信息,请参阅 Mozilla 支持文章如何禁用 Enterprise Roots 首选项
。) \n(子注:我还没有时间在实践中测试这些!)

\n
\n

步骤 5. 配置您的服务器

\n

您将需要server.keyserver.crt。具体步骤取决于技术。

\n
\n

为什么 Firefox 需要这些步骤?

\n

虽然下面的一行代码在 Chrome 和 Safari 中都适用,

\n

(也就是说,人们可以使用创建的证书作为根 CA 证书(安装在系统的信任存储中)和 Web 服务器的证书(例如,在 NGINX 中ssl_certificate)。)

\n
openssl req -x509 -new -nodes                                            \\\n  -newkey RSA:2048                                                       \\\n  -days 365                                                              \\\n  -subj \'/C=US/ST=Denial/L=Springfield/O=Dis/CN=anything_but_whitespace\' \\\n  -addext \'subjectAltName = DNS:doma.in,DNS:anoth.er\'                    \\\n  -addext \'authorityKeyIdentifier = keyid,issuer\'                        \\\n  -addext \'basicConstraints = CA:FALSE\'                                  \\\n  -addext \'keyUsage = digitalSignature, keyEncipherment\'                 \\\n  -addext \'extendedKeyUsage=serverAuth\'                                  \\\n  -out self-signed.crt                                                   \\\n  -keyout private.key\n
Run Code Online (Sandbox Code Playgroud)\n

在 Firefox 中不会,因为:

\n
    \n
  1. 您无法安装self-signed.crt在 Firefox 的信任存储中,因为它明确声明该证书不是证书颁发机构 ( CA:FALSE)。

    \n
  2. \n
  3. 如果你把上面命令中的CA:FALSE改为怎么办?CA:TRUE

    \n

    Chrome 和 Safari 仍然会接受它,您可以安装self-signed.crt到 Firefox 的信任存储中,但由于本答案顶部引用的原因,它无法从服务器端工作。

    \n
  4. \n
  5. 如果直接删除该-addext \'basicConstraints = CA:FALSE选项会怎样?

    \n

    Firefox 在尝试导入self-signed.crt其信任存储时会抱怨:

    \n

    警告:这不是证书颁发机构证书,因此无法将\xe2\x80\x99 导入到证书颁发机构列表中。

    \n

    (可能是因为 x509 v3 扩展添加了-addext。)

    \n
  6. \n
  7. 如果省略所有 x509 v3 扩展(即-addext选项)怎么办?

    \n
    openssl req -x509 -new -nodes                                            \\\n  -newkey RSA:2048                                                       \\\n  -days 365                                                              \\\n  -subj \'/C=US/ST=Denial/L=Springfield/O=Dis/CN=anything_but_whitespace\' \\\n  -out self-signed.crt                                                   \\\n  -keyout private.key\n
    Run Code Online (Sandbox Code Playgroud)\n

    现在你可以导入self-signed.crt到 Firefox 的信任存储中,但你会得到SSL_ERROR_BAD_CERT_DOMAIN(并且你会在 Chrome 和 Safari 中得到类似的错误,因为它们需要subjectAltName扩展出现在服务器端的证书上)。

    \n
  8. \n
  9. 将命令更改为 contains 怎么样CN=<your domain>

    \n

    您可能仍然会遇到与“ Firefox 从 101.0 开始不再使用证书 CN(通用名称)来将域名与证书匹配,并已迁移到仅使用 SAN(主题备用名称)”相同的错误 ”相同的错误。

    \n

    这意味着您必须至少添加subjectAltNamex509 v3 扩展,但随后您又回到了上面的第 1、2 或 3 项。

    \n
  10. \n
\n


Pat*_*zek 9

请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=1034124特别是这个答案:

看起来该证书有一个 basicConstraints 扩展,其值为 cA: TRUE。我们停止允许 CA 证书充当最终实体证书。该证书应该在没有 basicConstraints 扩展的情况下重新生成。

https://wiki.mozilla.org/SecurityEngineering/x509Certs也对此进行了解释

错误代码:MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY

含义:带有 cA:TRUE 基本约束扩展的证书被用作最终实体证书

我能做什么:重新生成不带基本约束扩展的最终实体证书