Node.js https ошибка pem: процедуры: PEM_read_bio: нет стартовой строки
Я сейчас возился с формой входа с помощью 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 файл, поэтому любая помощь будет очень оценена.
Спасибо
Ответы
Ответ 1
Возможно, вы используете неправильный файл сертификата, вам нужно создать самозаверяющий сертификат, который можно сделать следующим образом:
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')
};
Ответ 2
Я удалил эту ошибку, написав следующий код
Открытый терминал
-
openssl req -newkey rsa: 2048 -new -узлы -keyout key.pem -out csr.pem
-
openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out server.crt
Теперь используйте файл 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
Возникла та же проблема. В моем случае я изменил параметр параметра 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
};
Ответ 4
Для меня проблема заключалась в том, что у меня был ключ и сертификат поменялись местами.
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/mysite.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/mysite.com/fullchain.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/mysite.com/chain.pem')
};
EDIT
Более полный пример (возможно, не полностью функциональный)
Server.js
var fs = require('fs');
var sessionKey = 'ai_session:';
var memcachedAuth = require('memcached-auth');
var clients = {};
var users = {};
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/somesite.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/somesite.com/fullchain.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/somesite.com/chain.pem')
};
var origins = 'https://www.somesite.com:*';
var https = require('https').createServer(options,function(req,res){
// Set CORS headers
res.setHeader('Access-Control-Allow-Origin', origins);
res.setHeader('Access-Control-Request-Method', '*');
res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');
res.setHeader('Access-Control-Allow-Headers', '*');
});
var io = require('socket.io')(https);
https.listen(3000);
io.sockets.on('connection', function(socket){
socket.on('auth', function(data){
var session_id = sessionKey+data.token;
memcachedAuth.is_logged_in(session_id).then( (response) => {
if(response.is_logged_in){
// user is logged in
socket.emit('is_logged_in', true);
messenger.addUser(socket);
// dynamic room
socket.on('room', function(room){
socket.join(room);
console.log('joing room '+room);
});
socket.on('message', function(data){
messenger.receive(data.message_data);
});
}else{
// Not logged in
socket.emit('is_logged_in', false);
}
}).catch( (error) => {
console.log(error);
});
});
});
var messenger = {
socket: (socket)=>{
return socket;
},
subscribe: (room)=>{
},
unsubscribe: (room)=>{
},
send: (data)=>{
},
receive: (data)=>{
console.log(data);
//connected
if (clients[data.user_name]){
console.log('user');
}
},
addUser: (socket)=>{
socket.on('add-user', function(data){
clients[data] = {
"socket": socket.id
};
console.log('Adding User:' + data);
console.log(clients);
});
},
private: (socket)=>{
// Not working yet...
socket.on('message', function(data){
console.log("Sending: " + data + " to " + data.user_name);
if (clients[data.user_name]){
io.sockets.connected[clients[data.user_name].socket].emit("response", data);
} else {
console.log("User does not exist: " + data.user_name);
}
});
},
disconnect:()=>{
//Removing the socket on disconnect
socket.on('disconnect', function() {
for(var name in clients) {
if(clients[name].socket === socket.id) {
delete clients[name];
break;
}
}
});
}
}
Я создал репозиторий на github, включая более полную версию приведенного выше кода, если кому-то интересно: https://github.com/snowballrandom/Memcached-Auth
Ответ 5
Я полагаю, это потому, что срок действия вашего сертификата nodejs истек. Введите эту строку:
npm set registry http://registry.npmjs.org/
и после этого попробуйте еще раз с установкой npm. Это фактически решило мою проблему.
Ответ 6
Я на самом деле только что получил это же сообщение об ошибке
Проблема была в том, что у меня были файлы key
и cert
в объекте конфигурации.
Ответ 7
Если вы используете окна, вы должны убедиться, что в файле сертификата csr.pem и key.pem нет окончаний строк в стиле unix. Openssl будет генерировать файлы ключей с окончанием строки стиля unix. Вы можете конвертировать эти файлы в формат dos с помощью утилиты unix2dos или текстового редактора, например, блокнот ++
Ответ 8
Если вы зарегистрируете
var options = {
key: fs.readFileSync('./key.pem', 'utf8'),
cert: fs.readFileSync('./csr.pem', 'utf8')
};
Возможно, вы заметили недопустимые символы из-за неправильного кодирования.
Ответ 9
Поврежденные файлы сертификатов и/или ключей
Для меня это были просто поврежденные файлы. Я скопировал содержимое с веб-страницы GitHub PullRequest и, думаю, добавил куда-то дополнительный пробел или что-то еще... как только я взял необработанную вещь и заменил файл, все заработало.
Ответ 10
Сгенерировать сертификат закрытого ключа и сервера с определенной датой истечения срока действия или с бесконечным (XXX) временем истечения срока действия и самоподписывать его.
$openssl req -x509 -sha256 -newkey rsa: 2048 -keyout key.pem -out cert.pem -days XXX
$Введите кодовую фразу личного ключа... `
Тогда это сработает!