Ajax Javascript获取从https服务器到本地主机的请求:带有自签名SSL的端口
我在Debian服务器上配置并运行了两台服务器。一台主服务器和一台搜索引擎服务器 主服务器在https节点服务器上运行,该服务器具有一个NGINX代理和一个购买的SSL证书。Elasticsearch服务器正在http服务器上运行。我添加了一个新的NGINX代理服务器,使用自签名SSL证书重定向到该服务器。Elasticsearch服务器上还配置了用户名和密码的身份验证 一切似乎都已正确配置,因为当我从服务器终端执行curl时,可以从服务器获得成功的响应,使用-k选项绕过自签名证书的验证,没有它,它就无法工作 我无法执行从https主服务器到http本地主机服务器的跨域请求。因此,我需要在本地主机服务器上配置https 如果没有-k选项: curl:60 SSL证书问题:自签名证书 详情如下:http://curl.haxx.se/docs/sslcerts.html curl默认使用bundle执行SSL证书验证 证书颁发机构CA公钥CA证书。如果默认 捆绑文件不足,您可以指定一个备用文件 使用-cacert选项。 如果此HTTPS服务器使用由中表示的CA签名的证书 对于捆绑包,证书验证可能由于错误而失败 证书有问题它可能已过期,或者名称可能已过期 与URL中的域名不匹配。 如果要关闭curl对证书的验证,请使用 -k或-unsecure选项。 使用-k选项: 这是一个成功的Elasticsearch服务器响应 所以完整的curl请求看起来像curl-khttps://localhost:9999/ -用户名:密码 因此,实际问题是: 我希望能够对这个服务器执行一个简单的jqueryajax请求。我正在尝试以下请求$.get'https://username:password@localhost:9999/'但我遇到了连接被拒绝的错误 我的猜测是AJAX请求没有绕过自签名证书验证,因此它拒绝连接Ajax Javascript获取从https服务器到本地主机的请求:带有自签名SSL的端口,ajax,ssl,elasticsearch,https,ssl-certificate,Ajax,Ssl,elasticsearch,Https,Ssl Certificate,我在Debian服务器上配置并运行了两台服务器。一台主服务器和一台搜索引擎服务器 主服务器在https节点服务器上运行,该服务器具有一个NGINX代理和一个购买的SSL证书。Elasticsearch服务器正在http服务器上运行。我添加了一个新的NGINX代理服务器,使用自签名SSL证书重定向到该服务器。Elasticsearch服务器上还配置了用户名和密码的身份验证 一切似乎都已正确配置,因为当我从服务器终端执行curl时,可以从服务器获得成功的响应,使用-k选项绕过自签名证书的验证,没有它
有什么简单的方法可以通过请求头之类的东西来解决这个问题吗?或者我需要购买CA证书才能使用AJAX进行此操作吗?您是对的,问题在于自签名证书。如果您尝试相同的请求,但作为http,则它将工作 以下是使ElasticSearch与https协同工作的解决方法: 您需要实现自己的Http连接器:
var HttpConnector = require('elasticsearch/src/lib/connectors/http');
var inherits = require('util').inherits;
var qs = require('querystring');
var fs = require('fs');
function CustomHttpConnector(host, config) {
HttpConnector.call(this, host, config);
}
inherits(CustomHttpConnector, HttpConnector);
// This function is copied and modified from elasticsearch-js/src/lib/connectors/http.js
CustomHttpConnector.prototype.makeReqParams = function (params) {
params = params || {};
var host = this.host;
var reqParams = {
method: params.method || 'GET',
protocol: host.protocol + ':',
auth: host.auth,
hostname: host.host,
port: host.port,
path: (host.path || '') + (params.path || ''),
headers: host.getHeaders(params.headers),
agent: this.agent,
rejectUnauthorized: true,
ca: fs.readFileSync('publicCertificate.crt', 'utf8')
};
if (!reqParams.path) {
reqParams.path = '/';
}
var query = host.getQuery(params.query);
if (query) {
reqParams.path = reqParams.path + '?' + qs.stringify(query);
}
return reqParams;
};
module.exports = CustomHttpConnector;
然后像这样注册:
var elasticsearch = require('elasticsearch');
var CustomHttpConnector = require('./customHttpConnector');
var Elasticsearch = function() {
this.client = new elasticsearch.Client({
host: {
host: 'my.server.com',
port: '443',
protocol: 'https',
auth: 'user:passwd'
},
keepAlive: true,
apiVerison: "1.3",
connectionClass: CustomHttpConnector
});
}
如果希望不使用ES进行简单的ajax调用,那么您唯一能做的就是在请求被拒绝时提示用户访问页面并接受证书
另请参见:非常感谢您的回复。我将尝试此方法并返回给您。这是否意味着我必须向我的节点后端发出请求,向es发出请求并将响应发送回前端?或者我可以用纯前端解决这个问题吗?我不能100%确定此示例中发生了什么:我能够使用您的示例配置Elasticsearch并成功ping https-server。此示例告诉Elasticsearch使用自定义连接类来执行其ajax请求。请参阅上面的编辑
var elasticsearch = require('elasticsearch');
var CustomHttpConnector = require('./customHttpConnector');
var Elasticsearch = function() {
this.client = new elasticsearch.Client({
host: {
host: 'my.server.com',
port: '443',
protocol: 'https',
auth: 'user:passwd'
},
keepAlive: true,
apiVerison: "1.3",
connectionClass: CustomHttpConnector
});
}