由于我不了解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和密钥生成证书。
所以问题是:这个较长的版本做的是什么,短的没有,为什么在某些情况下是必要的(如今对我来说)?
答案 0 :(得分:4)
快捷方式(例如,使用OpenSSL 1.1.0f和Apache 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的证书,因此通常教程技巧
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,例如在/etc/ssl/openssl.conf中的Debian 9中,其中包含各种默认值,例如 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中使用通配符(例如* .example.com)要好得多。)
答案 1 :(得分:0)
我今天在Debian 9上遇到了同样的问题,我尝试使用你的方法生成一个新的证书,但它没有用。 Apache中的警告完全相同。
我发现问题是在我的浏览器中存储了具有相同FQDN的其他6个证书。我删除了证书,问题就消失了。
编辑:嗯,实际上仍然有警告但至少一切正常。答案 2 :(得分:0)
openssl req
创建CSR或CA根证书。请参阅 man 页面。这不是你想要的。第二组步骤是正确的。