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 ( generateCertificate
nã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_certificate
e proxy_ssl_certificate_key
éautenticar-secontra o servidor com o certificado, ou seja, use-o como um certificado de cliente.