Generar claves para nginx, con solo una clave pública

Generar claves para nginx, con solo una clave pública

Tengo un punto final de Elasticsearch como servicio (no tengo acceso a la configuración/servidor). El servicio me proporcionó un nombre de usuario y contraseña, y un único archivo de "certificado TLS", que cuando se decodifica dice que esClave pública RSA: (2048 bits)

Estoy ejecutando nginx y quiero usarlo como proxy inverso para este punto final de Elasticsearch. Entonces tengo que hacer que nginx maneje la aplicación del certificado cuando transmite la solicitud. Similar a este ejemplo de configuración (de nginx docs):

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;
    }

¿Alguna idea de cómo puedo generar elcliente.pemycliente.claverequerido (por ejemplo, usando openssl), ¿cuando todo lo que tengo para comenzar es un único archivo de clave pública?

(editar)

No estoy seguro si ayuda, pero así es como estamos haciendo algo similar con esta clave pública, en una aplicación Java. Toma el archivo de clave y crea un objeto que tiene un certificado x509 completamente formado, que se envía a Elastic junto con la solicitud... y funciona.

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);

(editar)

Terminó sin estar relacionado con SSL o con ese certificado que me dio Elastic... lo que terminó siendo un punto de confusión para mí porque pensé que era importante. Aquí están las configuraciones de proxy en nginx que funcionaron:

# 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;
}

Respuesta1

Esto es imposible, no se puede crear un certificado y una clave privada a partir de un certificado. Esto sería un gran problema de seguridad si fuera posible, ya que el certificado se considera público y la clave privada debe mantenerse en secreto.

... pero así estamos haciendo algo similar con esta clave pública ...

El código que muestra no tiene nada que ver con su requisito. Simplemente carga un certificado desde un archivo ( generateCertificateno crea un certificado, solo crea un certificado).objetoa partir de datos existentes). NoprivadoLa clave se crea aquí.

   proxy_ssl_certificate         /etc/nginx/client.pem;
   proxy_ssl_certificate_key     /etc/nginx/client.key;

Creo que estás en el camino equivocado en primer lugar. Si bien no proporciona ningún detalle útil sobre el certificado que obtuvo, supongo que este certificado es el certificado del punto final de Elasticsearch y debe usarlo paraverificarque el certificado sea el esperado. En este caso necesitarías usar la opciónarchivo proxy_ssl_trusted_certificatey ahí estáno se necesita clave privadapara esto.

Lo que en cambio intentas hacer con proxy_ssl_certificatey proxy_ssl_certificate_keyesautenticarsecontra el servidor con el certificado, es decir, utilizarlo como certificado de cliente.

información relacionada