為 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驗證自己的身份針對具有憑證的伺服器,即將其用作客戶端憑證。

相關內容