簡體   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