我正在向嵌入式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
这可行,但是我遇到了一些错误,例如Google Chrome:
这可能不是您要查找的网站!
该站点的安全证书不受信任!
我想念什么吗? 这是构建自签名证书的正确方法吗?
#1楼
您可以通过以下命令执行此操作:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
如果您不想使用密码来保护私钥,也可以添加-nodes
( no DES
缩写)。 否则,它将提示您输入“至少4个字符”的密码。
您可以用任何数字替换days
参数(365)以影响到期日期。 然后,它将提示您输入“国家名称”之类的内容,但是您只需按Enter并接受默认值即可。
添加-subj '/CN=localhost'
以取消有关证书内容的问题(将localhost
替换为所需的域)。
除非您以前将自签名证书导入浏览器,否则它们不会与任何第三方进行验证。 如果需要更高的安全性,则应使用由证书颁发机构 (CA)签名的证书 。
#2楼
这是@diegows的答案中描述的选项,从文档中进行了更详细的描述 :
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
req
PKCS#10证书申请和证书生成实用程序。
-x509
此选项输出自签名证书而不是证书请求。 通常用于生成测试证书或自签名的根CA。
-newkey arg
此选项创建一个新的证书请求和一个新的私钥。 该参数采用以下几种形式之一。 rsa:nbits (其中nbits是位数)会生成nbits大小的RSA密钥。
-keyout filename
这给出了将新创建的私钥写入的文件名。
-out filename
默认指定要写入的输出文件名或标准输出。
-days n
当使用-x509选项时,它指定认证证书的天数。 默认值为30天。
-nodes
如果指定了此选项,则如果创建了私钥,则不会对其进行加密。
该文档实际上比上述文档更详细; 我在这里总结一下。
#3楼
我建议添加-sha256参数,以使用SHA-2哈希算法,因为主要的浏览器都在考虑将“ SHA-1证书”显示为不安全。
来自接受的答案的相同命令行-@diegows添加了-sha256
openssl req -x509 -sha256 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
有关更多信息,请访问Google安全性博客 。
更新于2018年5月。正如评论中许多指出的那样,使用SHA-2不会为自签名证书添加任何安全性。 但是我仍然建议使用它作为不使用过时/不安全的加密哈希函数的好习惯。 有关为什么完整证书的解释完全可以理解为基于SHA-1的最终实体证书之上的证书? 。
#4楼
我想念什么吗? 这是构建自签名证书的正确方法吗?
创建自签名证书很容易。 您只需要使用openssl req
命令。 创建一个可供最多客户选择的客户端(例如浏览器和命令行工具)使用的客户端可能很棘手。
这很困难,因为浏览器有自己的一套要求,并且比IETF更具限制性。 浏览器使用的要求记录在CA /浏览器论坛中 (请参阅下面的参考资料)。 限制出现在两个关键领域:(1)信任锚,和(2)DNS名称。
现代浏览器(例如我们在2014/2015年使用的warez)需要一个链接回信任锚的证书,并且他们希望DNS名称以特定方式显示在证书中。 浏览器正在积极反对自签名服务器证书。
某些浏览器不能完全轻松地导入自签名服务器证书。 实际上,您无法使用某些浏览器,例如Android的浏览器。 因此,完整的解决方案是成为您自己的权威。
如果没有自己的权限,则必须正确设置DNS名称,以使证书获得最大的成功机会。 但是我鼓励你成为自己的权威。 成为您自己的权威很容易,它将回避所有信任问题(谁比自己更信任?)。
这可能不是您要查找的网站!
该站点的安全证书不受信任!
这是因为浏览器使用预定义的信任锚列表来验证服务器证书。 自签名证书不会链接回受信任的锚。
避免这种情况的最佳方法是:
- 创建您自己的权限(即成为CA )
- 为服务器创建证书签名请求(CSR)
- 使用您的CA密钥签署服务器的CSR
- 在服务器上安装服务器证书
- 在客户端上安装CA证书
第1步- 创建您自己的权限仅意味着创建带有CA: true
的自签名证书CA: true
且正确的密钥用法。 这意味着主题和颁发者是同一实体,在“ 基本约束”中将CA设置为true(也应将其标记为关键),密钥用法为keyCertSign
和crlSign
(如果使用的是CRL),以及主题密钥标识符 (SKI) )与授权机构密钥标识符 (AKI)相同。
要成为自己的证书颁发机构,请参阅* 如何与证书颁发机构签署证书签名请求? 在堆栈溢出。 然后,将您的CA导入浏览器使用的信任库中。
当您征求诸如Startcom或CAcert之类的CA服务时,步骤2-4大致就是您现在要对面向公众的服务器执行的操作。 步骤1和5使您可以避开第三方权限,而充当自己的权限(谁比自己更信任?)。
避免浏览器警告的下一个最佳方法是信任服务器的证书。 但是某些浏览器(例如Android的默认浏览器)不允许您这样做。 因此它将永远无法在平台上运行。
浏览器(和其他类似的用户代理) 不信任自签名证书的问题将在物联网(IoT)中成为一个大问题。 例如,当您连接恒温器或冰箱进行编程时会发生什么? 答案是,就用户体验而言,没有任何好处。
W3C的WebAppSec工作组