Node.js https pem错误:错误:0906D06C:PEM例程:PEM_read_bio:无起始行

时间:2016-07-06 01:14:25

标签: node.js ssl express https ssl-certificate

我从证书颁发机构获得了这些文件:

  • domain.com.p7b
  • domain.com.crt
  • domain.com.ca束

我尝试了这个小代码:

var express = require('express');
var app = express();
var fs = require("fs");
var https = require('https');

var privateKey = fs.readFileSync('domain.com.p7b').toString();
var certificate = fs.readFileSync('domain.com.crt').toString();
var ca_bundle = fs.readFileSync('domain.com.ca-bundle').toString();

var credentials = { key: privateKey, 
                    ca : ca_bundle,
                    cert: certificate};


https.createServer(credentials,app).listen(8080, function () {
    console.log('Example app listening on port 8080!');
});

启动脚本后,我收到以下错误:

(err):     at Object.createSecureContext (_tls_common.js:87:19)
(err):     at Server (_tls_wrap.js:721:25)
(err):     at new Server (https.js:17:14)
(err):     at Object.exports.createServer (https.js:37:10)
(err):     at Object.<anonymous> (/utec_temp/https/web.js:27:7)
(err):     at Module._compile (module.js:435:26)
(err):     at Object.Module._extensions..js (module.js:442:10)
(err):     at Module.load (module.js:356:32)
(err):     at Function.Module._load (module.js:311:12)
(err): Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
(err):     at Error (native)
(err):     at Object.createSecureContext (_tls_common.js:87:19)
(err):     at Server (_tls_wrap.js:721:25)
(err):     at new Server (https.js:17:14)
(err):     at Object.exports.createServer (https.js:37:10)
(err):     at Object.<anonymous> (/utec_temp/https/web.js:27:7)
(err):     at Module._compile (module.js:435:26)
(err):     at Object.Module._extensions..js (module.js:442:10)
(err):     at Module.load (module.js:356:32)
(err):     at Function.Module._load (module.js:311:12)

您可以在互联网上使用谷歌的大多数示例都使用自签名证书,但是当我在真实环境中工作时会发生什么?

我的小代码在开发中使用自签名密钥,如下例所示:

https://stackoverflow.com/a/24283204/3957754

我研究过,我发现了这个:

https://www.namecheap.com/support/knowledgebase/article.aspx/9705/0/nodejs

http://www.backwardcompatible.net/155-Setting-up-real-SSL-Nodejs-Express

Node.js https pem error: routines:PEM_read_bio:no start line

但我无法纠正错误。

我也缩减为一个文件:

var credentials = {cert: certificate};      

错误是一样的。所以我认为这可能是从windows到unix的格式错误。我使用了dos2unix工具,错误是一样的。

我的节点版本是4.4.7

感谢任何帮助。

提前致谢!

  

已更新

当您使用https证书,域或子域时,忘记了用于开发应用程序的技术。

Node.js,java,python和其他不错的语言都有库来发布加载购买或自签名证书的安全https端点。但这不是正确的方法。 例如:开发团队在设置应用程序时遇到问题,因为源代码需要证书和其他配置。

对于干净,可维护和可扩展的架构,不要修改您的源代码并将此工作或复杂性留给apache,nginx,haproxy或某些负载均衡器:

apache 2.2示例

SSLCertificateFile /some/folder/certificate.crt
SSLCertificateKeyFile /some/folder/initial.key
SSLCertificateChainFile /some/folder/certificate.ca-bundle

nginx示例

server {

  listen   443;

  ssl    on;
  ssl_certificate       /etc/ssl/your_domain_name.pem; (or bundle.crt)
  ssl_certificate_key   /etc/ssl/your_domain_name.key;

  server_name your.domain.com;
  ...

}

这种复杂性必须对开发团队透明,并且应由sysadmin,基础架构或与贵公司网络相关的其他团队进行管理。

1 个答案:

答案 0 :(得分:5)

我迟到了,但我希望这会有所帮助。

如果有人使用此文件:pb7,crt,ca-bundle并出现此错误:

error:0906D06C:PEM routines:PEM_read_bio:no start line

这意味着这些文件是错误的,损坏的或被请求用于其他环境(例如窗口),如本文所述:https://serverfault.com/a/317038

因此我的案例中的解决方案是申请新证书,并在预期中提出以下内容:

  • Linux兼容性

同样重要的是保存创建csr的密钥并将其发送给证书提供者(我称之为 initial.key )。

示例http://www.backwardcompatible.net/155-Setting-up-real-SSL-Nodejs-Express

最后,您的提供商会向您发送包含多个文件的zip。您只需要一个.crt文件用于您的节点应用程序:

var privateKey = fs.readFileSync('/some/folder/initial.key').toString();
var certificate = fs.readFileSync('/some/folder/certificate.crt').toString();
var credentials = {key: privateKey, cert: certificate};

注意:certificate.ca-bundle和certificate.crt文件必须由证书提供者发送。

HTH