为 localhost 创建一个可信的自签名 SSL 证书(用于 Express/Node)

试图按照各种说明创建用于 localhost 的自签名证书,大多数说明似乎是针对 IIS 的,但我正试图使用 Nodejs/Express。它们都不能正常工作,因为在安装 cert 时,它不受信任。以下是我失败的尝试:

有人能提供一个可以做到这一点的工作流吗?在 chrome (v32)或 IE (v10)中我无法获得可信的证书。

编辑: 有人在评论中建议说,这个问题不是可信的 cert-root。我通过 IE 安装了证书,但它仍然不被信任。

205640 次浏览

您可以尝试用 openSSL 生成证书。 看看 这个

你需要一个。钥匙和。将 HTTPS 添加到节点 JS Express 服务器的 crt 文件。生成此代码后,请使用此代码将 HTTPS 添加到服务器。

var https = require('https');
var fs = require('fs');
var express = require('express');


var options = {
key: fs.readFileSync('/etc/apache2/ssl/server.key'),
cert: fs.readFileSync('/etc/apache2/ssl/server.crt'),
requestCert: false,
rejectUnauthorized: false
};




var app = express();


var server = https.createServer(options, app).listen(3000, function(){
console.log("server started at port 3000");
});

这在我的本地计算机以及部署它的服务器上运行良好。我在服务器上的那个是从 goDaddy 买的,但 localhost 有一个自签名的证书。

但是,每个浏览器都抛出一个错误,表示不信任连接,是否继续。在我点击继续后,它工作得很好。

如果有人曾经用自签名证书绕过此错误,请指点。

这就是我的办法

在窗户上

1)将这个文件添加到你的% WINDIR% System32驱动程序等主机文件: 127.0.0.1 localdev.yoursite.net (导致浏览器与“ localhost”有问题(对于跨源脚本)

WindowsVista 和 Windows7 Vista 和 Windows7使用用户帐户控制(UAC) ,因此记事本必须作为管理员运行。

  1. 点击开始-> 所有程序-> 附件

  2. 右键单击“记事本”并选择“以管理员身份运行”

  3. 在“ Windows 需要您的许可”UAC 窗口中单击“继续”。

  4. 记事本打开时,单击“文件”-> “打开”

  5. 在文件名字段类型 C: WindowsSystem32Drivers 等主机

  6. 单击“打开”

  7. 将此文件添加到您的% wINdir% System32驱动程序等主机文件: 127.0.0.1 localdev.yoursite.net

  8. 保存

  9. 关闭并重启浏览器

在 Mac 或 Linux 上:

  1. 使用 su权限打开/etc/hosts
  2. 加入 127.0.0.1 localdev.YOURSITE.net
  3. 省省吧

开发时使用 localdev.yoursite.net 而不是 localhost,所以如果你在 IDE 中使用运行/调试配置,一定要更新它。

在创建 cookie 时,使用“ . YOURSITE.net”作为 cookie 域(在开始处加一个点) ,然后它应该可以与所有子域一起工作。

2)使用 localdev.url 创建证书

提示: 如果在 Windows 上生成证书时遇到问题,可以使用 VirtualBox 或 Vmware 机器。

3)导入上述证书 Http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

如果你正在使用 node,为什么不用 node 生成它们呢:

注意,我不会动态生成。使用某种构建脚本生成,以便您拥有一致的证书和密钥。否则,每次都必须对新生成的自签名证书进行授权。

在 Windows 上,我使用 MMC (start > run > MMC)制作了受信任的 iis 开发证书,然后添加证书管理单元,选择“ local computer”并接受默认值。添加证书快照后,展开本地计算机证书树以查看“个人”下,选择“本地主机证书”,右键单击 > 所有任务 > 导出。接受导出向导中的所有默认值。

保存该文件后,展开受信任证书并开始导入刚才导出的证书。https://localhost现在被信任在铬没有安全警告。

我使用这个指南 解决方案 # 2从 MSDN 博客,操作也分享了一个关于他的问题,也应该使用 MMC 的链接,但这为我工作。 解决方案 # 2

如果你使用的是 OSX/Chrome,你可以将自签名的 SSL 证书添加到你的系统密钥链中,如下所示: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates

这是一个手动过程,但我终于得到它的工作。只要确保 Common Name (CN)设置为“ localhost”(没有端口) ,并且在添加证书之后确保证书上的所有信任选项都设置为“ Always Trust”。还要确保将它添加到“ System”密钥链,而不是“ login”密钥链。

