Сгенерировать ключи для nginx, используя только открытый ключ

Сгенерировать ключи для nginx, используя только открытый ключ

У меня есть конечная точка 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подтвердите свою подлинностьпротив сервера с сертификатом, т.е. использовать его как клиентский сертификат.

Связанный контент