来自节点服务器的https请求使用客户端证书报告过期证书

时间:2014-01-10 09:35:32

标签: node.js ssl https certificate

我的本​​地Windows 7计算机上运行了一个节点服务器(v0.10.20),它使用我的客户端证书向后端发出https请求。该请求在开始时工作,从一天到另一天,它停止使用错误消息:

[Error: 8432:error:14094415:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate
 expired:openssl\ssl\s3_pkt.c:1256:SSL alert number 45]

我没有更改任何编码,证书到期日期是2015年10月。此外,如果我从浏览器触发https请求而不是让nodejs执行此操作,则https请求仍然有效。有谁知道这可能是什么原因?

相关的nodejs编码看起来像这样,即使我不认为问题与编码有关。正如我所说,它在没有改变编码的情况下停止工作。

HTTPS请求

function callBackend(hostname, port, path, method, callback){
    var options = {
        hostname: hostname,
        port: port,
        path: path,
        method: method,
        pfx: SSOCertificate,
        passphrase: SSOCertificatePassphrase,
        rejectUnauthorized: false,
        strictSSL: false, 
    };

    var data = "";      
    var req = https.request(options, function(res) {
        res.on('data', function(chunk) { data += chunk; });
        res.on('end', function(){ callback(data); });
    });

    req.end();
    req.on('error', function(e) {
        console.error(e);
    });
}

证书检索。我已经手动执行了这些步骤并硬编码到最终的pfx文件的路径。错误保持不变

if(process.platform == "win32") {
    exec("certutil -store -user -v my", function (error, stdout, stderr) {
        var serialNumber = getSSOCertSerialNumber(error, stdout, stderr);
        var SSOCertificatePath = path.join(__dirname, '/SSOCert.pfx');

        exec("certutil -f -user -p " + SSOCertificatePassphrase + " -exportPFX " + serialNumber + " \"" + SSOCertificatePath + "\"", function (error, stdout, stderr) {
            var SSOCertificate = fs.readFileSync(SSOCertificatePath);
            var deleteCommand = 'del "' + SSOCertificatePath + '"';
            callback(SSOCertificatePassphrase, SSOCertificate);
        });
    });
}

1 个答案:

答案 0 :(得分:0)

显然我执行这些步骤手册时出错了。连同certutil还返回“归档”证书(我无法通过Windows UI看到)和处理certutil返回的“Not After:”属性的错误这一事实,这导致我们提取错误证书的问题。错误的证书确实在一天前过期了。

所以nodejs或证书本身没有问题,我刚用certutil提取错误的证书。