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

时间:2014-01-28 05:46:11

标签: node.js express openssl localhost ssl-certificate

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

有人可以提供可以执行此操作的工作流程吗? 我可以安装证书,但是我无法让chrome(v32)或IE(v10)中的证书受到信任。

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

15 个答案:

答案 0 :(得分:95)

最短路。 在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)
})
  • 在Google Chrome中打开https://localhost:3000,您会发现它不安全。但是!
  • 在开发人员工具中>安全>查看证书:将图像拖到桌面并双击它。
  • 点击“添加”
  • 在Keychain Access中找到它并双击它
  • 展开“信任”并将“使用此证书时”更改为“始终信任”。
  • 系统可能会提示您进行身份验证。
  • 重新启动服务器。
  • 刷新浏览器。
  • 享受! :)

答案 1 :(得分:77)

您可以尝试使用openSSL生成证书。 看看this

您将需要一个.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");
});

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

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

如果有人曾使用自签名证书绕过此错误,请启发。

答案 2 :(得分:42)

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

我正在使用Chrome 65在Windows 10上工作。火狐的表现很好 - 只需将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中打开开发工具,转到“安全”面板,然后单击“查看证书”。 enter image description here

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

go to details - copy file - next on export wizard

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

步骤9。通过将其插入网址框打开chrome://settings/。在下方点击Advanced / Advanced Options,然后向下滚动以查找Manage Certificates

choose manage certificates

步骤10. 转到“受信任的根证书颁发机构”面板,然后点击“导入”。

Go to Trusted Root Certification Authorities panel, and click import

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

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

confirm security exception

第12步。关闭所有内容,然后重新启动Chrome。然后,当你去https://localhost:3000时,你应该看到: gotta love the green

答案 3 :(得分:11)

如何为localhost生成SSL证书:link

openssl genrsa -des3 -out server.key 1024

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

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

当被询问“公共名称”时输入: localhost

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

答案 4 :(得分:6)

这里有什么为我工作的

在Windows上

1)将其添加到%WINDIR%\ System32 \ drivers \ etc \ hosts文件:127.0.0.1 localdev.YOURSITE.net (因为浏览器出现问题&#39; localhost&#39 ;(对于跨源脚本)

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

  1. 点击开始 - &gt;所有程序 - &gt;附件

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

  3. 点击&#34; Windows需要您的许可&#34; UAC窗口。

  4. 记事本打开时单击文件 - &gt;打开

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

  6. 点击打开

  7. 将此项添加到%WINDIR%\ System32 \ drivers \ etc \ hosts文件:127.0.0.1 localdev.YOURSITE.net

  8. 保存

  9. 关闭并重新启动浏览器

  10. 在Mac或Linux上:

    1. su权限
    2. 打开/ etc / hosts
    3. 添加127.0.0.1 localdev.YOURSITE.net
    4. 保存
    5. 开发时使用localdev.YOURSITE.net而不是localhost,因此如果您在ide中使用运行/调试配置,请务必更新它。

      使用&#34; .YOURSITE.net&#34;作为cookiedomain(在开头有一个点),在创建cookie时,它应该适用于所有子域。

      2)使用localdev.url

      创建证书

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

      3)按照中的说明导入证书 http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

答案 5 :(得分:4)

如果您使用的是OSX / Chrome,则可以按照此处的说明将自签名SSL证书添加到系统密钥链中:http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates

这是一个手动过程,但我最终得到了它。只需确保公共名称(CN)设置为&#34; localhost&#34; (没有端口)并且在添加证书之后,确保证书上的所有Trust选项都设置为&#34; Always Trust&#34;。还要确保将其添加到&#34;系统&#34;钥匙串,而不是&#34;登录&#34;钥匙串。

答案 6 :(得分:3)

如果你正在使用节点,为什么不用节点生成它们?这个模块看起来非常全面:

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

答案 7 :(得分:2)

Windows上的

我通过使用MMC(开始&gt;运行&gt; mmc)使iis开发证书受信任,然后添加证书管理单元,选择“本地计算机”并接受默认值。添加该证书snapip后,展开本地计算机证书树以查看Personal,选择localhost证书,右键单击&gt;所有任务&gt;出口。接受导出向导中的所有默认值。

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

