为localhost创建受信任的自签名SSL证书(用于Express/Node)

Jas*_*onS 110 openssl localhost ssl-certificate node.js express

尝试遵循有关创建自签名证书以与localhost一起使用的各种说明,大多数说明似乎适用于IIS,但我正在尝试使用Nodejs/Express.它们都没有正常工作,因为在安装证书时,它不受信任.这是我尝试过的失败:

有人可以提供可以做到这一点的工作流程吗? 我可以安装一个证书,但我无法让chrome(v32)或IE(v10)中的证书受到信任.

编辑:在评论中建议问题是没有受信任的cert-root.我通过IE安装了证书,但它仍然不受信任.

Die*_*llo 97

最短路. 在MacOS上测试过,但在其他操作系统上可能会有类似的效果.

生成pem

> openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365

> openssl rsa -in keytmp.pem -out key.pem
Run Code Online (Sandbox Code Playgroud)

你的快递服务器

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)
})
Run Code Online (Sandbox Code Playgroud)
  • https://localhost:3000在谷歌浏览器中打开,你会发现它不安全.然而!
  • 在开发人员工具>安全性>查看证书中:将图像拖到桌面并双击它.
  • 点击"添加"
  • 在Keychain Access中找到它并双击它
  • 展开"信任"并将"使用此证书时"更改为"始终信任".
  • 系统可能会提示您进行身份验证.
  • 重启服务器.
  • 刷新浏览器.
  • 请享用!:)

  • `将图像拖到桌面上然后双击它` - >我无法将任何内容拖到我的桌面上,不可拖动..你在说什么`image`准确? (13认同)
  • 要克服Chrome中的"主题备用名称缺失",您可以执行`openssl req -newkey rsa:2048 -x509 -nodes -keyout keytmp.pem -new -out cert.pem -subj/CN = localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf'[SAN] \nsubjectAltName = DNS:localhost')) - sha256 -days 3650`而不是您建议的第一行.而且这个问题在这个过程中会少提问... (5认同)
  • 我想为Chrome 58+添加一个,您将收到一个错误“主题备用名称丢失”。https://stackoverflow.com/a/42917227/1057052。检查下面的答案以获取更多帮助:/sf/answers/3056640191/,/sf/answers/3107885791/ (2认同)

小智 77

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

您将需要一个.key和.crt文件来将HTTPS添加到节点JS express服务器.生成此代码后,使用此代码将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");
});
Run Code Online (Sandbox Code Playgroud)

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

但是,每个浏览器都会抛出错误,说连接不受信任,是否要继续.点击"继续"后,它运行正常.

如果有人用自签名证书绕过了这个错误,请指教.

  • 您的证书仍然不受信任,因此您遇到的问题与我描述的相同.我需要它可以正确地测试/调试Web服务. (8认同)
  • 您的证书仍然不受信任. (3认同)
  • 上面的快速代码有效,利用 https://github.com/FiloSottile/mkcert(而不是 openSSL)创建本地 CA/可信证书。一路绿条。 (2认同)

AIo*_*Ion 58

上面的答案是部分的.我花了很多时间来完成这项工作,这太疯狂了.请注意我未来的自我,这是你需要做的:

我正在使用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
Run Code Online (Sandbox Code Playgroud)

这个领域的解释在这里.

步骤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
Run Code Online (Sandbox Code Playgroud)

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)
    })
Run Code Online (Sandbox Code Playgroud)

步骤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.转到"受信任的根证书颁发机构"面板,然后单击"导入".

转到

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

步骤11.单击"浏览",找到localhost.cer,保留默认值,然后单击下一次 - 直到出现此警告,单击"是".

确认安全例外

步骤12.关闭所有内容,然后重新启动chrome.然后,当https://localhost:3000你去看时你应该看到: 得爱绿色

  • 第 2 步是在窗口中创建问题。14148:错误:0D07A097:asn1编码例程:ASN1_mbstring_ncopy:字符串太长:.\crypto\asn1\a_mbstr.c:158:maxsize = 2 (3认同)
  • @HermenpreetSingh 这是国家/地区缩写的问题,您可能只是没有更改 req.cnf 中的行“C = 国家/地区缩写,例如 US、RO、GE”,它应该类似于“C = US” (2认同)

som*_*som 17

@FiloSottile的 Mkcert 使这个过程无限简单:

  1. 安装mkcert,macOS/Windows/Linux 有说明
  2. mkcert -install 创建本地 CA
  3. mkcert localhost 127.0.0.1 ::1 在当前目录中为 localhost 创建可信证书
  4. 您正在使用节点(它不使用系统根存储),因此您需要在环境变量中明确指定 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
Run Code Online (Sandbox Code Playgroud)


fum*_*uma 11

如何为localhost:link生成SSL证书

openssl genrsa -des3 -out server.key 1024
Run Code Online (Sandbox Code Playgroud)

您需要在此处输入密码,您需要在以下步骤中重新输入密码

openssl req -new -key server.key -out server.csr
Run Code Online (Sandbox Code Playgroud)

当被问到"Common Name"时输入:localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
Run Code Online (Sandbox Code Playgroud)


tom*_*omo 7

发布的一些答案也对我克服这个问题非常有用。但是,我也对最少的步骤数感兴趣,并且最好避免使用 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:\LocalMachine\My"
Run Code Online (Sandbox Code Playgroud)

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

ls cert:\LocalMachine\My 
Run Code Online (Sandbox Code Playgroud)

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

如果您在 IIS 中绑定到此证书,您应该能够点击https://gandalf.dummy.dev/并获得安全连接而不会出现任何警告。

最后一部分,在 NodeJS 中使用它,在上面和其他 SO 答案中进行了描述,所以我只会在 Windows 上添加它,使用结合了证书和私钥的 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);
Run Code Online (Sandbox Code Playgroud)


小智 7

对于 Windows,请按照以下简单步骤操作。

  1. 打开Windows PowerShellrun as administrator
  2. Chocolatey按照此超链接进行安装。
  3. 使用choco install mkcert来安装mkcert.
  4. 运行mkcert -install将创建本地 CA。
  5. runmkcert localhost 127.0.0.1 ::1将在当前目录中为 localhost 创建受信任的证书。
  6. 分别使用服务器中生成的./localhost+2.pem和作为证书和密钥。./localhost+2-key.pem(添加密钥和证书因服务器而异。)
  7. 最后使用各种其他答案中描述的设置运行您的服务器(对于 Express 服务器,如下所示)
    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");
    });
Run Code Online (Sandbox Code Playgroud)

然后使用运行你的服务器 node server.js

  1. 使用浏览器时https://localhost:3000,您会在地址栏中看到一个锁。

享受!!


Tro*_*rks 6

这是什么对我有用

在窗户上

1)将其添加到%WINDIR%\ System32\drivers\etc\hosts文件:127.0.0.1 localdev.YOURSITE.net (导致浏览器出现'localhost'问题(用于跨源脚本)

Windows Vista和Windows 7 Vista和Windows 7使用用户帐户控制(UAC),因此必须以管理员身份运行记事本.

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

  2. 右键单击记事本,然后选择以管理员身份运行

  3. 单击"Windows需要您的权限"UAC窗口上的继续.

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

  5. 在文件名字段中,键入C:\ Windows\System32\Drivers\etc\hosts

  6. 单击打开

  7. 将其添加到%WINDIR%\ System32\drivers\etc\hosts文件: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"作为cookiedomain(在开头有一个点),然后它应该适用于所有子域.

2)使用localdev.url创建证书

提示:如果您在Windows上生成证书时遇到问题,请使用VirtualBox或Vmware计算机.

3)导入 http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/上列出的证书