Unable to get information using https second time(Error: write EPROTO ... final_renegotiate:unsafe legacy renegotiation disabled)

Viewed 645

I developed a server which works fine on my system. Then I got a VPS(Virtual Private Server) from my university to deploy the server there too!
To deploy my server on VPS I used docker but I got a strange result when I ran it! I debug the program and find where problem is but I don't know why it occurs and how to fix it.

I use a remote database to get safe primes. First time I get the information without any problem but when server tries to connect to the database for second time, it gets below error:

node:events:498
      throw er; // Unhandled 'error' event
      ^

Error: write EPROTO 80B9B7E0587F0000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:../deps/openssl/openssl/ssl/statem/extensions.c:907:

    at WriteWrap.onWriteComplete [as oncomplete] (node:internal/stream_base_commons:94:16)
Emitted 'error' event on ClientRequest instance at:
    at TLSSocket.socketErrorListener (node:_http_client:442:9)
    at TLSSocket.emit (node:events:520:28)
    at emitErrorNT (node:internal/streams/destroy:164:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  errno: -71,
  code: 'EPROTO',
  syscall: 'write'
}

Node.js v17.4.0
npm notice 
npm notice New minor version of npm available! 8.3.1 -> 8.5.2
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.5.2>
npm notice Run `npm install -g npm@8.5.2` to update!
npm notice

The simplified server I used to test:

const express = require('express');
const debug = require('debug');
const https = require('https')
const log = debug('app::main-Interface');
const args = process.argv.slice(2);
const app = express(); 
const port = args[0] || process.env.port || 3000;


function sleep(toSleep){
    return new Promise((resolve, reject)=>{
        setTimeout(() => {
            resolve(true)
        }, toSleep);
    })
}

async function initializeRemotely(lengthOfOrder = 4096){
    return new Promise((resolve, reject)=>{

    https.get(`https://2ton.com.au/getprimes/random/${lengthOfOrder}`, 
                (res)=>{
                    res.on('data', async (data)=>{
                        log('Data received!')
                        resolve(true);
                    })
                }
    )
    })
}

async function DEBUG(){
    let breakTime = 5000;
    while(true){
        await initializeRemotely()
        log('First operation succeed')
        await sleep(breakTime);
        breakTime *= 2;
    }
}

app.listen(port, async () => {
    log(`Server started listening on port : ${port}`);
    //schedulerPool.MSRulesWatcher(config.get('Times.schedulers'));
    DEBUG()
});

I run this code on my system using below command line:

$ DEBUG=app::* node server.js
app::main-Interface Server started listening on port : 3000 +0ms
  app::main-Interface Data received! +2s
  app::main-Interface First operation succeed +4ms
  app::main-Interface Data received! +6s
  app::main-Interface First operation succeed +1ms
  app::main-Interface Data received! +11s
  app::main-Interface First operation succeed +2ms
^C

As you can see it works fine!

The docker file I use to deploy the server is as below(./deploy/Dockerfile):

FROM node:alpine

EXPOSE 3000
WORKDIR /interface

COPY package.json .
RUN npm install

COPY . .

And the content of ./docker-compose.yml:

version: "3"

services:
  interface:
    image: interface
    container_name: interface
    build:
      context: .
      dockerfile: ./deploy/Dockerfile
    entrypoint: ["npm", "run", "development"]

Then I run the docker image in VPS using below commands:

$ sudo docker-compose build
$ sudo docker-compose up -d

And the log of server is shown below:

$ sudo docker logs [container-name]
> export NODE_ENV=development; export DEBUG=app:*; node server.js

2022-02-25T17:06:37.963Z app::main-Interface Server started listening on port : 3000
2022-02-25T17:06:40.992Z app::main-Interface Data received!
2022-02-25T17:06:40.998Z app::main-Interface First operation succeed
node:events:498
      throw er; // Unhandled 'error' event
      ^

Error: write EPROTO 80B991E6EB7F0000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:../deps/openssl/openssl/ssl/statem/extensions.c:907:

    at WriteWrap.onWriteComplete [as oncomplete] (node:internal/stream_base_commons:94:16)
Emitted 'error' event on ClientRequest instance at:
    at TLSSocket.socketErrorListener (node:_http_client:442:9)
    at TLSSocket.emit (node:events:520:28)
    at emitErrorNT (node:internal/streams/destroy:164:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  errno: -71,
  code: 'EPROTO',
  syscall: 'write'
}

Node.js v17.4.0
npm notice 
npm notice New minor version of npm available! 8.3.1 -> 8.5.2
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.5.2>
npm notice Run `npm install -g npm@8.5.2` to update!
npm notice

Which indicates server can connect to the database first time but second time it gets this error.

MY QUESTIONS:

  1. First of all, I'm really curious to find out why this problem occurs?
  2. How can I fix it?

INFORMATION

VPS information:

$ uname -a
Linux vote 5.4.0-26-generic #30-Ubuntu SMP Mon Apr 20 16:58:30 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

My system information:

$ uname -a
Linux milad-pc 5.4.178-1-MANJARO #1 SMP PREEMPT Tue Feb 8 20:03:41 UTC 2022 x86_64 GNU/Linux

0 Answers
Related