Generieren Sie Schlüssel für nginx, mit nur einem öffentlichen Schlüssel

Generieren Sie Schlüssel für nginx, mit nur einem öffentlichen Schlüssel

Ich habe einen Elasticsearch-Endpunkt als Dienst (ich habe keinen Zugriff auf config/server). Der Dienst hat mir einen Benutzernamen und ein Passwort sowie eine einzelne „TLS-Zertifikat“-Datei zur Verfügung gestellt, die beim Dekodieren besagt, dass sieRSA-Öffentlicher Schlüssel: (2048 Bit)

Ich verwende nginx und möchte es als Reverse-Proxy für diesen Elasticsearch-Endpunkt verwenden. Daher muss ich nginx dazu bringen, die Anwendung des Zertifikats zu handhaben, wenn es die Anfrage weiterleitet. Ähnlich dieser Beispielkonfiguration (aus den nginx-Dokumenten):

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

Irgendeine Idee, wie ich das generieren kannclient.pemUndClientschlüsselerforderlich (z. B. Verwendung von OpenSSL) – wenn ich zum Ausgangspunkt nur eine einzige öffentliche Schlüsseldatei habe?

(bearbeiten)

Ich weiß nicht, ob das hilft, aber so machen wir etwas Ähnliches mit diesem öffentlichen Schlüssel in einer Java-Anwendung. Es nimmt die Schlüsseldatei und erstellt ein Objekt mit einem vollständig formatierten x509-Zertifikat, das zusammen mit der Anfrage an Elastic gesendet wird ... und es funktioniert.

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

(bearbeiten)

Letztendlich hatte es nichts mit SSL oder dem Zertifikat zu tun, das Elastic mir gegeben hat … was mich letztendlich verwirrte, da ich dachte, es sei wichtig. Hier sind die Proxy-Einstellungen in nginx, die funktioniert haben:

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

Antwort1

Dies ist unmöglich, Sie können aus einem Zertifikat kein Zertifikat und keinen privaten Schlüssel erstellen. Dies wäre ein großes Sicherheitsproblem, wenn dies möglich wäre, da das Zertifikat als öffentlich gilt und der private Schlüssel geheim gehalten werden sollte.

... aber so machen wir etwas Ähnliches mit diesem öffentlichen Schlüssel ...

Der Code, den Sie zeigen, hat nichts mit Ihrer Anforderung zu tun. Er lädt lediglich ein Zertifikat aus einer Datei ( generateCertificateerstellt kein Zertifikat, sondern nur ein ZertifikatObjektaus vorhandenen Daten). NeinPrivatDer Schlüssel wird hier erstellt.

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

Ich denke, Sie sind von vornherein auf dem falschen Weg. Obwohl Sie keine nützlichen Details zu dem Zertifikat angeben, das Sie erhalten haben, gehe ich davon aus, dass dieses Zertifikat das Zertifikat des Elasticsearch-Endpunkts ist und Sie es verwenden sollten, umverifizierendass das Zertifikat das erwartete ist. In diesem Fall müssen Sie die OptionDatei „proxy_ssl_trusted_certificate“und da istkein privater Schlüssel erforderlichdafür.

Was Sie stattdessen versuchen proxy_ssl_certificate, proxy_ssl_certificate_keyist,authentifizieren Sie sichgegenüber dem Server mit dem Zertifikat, also als Client-Zertifikat nutzen.

verwandte Informationen