为localhost创建受信任的自签名SSL证书(用于Express / Node)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为localhost创建受信任的自签名SSL证书(用于Express / Node)相关的知识,希望对你有一定的参考价值。
尝试遵循有关创建自签名证书以与localhost一起使用的各种说明,大多数说明似乎适用于IIS,但我正在尝试使用Nodejs / Express。它们都没有正常工作,因为在安装证书时,它不受信任。这是我尝试过的失败:
- How can I create a self-signed cert for localhost?
- https://www.digitalocean.com/community/articles/how-to-create-a-ssl-certificate-on-nginx-for-ubuntu-12-04/
- http://blogs.developerforce.com/developer-relations/2011/05/generating-valid-self-signed-certificates.html
- http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/
有人可以提供可以做到这一点的工作流程吗?我可以安装一个证书,但我无法让chrome(v32)或IE(v10)中的证书受到信任。
编辑:在评论中建议问题是没有受信任的cert-root。我通过IE安装了证书,但它仍然不受信任。
上面的答案是部分的。我花了这么多时间来完成这项工作,这太疯狂了。请注意我未来的自我,这是你需要做的:
我正在使用Chrome 65开发Windows 10. Firefox表现良好 - 只需将localhost确认为安全例外即可。 Chrome没有:
步骤1.在后端,创建一个名为security
的文件夹。我们会在里面工作。
步骤2.使用以下内容创建名为req.cnf
的请求配置文件(信用转到:@Anshul)
req.cnf:
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = Country initials like US, RO, GE
ST = State
L = Location
O = Organization Name
OU = Organizational Unit
CN = www.localhost.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.localhost.com
DNS.2 = localhost.com
DNS.3 = localhost
这个领域的解释是here。
步骤3.导航到终端中的安全性文件夹,然后键入以下命令:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -config req.cnf -sha256
步骤4.然后在security
文件夹之外,在您的快递应用程序中执行以下操作:(信用转到@Diego Mello)
backend
/security
/server.js
server.js:
const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000
app.get('/', (req, res) => {
res.send("IT'S WORKING!")
})
const httpsOptions = {
key: fs.readFileSync('./security/cert.key'),
cert: fs.readFileSync('./security/cert.pem')
}
const server = https.createServer(httpsOptions, app)
.listen(port, () => {
console.log('server running at ' + port)
})
步骤5.启动服务器node server.js
,然后转到https://localhost:3000。
此时我们有服务器设置。但浏览器应显示警告消息。
我们需要在chrome / windows证书库中注册我们的自签名证书,作为CA可信证书颁发机构。 (chrome也将其保存在windows中)
步骤6.在chrome中打开Dev Tools,转到Security面板,然后单击View Certificate。
步骤7.转到Details面板,单击Copy File,然后出现Certificate Export Wizard时,单击Next,如下所示:
步骤8.保留DER编码,单击下一步,选择Browse
,将其放在易于访问的文件夹(如Desktop)上,并将证书命名为localhost.cer, then click Save and then Finish.
。您应该能够在桌面上看到您的证书。
步骤9.通过将chrome://settings/
插入URL框打开它。在下面,点击Advanced / Advanced Options
,然后向下滚动找到Manage Certificates
。
步骤10.转到“受信任的根证书颁发机构”面板,然后单击“导入”。
我们将导入我们刚刚在步骤8中导出的localhost.cer
证书。
步骤11.单击浏览,找到localhost.cer
,保留默认值,然后单击下一次 - 直到出现此警告,单击是。
步骤12.关闭所有内容,然后重新启动chrome。然后,当你去https://localhost:3000
时,你应该看到:
转到:chrome://flags/
启用:允许从localhost加载的资源的无效证书。
你没有绿色安全,但你总是被允许使用chrome中的https://localhost。
发布的一些答案中的部分对我来说也非常有用,可以解决这个问题。但是,我也对最小步数感兴趣,理想情况下,我们也避免使用OpenSSL(在Windows 10上)。
因此,答案中的一个关键部分(信用:@TroyWorks)是您需要编辑HOSTS文件以创建虚构服务器,并将其映射到127.0.0.1。这假设您将进行本地开发。
就我而言,我使用SS证书来保护NodeJS中的websocket,并且该套接字以编程方式连接(而不是通过浏览器)。因此,对我而言,在没有警告或错误的情况下接受证书至关重要,并且关键部分是用适当的CN创建证书(当然接受证书到可信管理机构,如答案中的其他部分所述) 。使用IIS创建自签名证书不会创建正确的CN,因此我使用Powershell发现了以下简单命令:
New-SelfSignedCertificate -DnsName "gandalf.dummy.dev" -FriendlyName "gandalf" -CertStoreLocation "cert:LocalMachineMy"
这必须在PS管理控制台中运行,但它只是起作用,并将证书放入LocalMachine证书库的“个人”部分。您可以通过执行以下命令来验证它
ls cert:LocalMachineMy
要信任它,只需复制它并使用证书管理器粘贴到“受信任的根证书颁发机构”(确保您正在查看本地计算机证书,而不是当前用户!)。
如果您在IIS中绑定到此证书,您应该能够访问https://gandalf.dummy.dev/并获得安全连接,而不会发出任何警告。
在NodeJS中使用它的最后一个部分在上面和其他SO答案中进行了描述,因此我只在Windows上添加它,使用结合了cert和私钥的pfx文件更容易。您可以从证书管理器轻松导出pfx,但它确实会影响您在NodeJS中的使用方式。使用“https”模块实例化服务器时,您将使用的选项(而不是“key”和“cert”)将是“pfx”和“passphrase”,如下所示:
var https = require('https');
var options = {
pfx: fs.readFileSync('mypfxfile'),
passphrase: 'foo'
};
var server = https.createServer(options);
来自@FiloSottile的Mkcert使这个过程变得无比简单:
- 安装mkcert,有macOS / Windows / Linux的说明
mkcert -install
创建一个本地CA.mkcert localhost 127.0.0.1 ::1
在当前目录中为localhost创建受信任的证书- 您正在使用节点(不使用系统根存储),因此您需要在环境变量中使用specify the CA explicitly,例如:
export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
- 最后使用各种其他答案(例如下面)中描述的设置运行您的快速服务器
- 繁荣。 localhost的绿色游泳。
基本节点设置:
const https = require('https');
const fs = require('fs');
const express = require('express');
const app = express();
const server = https.createServer({
key: fs.readFileSync('/XXX/localhost+2-key.pem'), // where's me key?
cert: fs.readFileSync('/XXX/localhost+2.pem'), // where's me cert?
requestCert: false,
rejectUnauthorized: false,
}, app).listen(10443); // get creative
最短路。在MacOS上测试过,但在其他操作系统上可能会有类似的效果。
生成pem
> openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365
> openssl rsa -in keytmp.pem -out key.pem
你的快递服务器
const express = require('express')
const app = express()
const https = require('https')
const fs = require('fs')
const port = 3000
app.get('/', (req, res) => {
res.send('WORKING!')
})
const httpsOptions = {
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
}
const server = https.createServer(httpsOptions, app).listen(port, () => {
console.log('server running at ' + port)
})
- 在谷歌浏览器中打开
https://localhost:3000
,你会发现它不安全。然而! - 在开发人员工具>安全性>查看证书中:将图像拖到桌面并双击它。
- 点击“添加”
- 在Keychain Access中找到它并双击它
- 展开“信任”并将“使用此证书时”更改为“始终信任”。
- 系统可能会提示您进行身份验证。
- 重启服务器。
- 刷新浏览器。
- 请享用! :)