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

我现在用node.js搞乱了login表单,我试着创build一个pem key和csr using

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

但是,我一直在运行节点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 

我不完全确定错误是什么意思,因为我的encryption文件是.pem文件已经,所以任何帮助将不胜感激。

谢谢

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

 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('./key.pem', 'utf8'), cert: fs.readFileSync('./server.crt', 'utf8') }; 

我想这是因为你的nodejs证书已过期。 input这行npm set registry http://registry.npmjs.org/之后,再次尝试与npm安装。 这实际上解决了我的问题。

面临同样的问题在我的情况下,我把证书的选项参数更改为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 }; 

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

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

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

$input一个私钥密码…`

那么它会工作!

如果你login了

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

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