99

我正在使用 Node.js 中的 Express 框架来创建 Web 服务器。我想使用 ssl 来连接网络服务器。

创建 https 网络服务器的代码如下。

var app = express.createServer({
  key: fs.readFileSync('./conf/key.pem'),
  cert: fs.readFileSync('./conf/cert.pem')
});
module.exports = app;

问题:如何创建express所需的key.pem和cert.pem?

4

3 回答 3

211

您需要的两个文件是 PEM 编码的 SSL 证书和私钥。PEM 编码的证书和密钥是 Base64 编码的文本,带有看起来-----BEGIN RSA PRIVATE KEY-----或相似的开始/结束分隔符。

要创建 SSL 证书,您首先需要生成私钥和证书签名请求,或 CSR(其中还包含您的公钥)。您可以通过多种方式执行此操作,但这是 OpenSSL 中的方法。

openssl req -newkey rsa:2048 -new -nodes -keyout key.pem -out csr.pem

这将导致您输入交互式提示以生成 2048 位 RSA 私钥和 CSR,其中包含您在提示中选择输入的所有信息。(注意:Common Name 是您要放置用于访问您的站点的域名的位置。)完成此操作后,您通常会将此 CSR 提交给受信任的证书颁发机构,并在他们经过验证后提交您的请求,您将收到一份证书。

如果您不关心您的证书是否受信任(通常用于开发目的),您可以创建一个自签名证书。为此,我们可以使用几乎相同的行,但我们将传递两个额外的参数。

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

这将为您提供一个证书(有效期为 10 年)和密钥对,您可以在发布的代码片段中使用它们。

于 2012-10-16T03:34:11.163 回答
14

只需按照以下程序:

  1. 创建要存储密钥和证书的文件夹:

    mkdir conf


  1. 转到该目录:

    cd conf


  1. 获取此ca.cnf文件以用作配置快捷方式:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf


  1. 使用此配置创建一个新的证书颁发机构:

    openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem


  1. 现在我们在ca-key.pemand中拥有了证书颁发机构ca-cert.pem,让我们为服务器生成一个私钥:

    openssl genrsa -out key.pem 4096


  1. 获取此server.cnf文件以用作配置快捷方式:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf


  1. 使用此配置生成证书签名请求:

    openssl req -new -config server.cnf -key key.pem -out csr.pem


  1. 签署请求:

    openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem

我在这里找到了此过程,以及有关如何使用这些证书的更多信息。

于 2016-01-11T00:41:20.557 回答
0

另一种方法是使用类的 createCertificate 方法使用 pem 库生成证书。

该过程如下:

如果您的系统中尚未安装 openssl,例如对于 Windows 10,可以在此处找到源代码的编译版本(似乎是最开放的版本):https ://curl.se/windows/它的解释在这里编译和保护:https ://wiki.openssl.org/index.php/Binaries 。对于源https://www.openssl.org/community/binaries.html 对于 windows,您可能需要将 openssl.bin 文件的目录添加到系统环境路径变量(https://www.architectryan.com /2018/08/31/how-to-change-environment-variables-on-windows-10/)或将文件的位置传递给 PEM 库。

使用安装 pem(此处的文档:https ://github.com/Dexus/pem

npm i pem

在服务器根目录的命令行中。

从文档中您可以看到,可以通过以下方式简单地创建一个带有密钥的简单 https 服务器:

const https = require('https')
const pem = require('pem')

pem.createCertificate({ days: 1, selfSigned: true }, (err, keys) => {
  if (err) {
    throw err
  }
  https.createServer({ key: keys.clientKey, cert: keys.certificate }, (req, res)  => {
    res.end('o hai!')
  }).listen(443)
})

npm i express 或在服务器根目录的命令行中使用 express ):

const https = require('https')
const pem = require('pem')
const express = require('express')

pem.createCertificate({ days: 1, selfSigned: true }, (err, keys) => {
  if (err) {
    throw err
  }
  const app = express()

  app.get('/', (req, res) => {
    res.send('o hai!')
  })

  https.createServer({ key: keys.clientKey, cert: keys.certificate }, app).listen(443)
})

只是将 var 的 const 更改为适当的,并将函数更改为箭头函数

于 2021-06-14T17:32:27.213 回答