skip to Main Content

I have a very weird problem with socket.io and I was hoping someone can help me out.

For some reason few clients cannot connect to the server no matter what, when I am using https.
I am getting the following error code: ERR_CRYPTO_OPERATION_FAILED (see the detailed log below)

Again, most of the time the connection is perfectly fine, only some (random) clients seem to have this problem.

I have created a super simple server.js and client.js to make it easy to test.

I am using [email protected], and [email protected]

Unfortunately version 3.x.x is not an option.

The OS is Ubuntu 18.04, both on the server, and the client side.

Nginx:

server {
        listen 80;
        server_name example.domain.com;
        return 301 https://example.domain.com$request_uri;
}

server {
        listen 443 ssl http2;
        server_name example.domain.com;

        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/cert.key;
        ssl_protocols TLSv1.2 TLSv1.3;

        location /
        {
                proxy_pass http://127.0.0.1:8000;
                include /etc/nginx/proxy_params;
        }

        location /socket.io {
                proxy_http_version 1.1;
                proxy_buffering off;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_connect_timeout 30s;
                proxy_read_timeout 30s;
                proxy_send_timeout 30s;
                proxy_pass http://127.0.0.1:8000/socket.io;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
                internal;
        }
}

client.js:

const client = io.connect("https://example.domain.com", {
    origins: '*:*',
    transportOptions: {
        polling: {
            extraHeaders: {
                'Authorization': token
            }
        }
    },
});

Tried adding secure: true, reconnect: true, and rejectUnauthorized : false, but no difference.
Also, I tested it with and without the transportOptions.

server.js:

const port = 5000;
const app = express();
const server = app.listen(port, () => {
    console.log(`Listening on port: ${port}`);
});

const io = socket(server);

io.on("connection", (socket) => {
    console.log("Client connected", socket.id);
});

Of course, when I remove the redirect in nginx and use plain old http to connect, then everything is fine.

When I run DEBUG=* node client.js, I get the following:

socket.io-client:url parse https://example.domain.com/ +0ms
socket.io-client new io instance for https://example.domain.com/ +0ms
socket.io-client:manager readyState closed +0ms
socket.io-client:manager opening https://example.domain.com/ +1ms
engine.io-client:socket creating transport "polling" +0ms
engine.io-client:polling polling +0ms
engine.io-client:polling-xhr xhr poll +0ms
engine.io-client:polling-xhr xhr open GET: https://example.domain.com/socket.io/?EIO=3&transport=polling&t=NVowV1t&b64=1 +2ms
engine.io-client:polling-xhr xhr data null +2ms
engine.io-client:socket setting transport polling +61ms
socket.io-client:manager connect attempt will timeout after 20000 +66ms
socket.io-client:manager readyState opening +3ms
engine.io-client:socket socket error {"type":"TransportError","description":{"code":"ERR_CRYPTO_OPERATION_FAILED"}} +12ms
socket.io-client:manager connect_error +9ms
socket.io-client:manager cleanup +1ms
socket.io-client:manager will wait 1459ms before reconnect attempt +3ms
engine.io-client:socket socket close with reason: "transport error" +6ms
engine.io-client:polling transport not open - deferring close +74ms
socket.io-client:manager attempting reconnect +1s
...

Searching for ERR_CRYPTO_OPERATION_FAILED error, only leads me to the node.js errors page
which has only the following description:

Added in: v15.0.0
A crypto operation failed for an otherwise unspecified reason.

I am using Let’s Encrypt certificate.

I don’t get it. If it is an SSL issue, why am I getting this error only for few clients?
Maybe I am missing something in nginx?

Any help is much appreciated.

2

Answers


  1. I’ve seem similar error with node-apn. My solution was to downgrade to nodejs v14. Maybe give that a try?

    Login or Signup to reply.
  2. two step

    1. the version of node must be 14.x
    2. add this config when connect rejectUnauthorized: false
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search