繁体   English   中英

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

[英]Node.js SSL error - no ciphers available

我可以使用request.js模块将文件上传到保管箱。 我试图使用纯Node.js https.request()和request.write()上传文件。 由于保管箱需要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,并删除options变量中的Content-Type标头。

不需要使用strictSSL和secureProtocol

不需要使用SSL证书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM