Apache 警告我的自签名证书是 CA 证书

标签 apache ssl https openssl

因为我不太了解 openssl 命令的参数,所以我习惯于引用相同的 SO answer每当我需要创建自签名证书(用于测试环境)时。命令看起来像:

openssl req -x509 -nodes -newkey rsa:2048 -keyout mysite.key -out mysite.crt -days 365

而且它通常可以正常工作,例如在我当前的 Ubuntu 15.10 上。今天我正在全新安装 Debian Jessie,但它没有。 Apache 在启动时发出警告:

[ssl:warn] [pid 1040] AH01906: www.mysite.com:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)

我寻找问题的解决方案并找到了 an answer in a linux forum声明应改用以下内容:

openssl genrsa -des3 -passout pass:x -out mysite.pass.key 2048
openssl rsa -passin pass:x -in mysite.pass.key -out mysite.key
openssl req -new -key mysite.key -out mysite.csr
openssl x509 -req -days 365 -in mysite.csr -signkey mysite.key -out mysite.crt

没错,这样 Apache 警告就消失了。

据我所知,这会创建一个受密码保护的 key ,然后删除密码,然后创建 CSR,然后生成包含 CSR 和 key 的证书。

所以问题是:这个较长的版本做了什么而较短的版本没有,为什么在某些情况下(比如今天对我来说)是必要的?

最佳答案

快捷方式(例如使用 OpenSSL 1.1.0f 和 A​​pache 2.4.37):

openssl genrsa -out notEncodedPk.key 3072
openssl req -new -out website.csr -sha256 -key notEncodedPk.key
openssl x509 -req -in website.csr -days 365 -signkey notEncodedPk.key -out website.cert -outform PEM

genrsa 生成 3072 位 RSA key 。 (系统应该在线一段时间,以便在/dev/(u)random 中有用于播种的良好数据。)无需生成加密的 PK (1),然后使用 rsa 删除之后的密码。 (也许早期版本的工具需要密码?)
req 创建证书签名请求并使用 PK 进行签名。为摘要提供类似 -sha256 的东西是可选的。 (3) 在互动问题中提供您的信息。确保将您的站点域放在“Common name:”中,否则 Apache 将抛出警告 (AH01909) 并且浏览器将抛出“无效证书”消息,因为 URL/域与证书数据不匹配 (2)。将“挑战密码:”留空。
使用 x509 创建带有 -signkey 的自签名证书(主题被复制到颁发者)。通常该命令适用于证书,但使用 -req 它接受 CSR 作为输入。然后使用您的 PK 签署证书。 (-outform-days 是可选的,后者的默认值为 30 天。)

问题来源:

正如 user207421 所述:req 创建一个 CSR OR 它创建一个自签名的 root-CA-like 证书,因此典型的教程提示

openssl req -x509 -nodes -days 365 -newkey rsa:3072 -sha256 -keyout website.key -out website.cert

很短,但通常不是您想要的。您还可以将创建的证书与

openssl x509 -text -noout -in website.cert

在使用单行命令创建的证书中,您会看到“X509v3 扩展:”部分和“X509v3 基本约束:关键 CA:TRUE”。这正是 Apache 警告消息。
相反,如果您通过三个步骤创建证书,则“X509v3 扩展:”部分不会包含在证书中。

附录:

(1) 在大多数情况下,使用密码保护 PK 是一个好主意。如果 PK 未加密存储,请确保限制对 root 的访问。如果您使用密码,则必须使用 -passout/-passin 选项,但请注意简单的“x”不再有效,因为某些 OpenSSL 工具需要至少 4 个字符(否则: “结果太小/密码读取错误”)。此外,在 Apache 中,您必须使用 SSLPassPhraseDialog buildin 之类的东西在 Apache 启动期间手动输入 PK(甚至所有 PK/证书)所需的密码。

(2) 无论如何,浏览器都会显示自签名证书的警告。

(3) 对于如此大的 RSA key ,使用 SHA-1 是不够的。通常,检查您的 openssl.conf 是个好主意,例如在 Debian 9 中的/etc/ssl/openssl.conf 中,其中包含各种默认值,例如 signer_digest = sha256
在 Debian 9 文件中,您还在 [req] 部分找到一行 x509_extensions=v3_ca 这就是为什么 req 命令与 -x509 结合使用的原因选项添加与 CA 相关的扩展 (basicContraints=critical,CA:true),如果以单行样式用于创建自签名证书。

此外,您可能会注意到注释行 # req_extensions=v3_req。因为这行被注释掉了(在 Debian 9 默认的 openssl.cnf 中),req 命令的简单用法不包括任何扩展。
请注意,您可以在修改后的文件中使用此行将主题备用名称 添加到证书中,例如因此它可以处理多个(子)域(通常比在 CN 中使用 e 通配符更好的选择,例如 *.example.com)。

关于Apache 警告我的自签名证书是 CA 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138517/

相关文章:

PHP脚本无故突然停止工作

启用apache响应时间日志指令的性能影响

iis-7 - 有没有办法在 IIS 7 上将 https 重定向到 http?

python - SSL 错误 "unexpected message"

ssl - Python ssl 客户端无法使用 ssl 连接到 socketserver

asp.net - 如何安全地引用 https 页面上的 http 资源?

amazon-web-services - 亚马逊 S3 : using DNS alias to bucket + HTTPS at the same time

php - 并行运行 Node.js 和 apache 的技术方面

Javascript 做 ssl 固定?

php - 使用 tomcat 运行 php 应用程序?