Gere chaves para nginx, com apenas uma chave pública

Gere chaves para nginx, com apenas uma chave pública

Eu tenho um endpoint Elasticsearch como serviço (não tenho acesso ao config/server). O serviço me forneceu um nome de usuário e senha, e um único arquivo de "certificado TLS", que quando decodificado diz que éChave pública RSA: (2048 bits)

Estou executando o nginx e quero usá-lo como proxy reverso para este endpoint do Elasticsearch. Portanto, preciso fazer com que o nginx lide com a aplicação do certificado quando ele retransmitir a solicitação. Semelhante a este exemplo de configuração (da documentação do 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;
    }

Alguma idéia de como posso gerar ocliente.pemecliente.chaveobrigatório (por exemplo, usando openssl) - quando tudo o que tenho para começar é um único arquivo de chave pública?

(editar)

Não tenho certeza se ajuda, mas é assim que estamos fazendo algo semelhante com esta chave pública, em um aplicativo Java. Ele pega o arquivo de chave e cria um objeto que possui um certificado x509 totalmente formado, que é enviado ao Elastic junto com a solicitação... e 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)

Acabei não tendo relação com SSL ou com aquele certificado que a Elastic me deu... o que acabou sendo um ponto de confusão para mim porque achei importante. Aqui estão as configurações de proxy no nginx que funcionaram:

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

Responder1

Isso é impossível, você não pode criar certificado e chave privada a partir de um certificado. Isto seria um enorme problema de segurança se isso fosse possível, uma vez que o certificado é considerado público e a chave privada deve ser mantida em segredo.

... mas é assim que estamos fazendo algo semelhante com esta chave pública...

O código que você mostra não tem nada a ver com sua necessidade. Ele apenas carrega um certificado de um arquivo ( generateCertificatenão cria um certificado, apenas cria um certificadoobjetoa partir de dados existentes). Nãoprivadoa chave é criada aqui.

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

Acho que você está no caminho errado em primeiro lugar. Embora você não forneça detalhes úteis sobre o certificado obtido, presumo que esse certificado seja o certificado do endpoint do Elasticsearch e você deve usá-lo paraverificarque o certificado é o esperado. Neste caso você precisaria usar a opçãoarquivo proxy_ssl_trusted_certificatee aqui estánenhuma chave privada necessáriapor esta.

O que você tenta fazer proxy_ssl_certificatee proxy_ssl_certificate_keyéautenticar-secontra o servidor com o certificado, ou seja, use-o como um certificado de cliente.

informação relacionada