如何为https Web服务器创建.pem文件

时间:2012-10-13 08:57:38

标签: node.js ssl https webserver pem

我在Node.js中使用Express框架来创建Web服务器。我希望传输基于SSL。

创建https Web服务器的代码如下所示。

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

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

3 个答案:

答案 0 :(得分:177)

您需要的两个文件是PEM编码的SSL证书和私钥。 PEM编码的证书和密钥是Base64编码的文本,其开头/结尾分隔符看起来像-----BEGIN RSA PRIVATE KEY-----或类似。

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

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

这将使您进入交互式提示以生成2048位RSA私钥和CSR,其中包含您在提示中选择输入的所有信息。 (注意:您可以在公共名称中放置您将用于访问您网站的域名。)完成此操作后,您通常会将此CSR提交给受信任的证书权威,一旦他们验证了您的请求,您将收到证书。

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

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

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

答案 1 :(得分:11)

请按照以下步骤操作:

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

                2. 我找到了这个程序here,以及有关如何使用这些证书的更多信息。

答案 2 :(得分: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 在服务器根目录的命令行中):

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)
})

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