【问题标题】:How to create .pem files for https web server如何为 https Web 服务器创建 .pem 文件
【发布时间】:2012-10-04 00:09:49
【问题描述】:

我正在使用 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?

【问题讨论】:

    标签: node.js ssl https webserver pem


    【解决方案1】:

    您需要的两个文件是 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 年)和密钥对,您可以在您发布的代码 sn-p 中使用它们。

    【讨论】:

    • 客户端证书和密钥呢?
    • 这篇文章完成了,运行他粘贴的两个命令来赢得密钥+证书。客户端不建立信任,只建立服务器。
    • @paul 你能告诉我这些 .pem 密钥和证书是在哪里生成的吗?我的意思是哪个目录?我正在使用 Ubuntu 14
    • 它们会写入你 shell 的当前工作目录。
    • 注意,这种方式生成的自签名证书是版本1,包含CN,但没有SAN。 “从版本 58 开始,Chrome 需要 SSL 证书才能使用 SAN(主题备用名称)而不是流行的通用名称 (CN),因此已删除 CN 支持。” [使用自签名证书时使用 openssl 修复 Chrome 58+ [missing_subjectAltName]](alexanderzeitler.com/articles/…)
    【解决方案2】:

    只需按照以下程序:

    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

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

    【讨论】:

      【解决方案3】:

      另一种方法是使用类的 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)
      })
      

      将 var 的 const 改成合适的,把函数改成箭头函数

      【讨论】:

        猜你喜欢
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 2019-09-18
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多