Configuration correcte du proxy inverse Apache avec SSL pour Jenkins et Sonar

11

J'exécute deux services derrière un serveur Apache: Jenkins (port 8080) et SonarQube (port 9000).

Ma configuration apache ressemble à ceci:

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

Tout semble bien fonctionner, sauf que Jenkins se plaint de ce message: Il semble que la configuration de votre proxy inverse soit rompue.

Lorsque j'exécute le test ReverseProxySetupMonitor fourni par Jenkins, le message d'erreur indique que quelque chose avec le proxy inverse n'est pas configuré correctement, car il ne remplace pas http par 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
[...]

Cela n'est apparu qu'après avoir activé SSL sur le serveur (qui utilise maintenant un certificat auto-signé).

Question: Comment puis-je corriger la configuration du proxy inverse pour que Jenkins soit satisfait? Points bonus pour des conseils sur la façon d'améliorer le fichier de configuration d'apache.

J'ai déjà vérifié les deux questions connexes suivantes:

friederbluemle
la source

Réponses:

9

Cette page sur le wiki Jenkins mentionne qu'en juillet 2014 , la configuration recommandée pour le proxy inverse Jenkins. Le paramètre manquant est RequestHeader set X-Forwarded-Proto "https"etRequestHeader set X-Forwarded-Port "443"

La configuration est donc devenue

<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>
masegaloeh
la source
2
Génial, cela a parfaitement fonctionné! Je devais aussi le faire sudo a2enmod headers, sinon j'obtiendraisInvalid command 'RequestHeader'
friederbluemle
Pouvez-vous expliquer pourquoi utilisez-vous deux ProxyPassReversedirectives pour le même chemin ( /)?
Ortomala Lokni
1

Configuration de Windows Apache Front-end pour Jenkins

Les principales différences ici sont:

  • Comment configurer un certificat temporaire
  • arrêter apache aile de ne pas avoir de cache SSL

Ma configuration:

  • L'installation était à d: \ (pas c: \ - adaptez ceci à vos besoins)

  • Jenkins est sur le port 8080

  • Décompressez Apache httpd-2.4.18-win64-VC14.zip (de http://www.apachelounge.com/download/ ) vers d: \.

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

  • Créez le certificat SSL:

    • cd dans le répertoire bin d'OpenSSL et lancez la magie:

       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
      
  • Copiez les fichiers du serveur. * De d: \ OpenSSL-Win64 \ bin vers D: \ Apache24 \ conf

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

    • Recherchez et remplacez "c: /" par "d: /"

    • Changer après la ligne "Listen 80", en ajoutant "Listen 443":

      Listen 80
      Listen 443
      
    • Décommentez ces lignes:

      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
      
    • Mettez à jour "#ServerName www.example.com:80" pour:

      ServerName myserver.mydomain:80
      
    • Ajoutez ceci à la fin:

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

Je n'ai pas empêché Jenkins d'écouter sur le port 8080, donc je peux toujours me connecter en cas d'échec d'Apache. Mon objectif en utilisant https est de masquer les paramètres.

David Robson
la source