【问题标题】:create a trusted self-signed SSL cert for localhost (for use with Express/Node)为 localhost 创建一个受信任的自签名 SSL 证书(用于 Express/Node)
【发布时间】:2014-02-19 07:00:34
【问题描述】:

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

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

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

【问题讨论】:

  • 没有一个自签名证书可以被 Web 浏览器信任。它们不是由受信任的签名机构签署的。
  • 这不是真的:您可以安装根证书以使您的自签名证书受信任。但是我似乎无法正确执行此操作。我读到您可以在 IE 中安装证书链(而不是在 chrome 中),所以我尝试了,但仍然无法识别。我不知道是因为 localhost 很特殊还是自签名证书不正确。
  • 我从来没有在 Chrome 之类的浏览器上使用过自签名证书。这是我的解决方法:我为 local.MYDOMAIN.com 创建了一个指向 127.0.0.1 (localhost) 的 DNS 条目,然后只使用我的生产证书。这具有确保生产证书链等没有问题的额外好处。

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


【解决方案1】:

上面的答案是片面的。我花了这么多时间让这个工作,这太疯狂了。注意我未来的自己,这是你需要做的:

我正在使用 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 文件夹之外,在您的 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 中打开开发工具,转到安全面板,然后单击查看证书。

步骤 7. 进入详细信息面板,点击复制文件,然后当证书导出向导出现时,点击下一步,如下所示:

第8步 离开DER编码,点击下一步,选择Browse,放在桌面这样易于访问的文件夹中,并将证书命名为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 时,您应该会看到:

【讨论】:

  • 嗨,当我完成所有步骤时,我打开了https://localhost:3000,Chrome 卡在加载中。谁能告诉我可能是什么原因?
  • 如果您对网络上的地址执行此操作,我发现将证书 DNS 设置为主机名,例如:DNS.1 = server.local 然后在连接机器上更新 HOSTS 文件以指向服务器IP 地址到主机名,例如:192.168.0.50 server.local 这将允许证书和地址匹配并验证证书。
  • 我找到了我自己问题的半答案:例如,如果您将 CN 和 DNS.1 更改为“local.com”之类的内容,并且在每台需要访问服务器的计算机中,请更改etc/hosts 文件将 local.com 指向服务器的 ip,这是可行的。
  • 第 2 步是在窗口中创建问题。 14148:error:0D07A097:asn1 编码例程:ASN1_mbstring_ncopy:string too long:.\crypto\asn1\a_mbstr.c:158:maxsize=2
  • @HermenpreetSingh 国家首字母有问题,你可能只是没有更改req.cnf中的行C = Country initials like US, RO, GE,应该只是C = US之类的东西
【解决方案2】:

最短路径。 已在 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 中找到并双击它
  • 扩展“信任”并将“使用此证书时”更改为“始终信任”。
  • 系统可能会提示您进行身份验证。
  • 重新启动服务器。
  • 刷新您的浏览器。
  • 享受吧! :)

【讨论】:

【解决方案3】:

您可以尝试使用 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 有一个自签名证书。

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

如果有人曾经用自签名证书绕过这个错误,请赐教。

【讨论】:

  • 您的证书仍然不受信任,因此您遇到了与我描述的相同的问题。我需要信任它才能正确测试/调试 Web 服务。
  • 所以你希望这个证书只在你的本地机器上被信任,而不是在网络上?
  • 答案顶部的链接推荐 1024 位 3DES 加密,这已经过时了。最好使用openssl genrsa -out key.pem 2048 以获得更好的密钥。
  • 您的证书仍然不受信任。
  • 上面的快速代码有效,利用github.com/FiloSottile/mkcert(而不是openSSL)创建本地CA/受信任的证书。一路绿条。
【解决方案4】:

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

  1. 安装mkcert,有macOS/Windows/Linux的说明
  2. mkcert -install 创建本地 CA
  3. mkcert localhost 127.0.0.1 ::1 为当前目录中的 localhost 创建可信证书
  4. 您正在使用节点(不使用系统根存储),因此您需要在环境变量中specify the CA explicitly,例如: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 受信任的证书颁发机构。如其他答案所述。
【解决方案5】:

如何为本地主机生成 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

【讨论】:

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

发布的一些答案也对我解决这个问题非常有用。不过,我也对最少步数感兴趣,最好避免使用 OpenSSL(在 Windows 10 上)。

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

在我的例子中,我使用 SS 证书来保护 NodeJS 中的 websocket,并且该套接字是以编程方式连接到的(而不是通过浏览器)。因此,对我来说,在没有警告或错误的情况下接受证书至关重要,关键是要使用适当的 CN 创建证书(当然,如答案中其他地方所述,将证书接受到受信任的机构) .使用 IIS 创建自签名证书不会创建正确的 CN,因此我使用 Powershell 发现了以下 simple 命令:

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

这必须在 PS 管理控制台中运行,但它可以正常工作,并将证书放入 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);

【讨论】:

    【解决方案7】:

    这对我有用

    在窗户上

    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 添加到我的主机文件中,然后使用我的生产证书。仅当您希望您的生产密钥在您的开发盒上可用时才有用,所以我认为您的解决方案仍然有效,如果其他人可以请验证
    • 它适用于我和我的团队,以多种方式保护本地到本地服务器以保护本地到生产服务器。
    • 对于 Windows,使用来自 here 的 openssl 命令,git bash 控制台工作得很好。只需安装根证书,您可以根据需要创建多个由它签名的特定于站点的证书。
    【解决方案8】:

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

    这是一个手动过程,但我终于成功了。只需确保将公用名 (CN) 设置为“localhost”(不带端口),并在添加证书后确保证书上的所有信任选项都设置为“始终信任”。还要确保将其添加到“系统”钥匙串,而不是“登录”钥匙串。

    【讨论】:

    • 他提到IE,说明他用的是Windows。
    【解决方案9】:

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

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

    【讨论】:

      【解决方案10】:

      转至:chrome://flags/

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

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

      【讨论】:

        【解决方案11】:

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

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

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

        【讨论】:

          【解决方案12】:

          还有更多方面。

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

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

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

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

          【讨论】:

            【解决方案13】:

            对于 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,您会在地址栏中看到一个锁。

            享受!!

            【讨论】:

              【解决方案14】:

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

              解决方案:适用于 Windows 10 上 localhost 的可信自签名 SSL CERT

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

              堆栈: Azure Function App(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 函数应用程序(服务器)- 本地 SSL 与 .PFX

              在这种情况下,我们将使用 SSL 证书运行 Azure Function App。

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

              【讨论】:

                【解决方案15】:

                如果您需要比@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
                

                【讨论】:

                  【解决方案16】:

                  在我的情况下,.cert 总是更改为默认值(这意味着拒绝)我们已经更改为始终信任。 我的设备是 ma​​cOS

                  1. command + space ,输入keychain access并打开它。
                  2. 所以我们需要drag and drop into System Keychains -> .cert 文件的系统 并双击文件 -> 获取信息 -> 使其更改始终受信任
                  3. 所以我的 chrome for localhost 或 127.0.0.1 超链接进程 unsafe 在它消失的类型之前是可见的。
                  openssl genrsa -out server.key 2048
                  openssl req -new -x509 -key server.key -out server.cert -days 365
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-09-28
                    • 1970-01-01
                    • 2018-04-16
                    • 2011-01-13
                    • 1970-01-01
                    • 2021-01-09
                    • 2015-11-02
                    • 2013-02-08
                    • 1970-01-01
                    相关资源
                    最近更新 更多