web-dev-qa-db-fra.com

Corrigez Apache Inverse Proxy Config avec SSL pour Jenkins et Sonar

Je passe 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 fonctionner bien, sauf que Jenkins se plaint de ce message: Il apparaît que votre proxy inverse configuré est cassé.

Lorsque j'exécute le test SystemProxYsepMonitor Fourni par Jenkins, le message d'erreur indique que quelque chose avec le proxy inverse n'est pas configuré correctement, comme cela ne remplace pas HTTP avec 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
[...]

Ceci est uniquement apparu après J'ai activé SSL sur le serveur (qui utilise maintenant un certificat auto-signé).

Question: Comment puis-je corriger la configuration de proxy inverse afin que Jenkins soit heureux? Points bonus pour des conseils sur la manière d'améliorer le fichier de configuration Apache.

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

11
friederbluemle

Configuration de Windows Apache Front-End pour Jenkins

Les principales différences ici sont:

  • Comment configurer un certificat temporaire
  • arrêter Apache à ailleurs à 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 (à partir de - http://www.apachelounge.com/download/ ) à D: \.

  • Installez OpenSSL Win64OPENSSL_Light-1_0_2F.exe ( http://slproweb.com/products/win32openssl.html ) à D:\OpenSSL-Win64

  • Créez le certificat SSL:

    • cD dans le répertoire bin OpenSSL et exécuter 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
      
  • Copier le serveur. * Fichiers de D:\OpenSSL-Win64\bin à D:\apache24\Conf

  • Edit D:\Apache24\Conf\httpd.conf:

    • Rechercher et remplacer "C: /" avec "D: /"

    • Changement après la ligne "Écoutez 80", ajouter "Écouter 443":

      Listen 80
      Listen 443
      
    • Décotez 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
      
    • Mise à jour "#Servername www.example.com:80" à:

      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 arrêté Jenkins en écoutant sur le port 8080, je peux donc toujours vous connecter si Apache échoue. Mon objectif dans l'utilisation de HTTPS est de masquer les paramètres.

1
David Robson