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

Posted

技术标签:

【中文标题】Apache 警告我的自签名证书是 CA 证书【英文标题】:Apache warns that my self-signed certificate is a CA certificate 【发布时间】:2016-07-08 09:40:45 【问题描述】:

由于我不知道 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 警告就消失了。

据我了解,这会创建一个受密码保护的密钥,然后删除密码,然后创建一个 CSR,然后使用 CSR 和密钥生成证书。

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

【问题讨论】:

没有答案,但它也解决了我在 Debian Jessie 中运行 apache 的问题。 既然它是一个自签名证书,你为什么关心它是否给出警告? Apache 仍然使用此配置。 @BrianMinton 它不断用警告填充 Apache 错误日志。 【参考方案1】:

快捷方式(例如,使用 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 密钥。 (系统应该在线一段时间才能在/dev/(u)random中有好的数据用于播种。)不需要生成加密的PK(1)然后使用rsa删除之后的密码。 (也许早期版本的工具需要密码?)req 创建证书签名请求并使用 PK 进行签名。为摘要提供类似 -sha256 的内容是可选的。 (3) 在交互式问题中提供您的信息。确保将您的站点域放在“通用名称:”中,否则 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 密钥,使用 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 命令的简单用法不包括任何扩展。 请注意,您可以在修改后的文件中使用此行将 Subject Alternative Name 添加到证书中,例如因此它可以处理多个(子)域(通常比在 CN 中使用 e 通配符更好,例如 *.example.com)。

【讨论】:

我已经尝试了前 3 行代码并且成功了!【参考方案2】:

完整的 CA 和 SSL 创建/设置帮助:

我创建了自己的 CA 证书并使用它加载到浏览器中(作为 CA 机构)并为我的 Apache_on_ubuntu 网站签署我自己创建的 SSL 证书。

步骤:

    生成我的 CA 私钥:

    # openssl genrsa -des3 -out /etc/ssl/private/myCA.key 2048
    

    生成根证书:*****将 myCA.pem 发送到所有桌面/客户端浏览器。

    # openssl req -x509 -days 5475 -new -nodes -key /etc/ssl/private/myCA.key -sha256 -out /etc/ssl/certs/myCA.pem
    

    在 Firefox 中安装根 CA。 (cp myCA.pem 到 windows 框) 在 Firefox 中:选项 -> 隐私_&_安全 -> 视图证书 -> 证书管理器 -> 权限 -> 导入

    为您的站点创建 CA 签名证书

4.1:创建网站私钥:

# openssl genrsa -out /etc/ssl/private/www.mywebsite.com.key 2048

4.2:创建网站CSR:注意:答案不需要与CA cert ans匹配。

# openssl req -new -key /etc/ssl/private/www.mywebsite.com.key -out /etc/ssl/private/www.mywebsite.com.csr

4.3:创建配置文件:需要配置文件来定义主题备用名称 (SAN) 扩展。 "将域名与证书进行匹配的方法——使用 subjectAlternativeName 扩展中的可用名称"

# vi /etc/ssl/private/www.mywebsite.com.ext

......我没有使用 ext 文件选项.....(用于在同一主机上托管多个 SSL 站点和证书)

4.4:创建证书:

# openssl x509 -req -in /etc/ssl/private/www.mywebsite.com.csr -CA /etc/ssl/certs/myCA.pem -CAkey /etc/ssl/private/myCA.key -CAcreateserial -out /etc/ssl/certs/www.mywebsite.com.crt -days 5475 -sha256

    创建 ssl-conf 文件:

    # cat /etc/apache2/conf-available/ssl-params.conf
    # modern configuration, tweak to your needs
    

    SSLProtocol -all +TLSv1.2 +TLSv1.3 SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA -AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 SSLHonorCipherOrder on SSL压缩关闭 SSLSessionTickets 关闭

    重启apache:

    # systemctl restart apache2
    

【讨论】:

【参考方案3】:

我今天在 Debian 9 上遇到了同样的问题,我尝试了您的解决方案以使用您的方法生成新证书,但没有成功。 Apache 中的警告完全相同。

我发现问题是在我的浏览器中存储了其他 6 个具有相同 FQDN 的证书。我删除了证书,问题就消失了。

编辑:嗯,实际上仍然有警告,但至少一切正常。

【讨论】:

【参考方案4】:

openssl req 创建 CSR 或 CA 根证书。请参阅 man 页面。这不是你想要的。第二组步骤是正确的。

【讨论】:

以上是关于Apache 警告我的自签名证书是 CA 证书的主要内容,如果未能解决你的问题,请参考以下文章

https一定是安全的吗

HTTPS自签CA证书 && nginx配置https服务

自签名SSL证书介绍及其缺点

企业为啥不能使用自签名SSL证书?

nginx和iis下的SSL双向认证教程【ca 自签 ssl证书】

如何生成自签名双向认证证书 ssl