如何为本地主机生成 SSL 证书: 链接

openssl genrsa -des3 -out server.key 1024

你需要在这里输入一个 密码,然后在 以下步骤

openssl req -new -key server.key -out server.csr

当被问到“通用名称”时,键入: 本地主机

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt

最近的路。 在 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,你会发现它并不安全!
  • 在开发工具 > 安全 > 查看证书: 拖动图像到桌面并双击它。
  • 点击’添加’
  • 在钥匙链访问中找到它并双击它
  • 展开“信任”并将“使用此证书时”更改为“始终信任”。
  • 可能会提示您进行身份验证。
  • 重启服务器。
  • 刷新浏览器。
  • 享受吧! :)

这里还有更多的方面。

您可以使用证书来实现 TLS (有些人一直说是 SSL) ,无论是否自签名。

若要为自签名证书提供绿条,还需要成为证书颁发机构(CA)。在我实现本地开发设置中的绿条的旅程中,我发现大多数资源都缺少这个方面。成为 CA 与创建证书一样容易。

这个资源包括 CA 证书和服务器证书的创建,结果我在本地主机 Chrome、 Firefox 和 Edge 上显示了一个绿色条: Https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

请注意: 在 Chrome 中,您需要将 CA 证书添加到您信任的授权机构。

上面的答案是部分的。我花了那么多时间让它运转起来,简直疯了。提醒未来的我,以下是你需要做的:

我正在开发 Windows10,Chrome 65。Firefox 表现得很好——只要确认 localhost 是一个安全异常,它就会工作。Chrome 没有:

步骤1. 在后台创建一个名为 security的文件夹。

步骤2. 创建一个名为 req.cnf的请求配置文件,该文件包含以下内容(归功于: @ Anshul)

返回文章页面

[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

这个字段的说明是 给你

步骤3. 导航到终端中的安全文件夹并键入以下命令:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -config req.cnf -sha256

第四步。 然后在 security文件夹之外,在你的快递应用程序中做这样的事情: (信用归@Diego Mello)

backend
/security
/server.js

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 中也保存了这个)

在 chrome 中打开开发工具,转到安全面板,然后点击查看证书。 enter image description here

步骤7。 转到“详细信息”面板,单击“复制文件”,然后当证书导出向导出现时,单击“下一步”,如下所示:

go to details - copy file - next on export wizard

第八步。保留 DER 编码,单击下一步,选择 Browse,将其放在桌面等容易访问的文件夹中,并将证书命名为 localhost.cer, then click Save and then Finish.。您应该能够在桌面上看到您的证书。

第九步。 通过将 chrome://settings/插入到 url 框中来打开它。下面,单击 Advanced / Advanced Options,然后向下滚动查找 Manage Certificates

choose manage certificates

步骤10。 转到受信任的根证书颁发机构面板,然后单击 import。

Go to Trusted Root Certification Authorities panel, and click import

我们将导入步骤8中刚刚导出的 localhost.cer证书。

第十一步。点击浏览,找到 localhost.cer,保留默认值点击下一个一连串的次数-直到这个警告出现,点击 yes。

confirm security exception

步骤12。 关闭所有设备,重新启动 chrome。然后,当转到 https://localhost:3000时,你应该看到: gotta love the green

张贴的一些答案的片段对我克服这个问题也非常有用。然而,我也对 最低限度的步骤数感兴趣,并且,理想情况下,避免使用 OpenSSL (在 Windows10上)。

因此,答案中的一个关键部分(来源:@TroyWorks)是,您需要编辑 HOSTS 文件以创建一个虚拟服务器,并将其映射到127.0.0.1。这里假设你要进行本地开发。

在我的例子中,我使用 SS 证书来保护 NodeJS 中的一个 websocket,并且该套接字是通过编程方式连接的(而不是通过浏览器)。因此,对于我来说,证书在没有警告或错误的情况下被接受是至关重要的,而关键的一点是使用适当的 CN 创建证书(当然也接受证书进入可信当局,正如答案的其他部分所描述的那样)。使用 IIS 创建自签名证书不会创建正确的 CN,因此我使用 Powershell 发现了以下 很简单命令:

New-SelfSignedCertificate -DnsName "gandalf.dummy.dev" -FriendlyName "gandalf" -CertStoreLocation "cert:\LocalMachine\My"

