Node.js https pem错误:例程:PEM_read_bio:没有起始行

时间:2014-03-22 22:08:57

标签: node.js security login https pem

我现在正在使用node.js搞乱登录表单,我尝试使用

创建一个pem键和csr
openssl req -newkey rsa:2048 -new -nodes -keyout key.pem -out csr.pem

但是我在运行node server.js

时遇到了错误

这是我的server.js

var http = require('http'),
    express = require('express'),
UserServer = require('./lib/user-server');

var https = require('https');
var fs = require('fs');

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

var app = express();

app.configure(function(){
  app.use(express.bodyParser());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

var httpserver = http.createServer(app).listen('3004', '127.0.0.1');
var https_server = https.createServer(options, app).listen('3005', '127.0.0.1');
UserServer.listen(https_server);

这是错误

crypto.js:104
  if (options.cert) c.context.setCert(options.cert);
                          ^
Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
    at Object.exports.createCredentials (crypto.js:104:31)
    at Server (tls.js:1107:28)
    at new Server (https.js:35:14)
    at Object.exports.createServer (https.js:54:10)

我试过了

openssl x509 -text -inform DER -in key.pem

它给出了

unable to load certificate
140735208206812:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1319:
140735208206812:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:381:Type=X509

我不确定错误是什么意思,因为我的加密文件已经是.pem文件了,所以非常感谢任何帮助。

由于

13 个答案:

答案 0 :(得分:72)

您可能使用了错误的证书文件,您需要做的是生成自签名证书,可以按照以下方式完成

openssl req -newkey rsa:2048 -new -nodes -keyout key.pem -out csr.pem
openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out server.crt

然后使用server.crt

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

答案 1 :(得分:8)

遇到了同样的问题在我的情况下,我将cert的选项参数更改为pfx&删除了utf8编码。

<强>之前:

var options = {
    hostname : 'localhost',
    path : '/',
    method : 'POST',
    cert: fs.readFileSync(testCert, 'utf8'),
    passphrase:passphrase,
    agent:false,
    rejectUnauthorized:false
};

<强>后:

var options = {
    hostname : 'localhost',
    path : '/',
    method : 'POST',
    pfx: fs.readFileSync(testCert),
    passphrase:passphrase,
    agent:false,
    rejectUnauthorized:false
};

答案 2 :(得分:7)

我通过编写以下代码删除了此错误

打开终端

  1. openssl req -newkey rsa:2048 -new -nodes -keyout key.pem -out csr.pem

  2. openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out server.crt

  3. 现在使用server.crt和key.pem文件

    app.js或server.js文件

    var https = require('https');
    var https_options = {
      key: fs.readFileSync('key.pem', 'utf8'),
      cert: fs.readFileSync('server.crt', 'utf8')
    };
    
    var server = https.createServer(https_options, app).listen(PORT);
    console.log('HTTPS Server listening on %s:%s', HOST, PORT);
    

    它可以工作,但证书不受信任。您可以在图像文件中查看图像。

    enter image description here

答案 3 :(得分:2)

我想这是因为你的nodejs证书已过期。输入以下行:
npm set registry http://registry.npmjs.org/
然后再使用npm install再试一次。这实际上解决了我的问题。

答案 4 :(得分:2)

我遇到了这样的问题。

问题是我在开头添加了不带'----- BEGIN PUBLIC KEY -----'且不带'----- END PUBLIC KEY -----的公钥'。

因此会导致错误。

最初,我的公钥是这样的:

-----BEGIN PUBLIC KEY-----
WnsbGUXbb0GbJSCwCBAhrzT0s2KMRyqqS7QBiIG7t3H2Qtmde6UoUIcTTPJgv71
......
oNLcaK2wKKyRdcROK7ZTSCSMsJpAFOY
-----END PUBLIC KEY-----

但是我只用了这一部分:

WnsbGUXb+b0GbJSCwCBAhrzT0s2KMRyqqS7QBiIG7t3H2Qtmde6UoUIcTTPJgv71
......
oNLcaK2w+KKyRdcROK7ZTSCSMsJpAFOY

答案 5 :(得分:0)

如果您使用的是Windows,则应确保证书文件csr.pem和key.pem不具有unix样式的行结尾。 Openssl将生成具有unix样式行结尾的密钥文件。您可以使用像unix2dos这样的实用程序或像notepad ++这样的文本编辑器将这些文件转换为dos格式

答案 6 :(得分:0)

如果您记录

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

您可能会注意到由于编码不当而导致无效字符。

答案 7 :(得分:0)

我实际上也有同样的错误消息。

问题是我在配置对象中交换了keycert文件。

答案 8 :(得分:0)

对我来说,问题是我交换了密钥和证书。

Text

答案 9 :(得分:0)

  

证书和/或密钥文件损坏

对我来说,这只是损坏的文件。我从GitHub PullRequest网页上复制了内容,我想我在某个地方或其他地方添加了额外的空间……一旦我抓到原始内容并替换了文件,它就可以正常工作。

答案 10 :(得分:0)

对我来说,在尝试了所有上述解决方案之后,最终成为了与编码有关的问题。简而言之,我的密钥是使用“带BOM的UTF-8”进行编码的。应该是UTF-8。

要解决此问题,至少使用VS Code,请执行以下步骤:

  1. 打开文件,然后单击状态栏(底部)上的“编码”按钮,然后选择“使用编码保存”。
  2. 选择UTF-8。
  3. 然后尝试再次使用证书。

我想您可以使用其他支持以正确编码保存的编辑器。

来源:error:0906d06c:pem routines:pem_read_bio:no start line, when importing godaddy SSL certificate

P.D使用encoding函数加载文件时,我不需要将utf-8设置为fs.readFileSync

希望这对某人有帮助!

答案 11 :(得分:0)

对我来说,解决方案是用to代替\\n(以奇怪的方式格式化为密钥)

替换您的 \nkey: <private or public key>

答案 12 :(得分:-1)

生成具有特定到期日期或无限(XXX)到期时间的私钥和服务器证书,并自签名。

  

$ openssl req -x509 -sha256 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX

     

$输入私钥密码......`

然后它会起作用!