为本地主机创建一个受信任的自签名SSL证书(用于Express / Node)


129

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

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

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


任何自签名证书都不能被Web浏览器信任。它们不是由受信任的签名机构签名的。

1
事实并非如此:您可以安装根证书来使您的自签名证书受信任。但是我似乎无法正确执行此操作。我读到您可以在IE中安装证书链(而不是在chrome中),所以我尝试了一下,但是仍然无法识别。我不知道这是因为本地主机是特殊的还是自签名证书不正确。
JasonS 2014年

3
我从未获得过与Chrome等浏览器一起使用的自签名证书。这是我的解决方法:我为local.MYDOMAIN.com创建了一个指向127.0.0.1(localhost)的DNS条目,然后仅使用我的生产证书。这使得额外的好处肯定有你的生产证书链等没有问题
JASONS

Answers:


85

上面的答案是不完整的。我花了很多时间来使它工作,这太疯狂了。注意我未来的自我,这是您需要做的:

我正在使用带有Chrome 65的Windows10。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

有关此字段的说明在这里

步骤3.导航到终端中的security文件夹,然后键入以下命令:

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

步骤4.然后在security文件夹之外,在您的express应用程序中执行以下操作:(贷记到@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,转到“安全”面板,然后单击“查看证书”。 在此处输入图片说明

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

转到详细信息-复制文件-导出向导中的下一步

步骤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时应看到: 要爱绿色


嗨,当我完成所有步骤后,我打开https://localhost:3000并且Chrome卡在加载中。有人可以说出原因吗?
co.zohar

@ co.zohar控制台中是否有任何消息?按crl+shift+iF12打开控制台。
AIon

1
如果你这样做是对网络上的地址,我发现该证书DNS设置的主机名,例如:DNS.1 = server.local 然后在连接机器更新的HOSTS文件指向服务器IP地址,主机名,例如: 192.168.0.50 server.local这将允许证书和地址匹配并验证证书。
roskelld

控制台上的@AI不会显示任何内容。该页面仅显示:“正在等待localhost ...”。您是否在hosts文件中配置了任何内容?
co.zohar

1
我对自己的问题找到了一个半答案:例如,如果将CN和DNS.1更改为类似“ local.com”的名称,并且在需要访问服务器的每台计算机中,将etc / hosts文件更改为指向本地.com到服务器的ip,可以正常工作。
TKoL

110

最短的方法。 在MacOS上进行了测试,但在其他OS上也可以类似地工作。

产生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在Google Chrome浏览器中打开,您会发现它不安全。然而!
  • 在“开发人员工具”>“安全性”>“查看证书”中:将图像拖到桌面上,然后双击它。
  • 点击“添加”
  • 在钥匙串访问中找到它,然后双击它
  • 展开“信任”,并将“使用此证书时”更改为“始终信任”。
  • 可能会提示您进行身份验证。
  • 重新启动服务器。
  • 刷新浏览器。
  • 请享用!:)

1
如果要在Mac上执行此操作,则还有另一个链接:certsimple.com/blog/localhost-ssl-fix
约翰·

美丽!这工作了!我还要添加:从此处安装OpenSSL:indy.fulgan.com/SSL/?C=M ; O=A。获得从这里.CNF文件:然后,从这里配置它:gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/... 和OpenSSL的配置从这里:stackoverflow.com/questions/7360602/...
何塞一

2
我想补充一点,对于Chrome 58+,您将收到一个错误“主题备用名称丢失”。stackoverflow.com/a/42917227/1057052。检查下面的答案更多的帮助:stackoverflow.com/a/43666288/1057052stackoverflow.com/a/44398368/1057052
何塞一

14
Drag image to your desktop and double click it->我不能将任何东西拖到我的桌面上,也不能拖拽.. image您到底在说什么矿石?
AIon

7
要克服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代替建议的第一行。而且这个人也会在此过程中问更少的问题……
Michael Litvin

78

您可以尝试使用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");
});

这在我的本地计算机以及部署此服务器的服务器上都可以正常工作。我在服务器中拥有的一个是从goDaddy购买的,但是localhost具有自签名证书。

但是,每个浏览器都抛出一个错误,指出连接不受信任,您是否要继续。单击继续后,它工作正常。

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


