如何为HTTPS Node.js服务器使用自签名证书?

如何为HTTPS Node.js服务器使用自签名证书?,node.js,ssl,https,Node.js,Ssl,Https,我已经开始为一个API编写一个包装器,它要求所有请求都通过HTTPS。我希望在本地运行自己的服务器,模拟响应,而不是在开发和测试时请求实际的API 我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑 我的服务器如下所示: var options = { key: fs.readFileSync('./key.pem'), cert: fs.readFileSync('./cert.pem') }; https.createServer(options, function(

我已经开始为一个API编写一个包装器,它要求所有请求都通过HTTPS。我希望在本地运行自己的服务器,模拟响应,而不是在开发和测试时请求实际的API

我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑

我的服务器如下所示:

var options = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
};

https.createServer(options, function(req, res) {
  res.writeHead(200);
  res.end('OK\n');
}).listen(8000);
var options = {
  host: 'localhost',
  port: 8000,
  path: '/api/v1/test'
};

https.request(options, function(res) {
  res.pipe(process.stdout);
}).end();
pem文件是通过以下方式生成的:

openssl genrsa 1024 > key.pem
openssl req -x509 -new -key key.pem > cert.pem
请求看起来像这样:

var options = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
};

https.createServer(options, function(req, res) {
  res.writeHead(200);
  res.end('OK\n');
}).listen(8000);
var options = {
  host: 'localhost',
  port: 8000,
  path: '/api/v1/test'
};

https.request(options, function(res) {
  res.pipe(process.stdout);
}).end();
通过此设置,我得到了
错误:深度\u零\u自签名\u证书
,因此我认为需要为请求添加一个
ca
选项

因此,我的问题是,我应该如何生成以下内容:

  • 服务器
  • 服务器
    证书
  • 请求的
    ca
  • 我已经阅读了一些关于使用openssl生成自签名证书的内容,但似乎还不知道该在节点代码的何处使用哪些密钥和证书

    更新

    API提供了一个CA证书来代替默认值使用。下面的代码使用他们的证书工作,这就是我想在本地复制的代码

    var ca = fs.readFileSync('./certificate.pem');
    
    var options = {
      host: 'example.com',
      path: '/api/v1/test',
      ca: ca
    };
    options.agent = new https.Agent(options);
    
    https.request(options, function(res) {
      res.pipe(process.stdout);
    }).end();
    

    你的密钥生成看起来不错。您不应该需要ca,因为您没有拒绝未签名的请求


    将.toString()添加到readFileSync方法的末尾,以便您实际传递的是字符串,而不是文件对象。

    尝试将其添加到请求选项中

    var options = {
      host: 'localhost',
      port: 8000,
      path: '/api/v1/test',
      // These next three lines
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    };
    
    尝试添加

      agent: false,
      rejectUnauthorized: false
    
    更新(2018年11月):您需要自签名证书吗? 还是真正的证书能让工作做得更好?你考虑过这些吗

    • 让我们通过
    • 让我们通过
    • 本地主机中继服务,例如
    (注意:Let's Encrypt还可以向专用网络颁发证书)

    放映

    完整的工作示例
    • 创建证书
    • 运行node.js服务器
    • node.js客户端中没有警告或错误
    • cURL中没有警告或错误

    localhost.greenlock.domains
    为例(它指向127.0.0.1):

    server.js client.js 以及生成证书文件的脚本:

    make-certs.sh 例如:

    bash make-certs.sh 'localhost.greenlock.domains'
    
    希望这能为这件事敲响警钟

    还有一些解释:

    在iOS Mobile Safari上安装私人证书 您需要创建扩展名为.crt的DER格式的根ca证书副本:

    # create DER format crt for iOS Mobile Safari, etc
    openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt
    
    然后,您可以简单地使用Web服务器提供该文件。单击该链接时,应询问您是否要安装证书

    例如,您可以尝试安装麻省理工学院的证书颁发机构:

    相关实例
      • (同一台服务器上有多个具有SSL的虚拟主机)
      • (获取您今天可以用于在本地主机上进行测试的真正SSL证书)

    此过程允许您创建证书颁发机构和证书:

  • 抓取此
    ca.cnf
    文件用作配置快捷方式:

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


  • 使用此配置创建新的证书颁发机构:

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


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

    openssl genrsa-out key.pem 4096


  • 抓取此
    server.cnf
    文件用作配置快捷方式:

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


  • 使用以下配置生成证书签名请求:

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


  • 签署请求:

    openssl x509-req-extfile server.cnf-999天-passin“pass:password”-在csr.pem-CA-cert.pem-CAkey CA-key.pem-CAcreateserial-out cert.pem中


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

    在最新版本的Node中,rejectUnauthorized选项默认设置为true,因此请求将被拒绝。toString是不必要的,因为readFileSync在未指定编码时返回缓冲区,而ca、cert和key选项接受缓冲区或字符串。这是否意味着您将reject unsigned requests设置为false,并且它正常工作?是的,我可以这样做,但这不是我想要的。我正在使用的API为我提供了一个CA证书,我可以使用它进行授权,我想在本地镜像这个设置。遗憾的是,这似乎还不够。加载WebSocket,然后尝试从Safari访问。即使我提供了证书,我也会收到一条消息,询问我是否要安装证书,但安装后,安全WebSocket失败。你在使用自签名证书+safari iOS方面有什么进展吗?@gman:如果你想在safari中使用它,你需要添加你的根ca。我用iOS部分更新了教程。如果你需要获取你调用的服务器的ca pem,请使用此命令(这是输出中的最后一个证书)
    openssl s_客户端-showcerts-connect www.example.com:443您的答案值得一篇文章,非常有用!这与@Loourr的建议没有什么不同。我可以在生产中使用这种方法吗?
    
    # create DER format crt for iOS Mobile Safari, etc
    openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt