Подтвердить что ты не робот

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 файл, поэтому любая помощь будет очень оценена.

Спасибо

4b9b3361

Ответ 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

Я удалил эту ошибку, написав следующий код

Открытый терминал

  1. openssl req -newkey rsa: 2048 -new -узлы -keyout key.pem -out csr.pem

  2. 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

$Введите кодовую фразу личного ключа... `

Тогда это сработает!