9
您的证书仍然不受信任,因此您遇到的问题与我描述的相同。我需要它被信任以正确测试/调试Web服务。
JasonS 2014年

1
因此,您是否希望仅在本地计算机而不是网络中信任此证书?

1
答案顶部的链接建议使用1024位3DES加密,这已经过时了。更好地使用openssl genrsa -out key.pem 2048更好的密钥。
蒸汽动力

3
您的证书仍然不受信任。
Diego Mello

2
上面的快速代码可以工作,利用github.com/FiloSottile/mkcert(而不是openSSL)创建本地CA /受信任的证书。一路绿色。
索姆

11

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

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

1
这是我在过去2个小时内上网搜索的解决方案。对于ubuntu中的任何人,请移动cp server.crt /usr/local/share/ca-certificates/.并运行sudo update-ca-certificates然后localhost https请求在NodeJS 8+下运行。ID也增加1024 to 2048
Salyangoz

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中使用运行/调试配置,请确保对其进行更新。

创建cookiem时,请将“ .YOURSITE.net”用作cookiedomain(在开头带有一个点),然后它应可用于所有子域。

2)使用该localdev.url创建证书

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

3)按照 http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/ 所述导入证书


嗨,特洛伊,谢谢分享。其他人将不得不对此发表评论。解决方法:我最终将dev.phantomjscloud.com添加到主机文件中,然后使用生产证书。不过,这仅在您希望在生产盒中提供生产密钥的情况下有用,因此,我认为您的解决方案仍然有效,如果其他人可以请进行验证
JasonS 2014年

它以多种方式对我和我的团队有效,可以保护本地到本地服务器到本地到生产服务器的安全。
TroyWorks,2014年

对于Windows,git bash控制台使用来自here的 openssl命令非常有效。只需安装根证书,即可根据需要创建多个由它签名的特定于站点的证书。
杰森·古玛

6

@FiloSottile的Mkcert使此过程变得更加简单:

  1. 安装mkcert,其中包含有关macOS / Windows / Linux的说明
  2. mkcert -install 创建本地CA
  3. mkcert localhost 127.0.0.1 ::1 在当前目录中为本地主机创建受信任的证书
  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

效果很好!使用这种方法,我们无需在chrome / windows证书存储区中将自签名证书注册为CA可信证书颁发机构。如其他答案所述。
zaheer

4

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

这是一个手动过程,但最终使它起作用。只需确保将公用名(CN)设置为“本地主机”(不带端口),并且在添加证书之后,请确保证书上的所有“信任”选项都设置为“始终信任”。还要确保将其添加到“系统”钥匙串而不是“登录”钥匙串。


他提到IE,这表示他正在使用Windows。
2位元

3

如果您使用的是节点,为什么不使用节点生成它们呢?这个模块似乎功能齐全:

请注意,我不会即时生成。使用某种构建脚本生成,因此您具有一致的证书和密钥。否则,您每次必须授权新生成的自签名证书。


3

发布的某些答案对我也很有帮助,可以克服这个问题。但是,我也对最少的步骤数量感兴趣,并且理想情况下,避免使用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 Admin控制台中运行,但它确实可以正常运行,并将证书放入LocalMachine证书存储的“个人”部分。您可以通过执行以下命令来验证它是否已创建:

ls cert:\LocalMachine\My 

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

如果您在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);

2

在Windows上,我通过使用MMC(开始>运行> mmc)使iis开发证书受信任,然后添加证书管理单元,选择“本地计算机”并接受默认设置。添加该证书快照后,展开本地计算机证书树以在“个人”下查找,选择localhost证书,右键单击>所有任务>导出。接受导出向导中的所有默认设置。

保存该文件后,展开受信任的证书并开始导入刚刚导出的证书。https://localhost现在不受任何安全警告的chrome所信任。

我使用了MSDN博客中的本指南第2号决议,该操作人员还在他的问题中分享了一个链接,该链接也应使用MMC,但这对我有用。 分辨率#2


2

去: chrome://flags/

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

您没有绿色安全性,但在chrome 中始终允许使用https:// localhost


2

这还有更多方面。

您可以使用带有或不带有自签名的证书来实现TLS(有些人会说SSL)。

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

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

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


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.