【问题标题】:Windows: trust self-signed certificate used for node (and express)Windows:信任用于节点(和快递)的自签名证书
【发布时间】:2018-07-29 02:53:33
【问题描述】:

我正在使用 Windows,我正在尝试通过 HTTPS 使用 express,并且我正在尝试找出是否有一种方法可以信任使用过的证书,这样我就不必告诉我的浏览器“继续访问不受信任的站点”。

根据this post,我知道.NET Core怎么做:使用PowerShell在Personal中创建一个自签名证书,然后复制到Trusted Root证书颁发机构,使其受信任并且可以使用(在我的 ASP.NET Core 应用程序中,我将 HTTPS 配置为使用该证书)

我必须承认我不是证书方面的专家,我不确定到底发生了什么,但以上是我的想法。

所以,在 this post 之后,我使用 openssl 创建 Node(和 Express)为 HTTPS 所需的两个文件,但有没有办法以类似的方式信任这些文件。

我尝试在互联网上搜索有关从 PFX 转换为 PEM 等的信息,以某种方式尝试将 PowerShell 创建的证书导出为 Node 所需的格式以确保它是可信的,但我没有成功。

非常感谢任何帮助, 谢谢

【问题讨论】:

    标签: express ssl https pem pfx


    【解决方案1】:

    @Farzad,我想你现在可能已经找到了解决方案,但对于其他人来说,这里是详细信息

    关于证书的一两件事

    -> DER - 这是证书的二进制编码格式。因此,证书实际上是“DER 编码方式”,而不是 DER 证书。没有人应该说他们有 DER 证书。它不是一种证书 -> PEM。 - 这是一个使用 ASCII 键编码的 X509v3

    -> CSR - 这是一个证书签名请求,通常生成发送给 CA 进行验证。在检查证书的域和真实性时,CA 通常以 CER/CRT 格式发回签名的受信任证书。它可以是PERM或DER格式,使用openssl我们可以从一种格式转换为另一种格式

    -> CRT = CRT 扩展用于证书。证书可以编码为二进制 DER 或 ASCII PEM。 CER 和 CRT 扩展几乎是同义词。在 *nix 系统中最常见 -> CER = .crt 的替代形式(Microsoft 约定)您可以使用 MS Office 将 .crt 转换为 .cer(.both DER 编码的 .cer,或 base64[PEM] 编码的 .cer) .cer 文件扩展名也可以识别通过 IE 作为命令运行 MS cryptoAPI 命令(特别是 rundll32.exe cryptext.dll,CryptExtOpenCER),该命令显示导入和/或查看证书内容的对话框。 另请参阅 - https://serverfault.com/questions/9708/what-is-a-pem-file-and-how-does-it-differ-from-other-openssl-generated-key-file

    SYMMETRIC vs ASYMETRIC - 对称密钥意味着只有一个密钥需要用于编码和解码客户端和服务器之间的传输,并且应该实施机制来共享它们之间的密钥(虽然不完全安全) 非对称密钥意味着有两个密钥用于对消息进行编码和解码。服务器使用私钥编码和发送消息,客户端使用公钥(通过 rsa 的证书共享或共享为称为“salt”的“密码短语”。

    回到生成这些keys/keystore/trustore和certs的工具,opensslkeytool是最常用的。有许多在线博客对此进行了解释。这是一个

    https://blogs.oracle.com/blogbypuneeth/steps-to-create-a-self-signed-certificate-using-openssl

    现在回到将证书导入到信任库,您可以在 SO 中参考此答案 Digital Certificate: How to import .cer file in to .truststore file using?

    此处完成快速 https 设置与完成的设置相同

    const process = require('process');
    const _ = require('lodash');
    const util =require('util');
    const express = require('express');
    const app  = express();
    
    const appPath = require('app-root-path');
    const https = require('https');
    const http = require('http');
    
    const fs = require('fs');
    
    const bodyParser = require('body-parser');
    //Extract arugments from command line
    const argumentExtractor = require('./utils/argumentExtrator');
    
    //make use of constants
    const constants = require('./utils/constants');
    
    //sample to make use of cors router
    // const corsRouter = require('./controllers/corsRoute');
    // app.use(corsRouter);
    console.log('env vars', process.env);
    
    app.use(bodyParser.json());
    app.use(bodyParser.raw({type: () => true}));
    
    const corsHeaders = require('./middlewares/corsHeaders');
    app.use(corsHeaders);
    
    //additional response headers
    const addition_headers = require('./middlewares/additionalReponseHeaeders');
    app.use(addition_headers);
    debugger;
    
    
    //Routing sample1
    const appRouter1 = require('./controllers/appRoute1');
    app.use(constants.COURSE_ROUTE,appRouter1);
    
    //Routing sample 2
    const appRouter2 = require('./controllers/appRoute2');
    app.use(constants.HEADER_ROUTE, appRouter2);
    
    
    
    //getting the commandline properties
    console.log('command line arguments');
    _.each(process.argv, (data)=>{
    
        console.log('each data', data);
    
    });
    console.log('env from argument',argumentExtractor.env);
    console.log('port from argument',argumentExtractor.port);
    
    //spread opertaor example
    const oldArray = ['1', 2];
    const newArray = [...oldArray];
    console.log(newArray);
    
    //Rest operator- basically to handle mutiple inputs
    const sampleFunc = (...params)=>{
        return params;
    }
    console.log(sampleFunc(3,4));
    console.log(sampleFunc(3,4,5,6 ));
    
    const port = argumentExtractor.port || 3000;
    
    let options= {
        key:fs.readFileSync(appPath+'/certs/nodejs_key.pem'),
        cert: fs.readFileSync(appPath+'/certs/nodejs_cert.cert'),
        requestCert: false,
        rejectUnAuthorized: false,
        passphrase:'<passphrase used in openssl cert creation>'
    };
    
    http.createServer(app).listen(port ,()=>{
        console.log('The listening port is:'+port);
    });
    
    https.createServer(options,app).listen(5000, ()=>{
        console.log('This is the https server port ...5000');
    });
    

    我希望这能回答这个问题。

    【讨论】:

    • 谢谢@Joey587,实际上我没有时间
    • @Farzad 没问题。希望它有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2013-03-12
    • 2018-03-10
    • 2016-11-29
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多