这必须在 PS 管理控制台中运行,但它只是工作,并将证书放入 LocalMachine 证书存储的“ Personal”部分。 您可以通过执行以下命令来验证它的创建:

ls cert:\LocalMachine\My

要信任它,只需复制它并使用证书管理器粘贴到“受信任的根证书颁发机构”(确保查看的是本地机器证书,而不是当前用户!).

如果在 IIS 中绑定到此证书,则应该能够按下 https://gandalf.dummy.dev/并在没有任何警告的情况下获得安全连接。

最后一部分,在 NodeJS 中使用它,已经在上面和其他 SO 答案中进行了描述,所以我只想补充一点,在 Windows 上,使用结合了 cert 和私钥的 pfx 文件更容易。您可以轻松地从证书管理器导出 pfx,但它确实会影响您在 NodeJS 中使用它的方式。当使用“ https”模块实例化服务器时,您将使用的选项(而不是“ key”和“ cert”)是“ pfx”和“ passsphrase”,如下所示:

var https = require('https');
var options = {
pfx: fs.readFileSync('mypfxfile'),
passphrase: 'foo'
};
var server = https.createServer(options);

转到: chrome://flags/

Enable: 允许从本地主机加载的资源使用无效证书。

你没有绿色安全,但你总是允许 https://localhost铬。

来自@FiloSottiles 的 Mkcert 让这个过程变得无比简单:

  1. 安装 Mkcert时,有关于 macOS/Windows/Linux 的说明
  2. mkcert -install创建本地 CA
  3. 为工作目录中的 localhost 创建一个受信任的证书
  4. 您正在使用 node (它不使用系统根存储) ,因此需要在一个环境变量中使用 显式指定 CA,例如: export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. 最后使用其他答案中描述的设置运行快递服务器(例如下面)
  6. 砰,当地主持人身着绿色泳衣。

基本节点设置:

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

如果您需要比@alon 的详细步骤更进一步,并且还需要创建一个自签名的 ca:

https.createServer({
key: fs.readFileSync(NODE_SSL_KEY),
cert: fs.readFileSync(NODE_SSL_CERT),
ca: fs.readFileSync(NODE_SSL_CA),
}, app).listen(PORT, () => {});

包裹 Json

"setup:https": "openssl genrsa -out src/server/ssl/localhost.key 2048
&& openssl req -new -x509 -key src/server/ssl/localhost.key -out src/server/ssl/localhost.crt -config src/server/ssl/localhost.cnf
&& openssl req -new -out src/server/ssl/localhost.csr -config src/server/ssl/localhost.cnf
&& openssl x509 -req -in src/server/ssl/localhost.csr -CA src/server/ssl/localhost.crt -CAkey src/server/ssl/localhost.key -CAcreateserial -out src/server/ssl/ca.crt",

如下所述使用 Localhost.cnf:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = UK
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

SMH,由于缺乏适当的文档,并且不是每个人都使用 IIS,在这个问题上浪费了大量的时间... 如果还有人在这个问题上卡住了,我希望这能有所帮助。

解决方案: Windows10本地主机的可信自签名 SSL CERT

注意: 如果您只需要 SSL 证书,请遵循证书创建部分

栈: Azure 函数应用程序(Node.js) ,React.js-Windows 10

创造证明文件

步骤1-创建证书: OpenPowershell并运行以下命令:

New-SelfSignedCertificate -NotBefore (Get-Date) -NotAfter (Get-Date).AddYears(5) `
-Subject "CN=localhost" -KeyAlgorithm "RSA" -KeyLength 2048 `
-HashAlgorithm "SHA256" -CertStoreLocation "Cert:\CurrentUser\My" `
-FriendlyName "HTTPS Development Certificate" `
-TextExtension @("2.5.29.19={text}","2.5.29.17={text}DNS=localhost")

步骤2-复制证书: 通过按下 windows 键并搜索“管理用户证书”来打开 Certificate Manager。导航到 Personal -> Certificates并将本地主机证书复制到 Trusted Root Certification Authorities -> Certificates

个人-> 证书

受信任的根证书颁发机构-> 证书

(友好名称将是 HTTPS 开发证书)