我在MSDN博客中使用了这个指南resolution #2,操作系统也在他的问题中分享了一个链接,也应该使用MMC,但这对我有用。 resolution #2

答案 8 :(得分:2)

还有更多方面。

您可以使用自签名的证书来实现TLS(有些人一直在说SSL)。

要为自签名证书设置绿色条,您还需要成为证书颁发机构(CA)。在我在本地开发设置中实现绿色条的过程中发现的大多数资源中都缺少这方面。成为CA就像创建证书一样简单。

此资源涵盖了CA证书和服务器证书的创建,并导致我在localhost Chrome,Firefox和Edge上显示绿色条的设置: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

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

答案 9 :(得分:1)

发布的一些答案中有一些对我来说非常有用,可以解决这个问题。但是,我也对最小步数感兴趣,理想情况下,避免使用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"

这必须在PS管理控制台中运行,但它只是起作用,并将证书放入&#34;个人&#34; LocalMachine证书库的一部分。 您可以通过执行以下命令验证它是否已创建:

ls cert:\LocalMachine\My 

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

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

上面和其他SO答案中描述了在NodeJS中使用它的最后一部分,因此我只在Windows上添加它,使用结合了证书和私钥的pfx文件更容易。您可以从证书管理器轻松导出pfx,但它确实会影响您在NodeJS中的使用方式。使用&#39; https&#39;实例化服务器时模块,您将使用的选项(而不是&#39;密钥&#39;证书&#39;)将是&#39; pfx&#39;和&#39;密码&#39;,如:

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

答案 10 :(得分:1)

转到:chrome://flags/

启用:允许从localhost加载资源的无效证书。

您没有绿色安全保护,但您始终可以使用Chrome中的https://localhost

答案 11 :(得分:1)

@FiloSottile的

Mkcert使这个过程变得更加简单:

  1. 安装mkcert,其中有关于macOS / Windows / Linux的说明
  2. thebankwebsite.com创建本地CA
  3. mkcert -install为当前目录中的localhost创建受信任的证书
  4. 您正在使用节点(不使用系统根存储),因此您需要在环境变量中specify the CA explicitly,例如:mkcert localhost 127.0.0.1 ::1
  5. 最后使用其他各种答案(例如以下)中所述的设置来运行您的Express服务器
  6. 景气。本地主机以绿色游泳。

基本节点设置:

export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"

答案 12 :(得分:0)

如果您需要比@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, () => {});

package.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

答案 13 :(得分:0)

SMH,由于缺乏适当的文档,并且不是每个人都使用 IIS,因此浪费了很多时间……如果还有其他人仍然坚持这个问题,我希望这会有所帮助。

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

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

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

证书制作

第 1 步 - 创建证书:打开Powershell并运行以下命令:

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

Personal -> Certificates

Trusted Root Certification Authorities -> Certificates

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

第 3 步:导出证书 right click cert -> All Tasks -> Export 将启动证书导出向导: Certificate Export Wizard

  • 点击下一步
  • 选择Yes, export the private Key Export private key
  • 选择以下格式 Personal Information Exchange - PKCS #12 并选中第一个和最后一个复选框。 Export format
  • 选择一个密码;如果你喜欢 ex,输入一些简单的东西。 “1111”Enter password
  • 将文件保存到您会记住的位置,例如。桌面或站点(您可以将文件命名为 development.pfx)Save file

第 4 步。重新启动 Chrome

Azure Function 应用程序(服务器)- 使用 .PFX 本地 SSL

在本例中,我们将使用 SSL 证书运行 Azure Function App。

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

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

在本地安装 openssl,这将用于将 development.pfx 转换为 cert.pemserver.keySource - Convert pfx to pem file

  1. 打开您的 React 应用项目根目录并创建一个 cert 文件夹。 (project-root/cert)
  2. 在 cert 文件夹中创建 development.pfx 文件的副本。 (project-root /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. 启动您的 React 应用 npm start

答案 14 :(得分:0)

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

  1. 打开Windows PowerShellrun as administrator
  2. 按照此 hyperlink 安装 Chocolatey
  3. 使用 choco install mkcert 安装 mkcert
  4. 运行 mkcert -install 将创建本地 CA。
  5. run mkcert 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");
    });

然后使用 node server.js

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

享受!!