Node.js SSL错误-没有可用的密码

Node.js SSL error - no ciphers available

本文关键字:密码 js SSL 错误 Node      更新时间:2023-09-26

我能够使用request.js模块将文件上传到dropbox。我试图使用纯Node.js https.request()和request.write()上传文件。由于dropbox需要https连接,我使用https.request()。但我在使用它们时收到错误(第二个代码):

当secureProtocol为SSLv2_method:时

Problem with request: 3074844416:error:140650B5:SSL routines:CLIENT_HELLO:no ciphers available:../deps/openssl/openssl/ssl/s2_clnt.c:562:

在我将secureProtocol更改为SSLv3_method后,我收到错误:

Problem with request: write EPROTO 3074537216:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:../deps/openssl/openssl/ssl/s3_pkt.c:348:

我无法安装kerberos。这可能是问题所在吗?

这是我的代码:

使用request.js模块:在最后几行中,我将可读流管道传输到request.put().

var crypto = require('crypto'),
    express = require('express'),
    request = require('request'),
    url = require('url'),
    cookieParser = require('cookie-parser'),
    fs = require('fs');
    app = express();
app.use(cookieParser());
var APP_KEY = 'opmdwo6kpnyswfp';
var APP_SECRET = 'an6vl11lc9rp51e';
function generateCSRFToken() {
    return crypto.randomBytes(18).toString('base64')
        .replace(/'//g,'-').replace(/'+/g,'_');
}
function generateRedirectURI(req) {
    return url.format({
        protocol: req.protocol,
        host: req.headers.host,
        pathname: app.path() + '/callback'
    });
}
function getFileSize(fileName) {
    var stats = fs.statSync(fileName);
    var fileSizeInBytes = stats["size"];
    var fileSizeInMegaBytes = fileSizeInBytes / 1000000.0;
    return fileSizeInBytes;
}
app.get('/', function(req, res, next) {
    var csrfToken = generateCSRFToken();
    res.cookie('csrf',csrfToken);
    res.redirect(url.format({
        protocol: 'https',
        hostname: 'www.dropbox.com',
        pathname: '1/oauth2/authorize',
        query: {
            client_id: APP_KEY,
            response_type: 'code',
            state: csrfToken,
            redirect_uri: generateRedirectURI(req)
        }
    }));
});
app.get('/callback', function(req, res) {
    if(req.query.error) {
        return res.send('ERROR ' + req.query.error + ': ' +
                req.query.error_description);
    }
    if(req.query.state !== req.cookies.csrf) {
        return res.status(401).send('CSRF token mismatch, possible' +
                'cross-site request forgery attempt.'
                );
    }
    request.post('https://api.dropbox.com/1/oauth2/token', {
        form: {
            code: req.query.code,
            grant_type: 'authorization_code',
            redirect_uri: generateRedirectURI(req)
        },
        auth: {
            user: APP_KEY,
            pass: APP_SECRET
        }
        }, function(error, response, body) {
            var data = JSON.parse(body);
            if(data.error)
                return res.send('ERROR: ' + data.error);
            var token = data.access_token;
            var fileName = "aai_success.pdf";
            var path = encodeURI("https://content.dropboxapi.com/1/files_put/auto/" + fileName);
            fs.createReadStream(fileName).pipe(request.put(path, {
                headers: { Authorization: 'Bearer ' + token },
                'Content-Length': getFileSize(fileName)
                }, function(error, response, body) {
                    console.log(response);
            }));
        });
});
app.listen(3000, function() {
    console.log('Application is running on port 3000');
});

使用Node.js https.request()

var crypto = require('crypto'),
    https = require('https');
    express = require('express'),
    request = require('request'),
    url = require('url'),
    cookieParser = require('cookie-parser'),
    fs = require('fs'),
    app = express();
app.use(cookieParser());
var APP_KEY = 'opmdwo6kpnyswfp';
var APP_SECRET = 'an6vl11lc9rp51e';
function generateCSRFToken() {
    return crypto.randomBytes(18).toString('base64')
        .replace(/'//g,'-').replace(/'+/g,'_');
}
function generateRedirectURI(req) {
    return url.format({
        protocol: req.protocol,
        host: req.headers.host,
        pathname: app.path() + '/callback'
    });
}
function getFileSize(fileName) {
    var stats = fs.statSync(fileName);
    var fileSizeInBytes = stats["size"];
    var fileSizeInMegaBytes = fileSizeInBytes / 1000000.0;
    return fileSizeInBytes;
}
app.get('/', function(req, res, next) {
    var csrfToken = generateCSRFToken();
    res.cookie('csrf',csrfToken);
    res.redirect(url.format({
        protocol: 'https',
        hostname: 'www.dropbox.com',
        pathname: '1/oauth2/authorize',
        query: {
            client_id: APP_KEY,
            response_type: 'code',
            state: csrfToken,
            redirect_uri: generateRedirectURI(req)
        }
    }));
});
app.get('/callback', function(req, res) {
    if(req.query.error) {
        return res.send('ERROR ' + req.query.error + ': ' +
                req.query.error_description);
    }
    if(req.query.state !== req.cookies.csrf) {
        return res.status(401).send('CSRF token mismatch, possible' +
                'cross-site request forgery attempt.'
                );
    }
    request.post('https://api.dropbox.com/1/oauth2/token', {
        form: {
            code: req.query.code,
            grant_type: 'authorization_code',
            redirect_uri: generateRedirectURI(req)
        },
        auth: {
            user: APP_KEY,
            pass: APP_SECRET
        }
        }, function(error, response, body) {
            var data = JSON.parse(body);
            if(data.error)
                return res.send('ERROR: ' + data.error);
            var token = data.access_token;
            console.log("Access token: " + token);
            var fileName = "aai_success.pdf";
            var options = {
                hostname: 'content.dropboxapi.com',
                port: 80,
                path: '/1/files_put/auto/test.txt',
                method: 'POST',
                headers: {
                    'Authorization': 'Bearer ' + token,
                    'Content-Type': 'multipart/form-data',
                    'Content-Length': 2,
                    'Transfer-Encoding': 'chunked'
                },
                strictSSL: false,
                secureProtocol: 'SSLv3_method'
            };
            var rqst = https.request(options, function(res) {
                console.log('STATUS: ' + res.statusCode);
                console.log('HEADERS: ' + JSON.stringify(res.headers));
                res.setEncoding('utf8');
                res.on('data', function(chunk) {
                    console.log('BODY: ' + chunk);
                });
            });
            rqst.write('AB');
            rqst.end();
            rqst.on('error', function(e) {
                console.log('Problem with request: ' + e.message);
            });
            /*
            var bts = 0;
            fs.createReadStream(fileName).on('data', function(chunk) {
                console.log("Got %d bytes from disk: ", chunk.length);
                bts += bts + chunk.length;
                var bytesSent = rqst.write(chunk);
                console.log('Bytes sent: ' + bytesSent);
            });
            if(bts == 240519)
                rqst.end();
            */
        });
});
app.listen(3000, function() {
    console.log('Application is running on port 3000');
});

您需要获得服务器证书。您可以使用openssl自签名进行开发(假设您在Linux上),也可以获得临时免费的。您还可以选择从证书颁发机构购买。一旦您获得证书,请查看HTTPS下的node.js文档或TLS(推荐),您就可以逐字逐句地使用它们的示例来设置SSL。https://nodejs.org/api/https.html

https://nodejs.org/api/tls.html

解决了问题。

将端口号更改为443,然后删除选项变量中的"内容类型"标头。

不需要使用strictSSL和secureProtocol

不需要使用SSL证书。