步骤3。导出证书 right click cert -> All Tasks -> Export,它将启动证书导出向导: 证书导出向导

  • 点击下一步
  • 选择 Yes, export the private Key 导出私钥
  • 选择以下格式 Personal Information Exchange - PKCS #12,并保留选中的第一个和最后一个复选框
  • 选择一个密码; 如果您喜欢 ex.“1111”,请输入一些简单的内容
  • 将文件保存到能够记住 ex.Desktop 或 Sites (可以将文件命名为 development.pfx)的位置

第四步 重启 Chrome

Azure 函数应用程序(服务器)-带.PFX 的本地 SSL

在这种情况下,我们将运行一个具有 SSL 证书的 Azure 函数应用程序。

  • 将导出的 development.pfx 文件复制到蔚蓝色函数项目根目录
  • 从 cmd.exe 运行以下命令启动函数应用程序 func start --useHttps --cert development.pfx --password 1111"(如果您使用了不同的密码和文件名,不要忘记更新脚本 中的值)
  • 更新你的 package.json脚本来启动你的函数应用程序:

React App (客户端)-使用本地 SSL 运行

在本地安装 openssl,这将用于将 development.pfx转换为 cert.pemserver.key.Source-将 pfx 转换为 pem 文件

  1. 打开您的反应应用程序项目根目录并创建一个 cert 文件夹。(project-root/cert)
  2. 在 cert 文件夹中创建 development.pfx文件的副本
  3. 从 cert 目录打开命令提示符并运行以下命令:
  4. 将 development.pfx 转换为 cert.pem: openssl pkcs12 -in development.pfx -out cert.pem -nodes
  5. 从 development.pfx 提取私钥到 key.pem: openssl pkcs12 -in development.pfx -nocerts -out key.pem
  6. 从提取的私钥中删除密码: openssl rsa -in key.pem -out server.key
  7. 通过添加以下代码行来更新 .env.development.local文件:
SSL_CRT_FILE=cert.pem
SSL_KEY_FILE=server.key
  1. 启动你的反应应用程序 npm start

对于窗口,请遵循以下简单步骤。

  1. 打开 Windows PowerShellrun as administrator
  2. 在此 超链接之后安装 Chocolatey
  3. 使用 choco install mkcert安装 mkcert
  4. 运行 mkcert -install将创建本地 CA。
  5. 运行 mkcert localhost 127.0.0.1 ::1将在工作目录中为 localhost 创建一个受信任的 cert。
  6. 在服务器中分别使用生成的 ./localhost+2.pem./localhost+2-key.pem作为 cert 和 key。(添加密钥和证书因服务器而异。)
  7. 最后使用其他各种答案中描述的设置运行服务器(对于 Express server,如下所示)
    const https = require('https');
const fs = require('fs');
const express = require('express');


const app = express();




app.get('/', function(req, res){
res.send("HELLO!");
});


const server = https.createServer({
key: fs.readFileSync('./localhost+2-key.pem'), // path to localhost+2-key.pem
cert: fs.readFileSync('./localhost+2.pem'), // path to localhost+2.pem
requestCert: false,
rejectUnauthorized: false,
}, app).listen(3000, function(){
console.log("Successfully started server on port 3000");
});

然后使用 node server.js

  1. 在您的浏览器上使用 https://localhost:3000,您将看到一个锁定的地址栏。

好好享受吧!

在我的情况下,.cert总是变成默认(这意味着拒绝)什么,我们总是变成始终信任。 我的设备是 MacOS

  1. 命令 + space,键入 keychain access并打开它。
  2. 因此,我们需要 drag and drop into系统钥匙链-> 系统的 . cert 文件和双击文件-> 获取信息-> 使其变化始终受信任
  3. 所以我的 用于本地主机或127.0.0.1的 chrome超链接进程不安全是可见的,在其消失类型之前。
openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.cert -days 365

为了跟踪上面@Alon 和@Diego 的答案,下面应该去掉一些手动浏览器步骤:

  1. 创建请求配置文件[作为 ./req.cnf] :
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = NG
ST = Lagos
L = Ikeja
O = Acme
OU = Dev
CN = localhost
[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
  1. 创建证书文件[在终端中运行以下命令] :
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout client-cert.key -out client-cert.pem -config req.cnf -sha256
  1. 将受信任证书添加到您的钥匙链:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ./client-cert.pem

注意 : 根据您的具体位置更新 req.cnf等。

注意 : 此程序在 MacOS High Sierra (10.13.6)上进行了测试。如果使用 Windows,则可能需要为步骤3提供一个替代命令。