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

我能够使用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模块:在最后几行我将可读stream传递给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上)自签名开发,或者你可以暂时获得免费版本。 您也可以select从authentication中心购买一个。 获得证书后,查看HTTPS下的node.js文档或查看TLS(build议),可逐字使用其示例来设置SSL。 https://nodejs.org/api/https.html

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

解决了这个问题。

将端口号更改为443,并删除选项variables中的Content-Type标头。

不需要使用strictSSL和secureProtocol

不需要使用SSL证书。