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