Configurazione corretta del proxy inverso Apache con SSL per Jenkins e Sonar


11

Sto eseguendo due servizi dietro un server Apache: Jenkins (Porta 8080) e SonarQube (Porta 9000).

La mia configurazione di Apache è simile a questa:

<VirtualHost *:80>
  ServerName server
  Redirect permanent / https://server.domain.com/
</VirtualHost>

<VirtualHost *:80>
  ServerName server.domain.com
  Redirect permanent / https://server.domain.com/
</VirtualHost>

<VirtualHost *:443>
  ServerName server.domain.com

  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/server.crt
  SSLCertificateKeyFile /etc/ssl/private/server.key

  ProxyPass        /jenkins http://localhost:8080/jenkins nocanon
  ProxyPassReverse /jenkins http://localhost:8080/jenkins
  ProxyPassReverse /jenkins http://server.domain.com/jenkins
  ProxyPassReverse /jenkins https://server.domain.com/jenkins

  ProxyPass        /sonar http://localhost:9000/sonar nocanon
  ProxyPassReverse /sonar http://localhost:9000/sonar

  AllowEncodedSlashes NoDecode
  ProxyRequests Off
  ProxyPreserveHost On
  <Proxy http://localhost:8080/*>
    Order deny,allow
    Allow from all
  </Proxy>
</VirtualHost>

Tutto sembra funzionare bene, tranne per il fatto che Jenkins si lamenta di questo messaggio: sembra che la configurazione del tuo proxy inverso sia rotta.

Quando eseguo il test ReverseProxySetupMonitor fornito da Jenkins, il messaggio di errore indica che qualcosa con il proxy inverso non è impostato correttamente, in quanto non sostituisce http con https:

$ curl -iLk -e https://server.domain.com/jenkins/manage https://server.domain.com/jenkins/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test
[...]
404 http://server.domain.com/jenkins/manage vs. https://server.domain.com/jenkins/manage
[...]

Questo è apparso solo dopo aver abilitato SSL sul server (che ora utilizza un certificato autofirmato).

Domanda: Come posso correggere la configurazione del proxy inverso in modo che Jenkins sia felice? Punti bonus per suggerimenti su come migliorare il file di configurazione di Apache.

Ho già verificato le seguenti due domande correlate:

Risposte:


9

Questa pagina sul wiki di Jenkins ha menzionato che a partire da luglio 2014 , la configurazione consigliata per il proxy inverso di Jenkins. Il parametro mancante è RequestHeader set X-Forwarded-Proto "https"eRequestHeader set X-Forwarded-Port "443"

Quindi la configurazione è diventata

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/cert.pem
    ServerAdmin  webmaster@localhost
    ProxyRequests     Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass         /  http://localhost:8080/ nocanon
    ProxyPassReverse  /  http://localhost:8080/
    ProxyPassReverse  /  http://www.example.com/
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"
</VirtualHost>

2
Fantastico, ha funzionato perfettamente! Dovevo anche fare sudo a2enmod headers, altrimenti avrei ricevutoInvalid command 'RequestHeader'
friederbluemle il

Puoi spiegare perché stai usando due ProxyPassReversedirettive per lo stesso percorso ( /)?
Ortomala Lokni

1

Installazione front-end di Windows Apache per Jenkins

Le principali differenze qui sono:

  • Come impostare un certificato temporaneo
  • fermare l'apache winging per non avere alcuna cache SSL

La mia configurazione:

  • Installare era d: \ (non c: \ - adattarlo alle proprie esigenze)

  • Jenkins è sulla porta 8080

  • Decomprimi Apache httpd-2.4.18-win64-VC14.zip (da http://www.apachelounge.com/download/ ) in d: \.

  • Installa OpenSSL Win64OpenSSL_Light-1_0_2f.exe ( http://slproweb.com/products/Win32OpenSSL.html ) su d: \ OpenSSL-Win64

  • Crea il certificato ssl:

    • cd nella directory bin OpenSSL ed esegui la magia:

       pushd d:\OpenSSL-Win64\bin
       set OPENSSL_CONF=openssl.cfg
       openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
      
  • Copia i file del server. * Da d: \ OpenSSL-Win64 \ bin in D: \ Apache24 \ conf

  • Modifica d: \ Apache24 \ conf \ httpd.conf:

    • Cerca e sostituisci "c: /" con "d: /"

    • Cambia dopo la riga "Ascolta 80", aggiungendo "Ascolta 443":

      Listen 80
      Listen 443
      
    • Riattiva queste righe:

      LoadModule headers_module modules/mod_headers.so
      LoadModule proxy_module modules/mod_proxy.so
      LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
      LoadModule proxy_http_module modules/mod_proxy_http.so
      LoadModule rewrite_module modules/mod_rewrite.so
      LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
      LoadModule ssl_module modules/mod_ssl.so
      LoadModule vhost_alias_module modules/mod_vhost_alias.so
      
    • Aggiorna "#ServerName www.example.com:80" a:

      ServerName myserver.mydomain:80
      
    • Aggiungi questo alla fine:

      <IfModule socache_shmcb_module>
      SSLSessionCache "shmcb:logs/ssl_scache(512000)"
      </IfModule>
      
      <VirtualHost *:80>
        ServerName myserver
        Redirect permanent / https://myserver.mydomain/
      </VirtualHost>
      
      <VirtualHost *:80>
        ServerName myserver.mydomain
        Redirect permanent / https://myserver.mydomain/
      </VirtualHost>
      
      <VirtualHost *:443>
                  SSLEngine on
                  SSLCertificateFile conf/server.crt
                  SSLCertificateKeyFile conf/server.key
                  ServerAdmin  me@mydomain
                  ProxyRequests             Off
                  ProxyPreserveHost On
                  AllowEncodedSlashes NoDecode
                  <Proxy *>
                              Order deny,allow
                              Allow from all
                  </Proxy>
                  ProxyPass         /  http://localhost:8080/ nocanon
                  ProxyPassReverse  /  http://localhost:8080/
                  ProxyPassReverse  /  http://myserver.mydomain/
                  RequestHeader set X-Forwarded-Proto "https"
                  RequestHeader set X-Forwarded-Port "443"
      </VirtualHost>
      

Non ho fermato l'ascolto di Jenkins sulla porta 8080, quindi posso ancora collegarmi se Apache fallisce. Il mio obiettivo nell'uso di https è nascondere i parametri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.