У меня есть конечная точка Elasticsearch как сервис (у меня нет доступа к config/server). Сервис предоставил мне имя пользователя и пароль, а также один файл "TLS certificate", который при расшифровке говорит, что онОткрытый ключ 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
подтвердите свою подлинностьпротив сервера с сертификатом, т.е. использовать его как клиентский сертификат.