我有一个 Elasticsearch 端点作为服务(我无法访问配置/服务器)。该服务为我提供了用户名和密码,以及一个“TLS 证书”文件,该文件解码后显示它是RSA 公钥:(2048 位)
我正在运行 nginx,并希望将其用作此 Elasticsearch 端点的反向代理。因此,我必须让 nginx 在中继请求时处理证书的应用。类似于此示例配置(来自 nginx 文档):
location /upstream {
proxy_pass https://backend.example.com;
proxy_ssl_certificate /etc/nginx/client.pem;
proxy_ssl_certificate_key /etc/nginx/client.key;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
proxy_ssl_trusted_certificate /etc/nginx/trusted_ca_cert.crt;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_session_reuse on;
}
知道如何生成客户端.pem和客户端密钥需要(例如使用 openssl)——当我所要开始的只是一个公钥文件时?
(编辑)
不确定是否有帮助,但这就是我们在 Java 应用程序中使用此公钥执行类似操作的方式。它获取密钥文件并构建一个具有完整格式的 x509 证书的对象,该对象与请求一起发送到 Elastic...并且它可以正常工作。
File caFile = new File("elastic_key_file.crt");
CertificateFactory fact = CertificateFactory.getInstance("X.509");
FileInputStream is = new FileInputStream(caFile);
X509Certificate cer = (X509Certificate) fact.generateCertificate(is);
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(null, null);
keystore.setCertificateEntry("public", cer);
(编辑)
最终与 SSL 或 Elastic 给我的证书无关……这最终让我感到困惑,因为我认为这很重要。以下是 nginx 中有效的代理设置:
# Get the origin into a variable, for substitution into the header, below
map $http_origin $allow_origin {
~^https?://(.*\.)?incomingdomain.com(:\d+)?$ $http_origin;
default "";
}
proxy_redirect off;
add_header 'Access-Control-Allow-Origin' $allow_origin;
add_header 'Access-Control-Allow-Methods' 'OPTIONS, HEAD, GET, POST, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'X-Requested-With, Content-Type, Content-Length, Authorization';
location /ElasticSearch/someSearch {
proxy_pass https://elasticdomain/_search;
}
答案1
这是不可能的,您无法从证书创建证书和私钥。如果这是可能的,这将是一个巨大的安全问题,因为证书被视为公开的,而私钥应该保密。
...但是我们用这个公钥做类似的事情就是这样的...
您显示的代码与您的要求无关。它只是从文件加载证书(generateCertificate
不创建证书,它只是创建证书目的根据现有数据)。 否私人的密钥在这里创建。
proxy_ssl_certificate /etc/nginx/client.pem; proxy_ssl_certificate_key /etc/nginx/client.key;
我认为你一开始就走错了路。虽然你没有提供任何有关你获得的证书的有用详细信息,但我认为该证书是 Elasticsearch 端点的证书,你应该使用它来核实证书是预期的证书。在这种情况下,您需要使用选项proxy_ssl_trusted_certificate 文件还有不需要私钥为了这。
你反而想做的proxy_ssl_certificate
是proxy_ssl_certificate_key
验证自己的身份针对具有证书的服务器,即将其用作客户端证书。