为 nginx 生成密钥,仅使用公钥

为 nginx 生成密钥,仅使用公钥

我有一个 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_certificateproxy_ssl_certificate_key验证自己的身份针对具有证书的服务器,即将其用作客户端证书。

相关内容