我正在为嵌入式Linux设备添加https支持 . 我试图使用以下步骤生成自签名证书:
openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem
这有效,但我得到一些错误,例如,谷歌chrome:
这可能不是您要找的网站!该网站的安全证书不受信任!
我错过了什么吗?这是构建自签名证书的正确方法吗?
13 回答
您可以在一个命令中执行此操作:
如果您不想使用密码短语保护私钥,也可以添加
-nodes
(no DES
的缩写),否则会提示您输入"at least a 4 character"密码 . days参数(365)可以替换为任何数字以影响到期日期 . 然后它会提示您输入"Country Name"之类的内容,但您可以按Enter键并接受默认值 .添加
-subj '/CN=localhost'
以禁止有关证书内容的问题(将localhost
替换为您所需的域)除非您先前将自签名证书导入浏览器,否则不会向任何第三方验证自签名证书 . 如果您需要更高的安全性,则应使用CA签署的证书 .
您的一般程序是正确的 . 该命令的语法如下 .
但是,会显示警告,因为浏览器无法通过使用已知证书颁发机构(CA)验证证书来验证身份 .
由于这是一个自签名证书,因此没有CA,您可以放心地忽略该警告并继续 . 如果您想获得公共互联网上任何人都能识别的真实证书,那么程序如下 .
生成私钥
使用该私钥创建CSR文件
向CA提交CSR(Verisign或其他等)
在Web服务器上安装从CA获得的证书
根据类型证书将其他证书添加到身份验证链
我在https://bigthinkingapplied.com/secure-the-connection-installing-certificates-on-3-common-web-servers/的帖子中有关于此的更多详细信息
我无法评论,所以将此作为单独的答案 . 我发现了一些被接受的单行答案的问题:
单行包含密钥中的密码 .
单行使用SHA1,在许多浏览器中都会在控制台中抛出警告 .
这是一个简化版本,用于删除密码,提升安全性以禁止显示警告,并在注释中包含一个建议,以传入-subj以删除完整的问题列表:
将“localhost”替换为您需要的任何域 . 您将需要逐个运行前两个命令,因为openssl将提示输入密码 .
要将两者合并为.pem文件:
这是我在本地框上使用的脚本,用于在自签名证书中设置SAN(subjectAltName) .
此脚本使用域名(example.com)并在同一证书中为* .example.com和example.com生成SAN . 以下部分进行了评论 . 为脚本命名(例如
generate-ssl.sh
)并为其指定可执行权限 . 这些文件将写入与脚本相同的目录 .Chrome 58以后需要在自签名证书中设置SAN .
此脚本还会写入一个info文件,以便您可以检查新证书并验证SAN是否已正确设置 .
如果您使用的是Apache,那么您可以在配置文件中引用上述证书,如下所示:
请记住重新启动Apache(或Nginx或IIS)服务器以使新证书生效 .
一个班轮FTW . 我喜欢保持简单 . 为什么不使用一个包含所有需要参数的命令?这就是我喜欢它 - 这创建了一个x509证书,它是PEM密钥:
该单个命令包含您通常为证书详细信息提供的所有答案 . 通过这种方式,您可以设置参数并运行命令,获取输出 - 然后去喝咖啡 .
>> more here <<
以下是@diegows's answer中描述的选项,更详细地描述了the documentation:
文档实际上比上面更详细,我在这里总结一下 .
自2018年起,以下命令可满足您的所有需求,包括SAN:
在OpenSSL≥1.1.1中,这个可以缩短为:
它创建了一个证书
对域
example.com
和example.net
(SAN)有效,相对较强(截至2018年)和
有效期为
3650
天(〜10年) .它会创建以下文件:
私钥:
example.key
证书:
example.crt
所有信息均在命令行中提供 . 没有讨厌的交互式输入 . 配置文件没有搞乱 . 所有必要的步骤都由这个单一的OpenSSL调用执行:从私钥生成到自签名证书 .
由于证书是自签名的并且需要手动接受用户,因此使用短期过期或弱加密是没有意义的 .
将来,您可能希望使用超过
4096
位的RSA密钥和强于sha256
的哈希算法,但是从2018年开始,这些是理智的值 . 它们足够强大,同时得到所有现代浏览器的支持 .备注:从理论上讲,您可以省略
-nodes
参数(这意味着"no DES encryption"),在这种情况下example.key
将使用密码加密 . 但是,这几乎从不对服务器安装有用,因为您也必须将密码存储在服务器上,或者您必须在每次重新启动时手动输入密码 .另见:https://security.stackexchange.com/a/198409/133603和https://unix.stackexchange.com/a/333325/20407
我建议添加 -sha256 参数,以使用SHA-2哈希算法,因为主流浏览器正在考虑将"SHA-1 certificates"显示为不安全 .
接受的答案中的命令行相同 - @diegows添加了-sha256
更多信息在Google Security blog .
Update May 2018. 许多人在评论中指出,使用SHA-2不会为自签名证书添加任何安全性 . 但我仍然建议使用它作为不使用过时/不安全的加密哈希函数的好习惯 . 完整说明见:https://security.stackexchange.com/questions/91913/why-is-it-fine-for-certificates-above-the-end-entity-certificate-to-be-sha1-base
的[mysqld]
SSL的CA =的/ etc / MySQL的/ CA-cert.pem
SSL证书=的/ etc / MySQL的/服务器cert.pem
SSL的密钥=的/ etc / MySQL的/服务器key.pem
在我的设置上,ubuntu服务器登录到:
/var/log/mysql/error.log
跟进说明:
SSL error: Unable to get certificate from '...'
Mysql might be denied read access to your cert file if it is not in apparmors config . 如前面步骤中所述^,将我们所有的证书保存为
/etc/mysql/
目录中的.pem
文件,默认情况下由apparmor批准(或修改您的apparmor / SELinux以允许访问存储它们的任何位置 . )SSL error: Unable to get private key
Your mysql server version may not support the default rsa:2048 format.
隐蔽生成
rsa:2048
到普通rsa
:| Variable_name | Value |
| have_openssl |是的|
| have_ssl |是的|
| ssl_ca | /etc/mysql/ca-cert.pem |
| ssl_capath | |
| ssl_cert | /etc/mysql/server-cert.pem |
| ssl_cipher | |
| ssl_key | /etc/mysql/server-key.pem |
| Variable_name | Value |
| Ssl_cipher | |
1排(0.00秒)
否则,它将为正在使用的密码显示一个非零长度字符串:mysql> show status like'Ssll_cipher';
| Variable_name | Value |
| Ssl_cipher | DHE-RSA-AES256-SHA |
1排(0.00秒)
备用链接:这里有冗长的教程http://www.madirish.net/214
oneliner v2017:
centos:
ubuntu:
如果缺少SAN(主题备用名称),现代浏览器现在会为其他格式良好的自签名证书抛出安全性错误 . OpenSSL does not provide a command-line way to specify this ,许多开发人员的教程和书签突然过时了 .
再次运行的最快方法是一个简短的独立conf文件:
req.cnf
)示例配置来自https://support.citrix.com/article/CTX135602
它很容易创建自签名证书 . 您只需使用
openssl req
命令 . 创建一个可以被最大的客户端选择(如浏览器和命令行工具)使用的方法可能很棘手 .它很难,因为浏览器有自己的一套要求,而且它们比IETF更具限制性 . 浏览器使用的要求记录在CA/Browser Forums(参见下面的参考资料) . 这些限制出现在两个关键领域:(1)信任锚,以及(2)DNS名称 .
现代浏览器(如我们在2014/2015年使用的warez)需要一个链接回信任锚的证书,并且他们希望在证书中以特定方式呈现DNS名称 . 浏览器正在积极地反对自签名服务器证书
某些浏览器并不能完全轻松导入自签名服务器证书 . 事实上,你不能用某些浏览器,比如Android的浏览器 . 所以完整的解决方案就是成为你自己的权威 .
如果没有成为您自己的权限,您必须获得正确的DNS名称,以便为证书提供最大的成功机会 . 但我鼓励你成为自己的权威 . 它很容易成为你自己的权威,它将支持所有信任问题(谁比你自己更值得信任?) .
这是因为浏览器使用预定义的信任锚列表来验证服务器证书 . 自签名证书不会链回到受信任的锚点 .
避免这种情况的最佳方法是:
创建自己的权限(即成为CA)
为服务器创建证书签名请求(CSR)
使用CA密钥对服务器的CSR进行签名
在服务器上安装服务器证书
在客户端上安装CA证书
步骤1 - 创建自己的权限只是意味着使用
CA: true
和正确的密钥用法创建自签名证书 . 这意味着Subject和Issuer是同一个实体,CA在Basic Constraints中设置为true(它也应该被标记为关键),密钥用法是keyCertSign
和crlSign
(如果您使用的是CRL),以及主题密钥标识符(SKI) )与授权密钥标识符(AKI)相同 .要成为您自己的证书颁发机构,请参阅Stack Overflow上的How do you sign Certificate Signing Request with your Certification Authority? . 然后,将您的CA导入浏览器使用的Trust Store .
当您获得CA的服务(如Startcom或CAcert)时,步骤2 - 4大致就是面向公共服务器的操作 . 步骤1和5允许您避免第三方权限,并充当您自己的权限(谁比您自己更信任?) .
避免浏览器警告的下一个最佳方法是信任服务器的证书 . 但有些浏览器,比如Android的默认浏览器,不允许你这样做 . 所以它永远不会在平台上运行 .
不信任自签名证书的浏览器(和其他类似用户代理)的问题将成为物联网(IoT)中的一个大问题 . 例如,当您连接到恒温器或冰箱进行编程时会发生什么?答案是,就用户体验而言,没什么好处 .
W3C的WebAppSec工作组正在开始研究这个问题 . 例如,参见Proposal: Marking HTTP As Non-Secure .
以下命令和配置文件创建自签名证书(它还向您显示如何创建签名请求) . 它们在一个方面与其他答案不同:用于自签名证书的DNS名称在主题备用名称(SAN)中,而不是公用名称(CN) .
DNS名称通过配置文件放在SAN中,行号为
subjectAltName = @alternate_names
(配置文件中有's no way to do it through the command line). Then there' salternate_names
部分(您应该根据自己的喜好对其进行调整):将DNS名称放在SAN而不是CN中非常重要,因为IETF和CA /浏览器论坛都指定了这种做法 . 它们还指定不推荐使用CN中的DNS名称(但不禁止) . 如果您在CN中放入DNS名称,则必须将其包含在SAN下CA / B策略 . 因此,您无法避免使用主题备用名称 .
如果您没有在DNS中放置DNS名称,则证书将无法在遵循CA /浏览器论坛准则的浏览器和其他用户代理下进行验证 .
相关:浏览器遵循CA /浏览器论坛政策;而不是IETF的政策 . 这是使用OpenSSL(通常遵循IETF)创建的证书有时不在浏览器下验证(浏览器遵循CA / B)的原因之一 . 它们是不同的标准,它们具有不同的发布策略和不同的验证要求 .
Create a self signed certificate (注意添加
-x509
选项):Create a signing request (注意缺少
-x509
选项):Print a self signed certificate :
Print a signing request :
Configuration file (passed via -config option)
您可能需要为Chrome执行以下操作 . 否则Chrome may complain a Common Name is invalid (ERR_CERT_COMMON_NAME_INVALID) . 我不确定SAN中的IP地址与此实例中的CN之间的关系 .
关于X.509 / PKIX证书中DNS名称的处理还有其他规则 . 有关规则,请参阅这些文档:
RFC 5280,Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
RFC 6125,Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)
RFC 6797,附录A,HTTP Strict Transport Security (HSTS)
RFC 7469,Public Key Pinning Extension for HTTP
CA /浏览器论坛Baseline Requirements
CA /浏览器论坛Extended Validation Guidelines
列出了RFC 6797和RFC 7469,因为它们比其他RFC和CA / B文档更具限制性 . RFC的6797和7469也不允许使用IP地址 .
2017年一个班轮:
这也适用于Chrome 57,因为它提供了SAN,而没有其他配置文件 . 取自答案here . 这将创建一个包含私钥和证书的.pem文件 . 如果需要,您可以将它们移动到单独的.pem文件中 .