Come faccio a configurare apache per accettare un certificato ssl client (se presente) o autenticare utilizzando ldap (se il certificato è assente)?

Ho un server Apache che serve i repository mercuriali e attualmente autentica utilizzando le credenziali ldap.

Voglio consentire a un singolo utente (per iniziare) di utilizzare un certificato client SSL, con tutti gli utenti rimanenti ancora in grado di utilizzare il metodo di authentication credenziali ldap.

Ho guardato attraverso il sovrapposizione Stack e altre ricerche (google) più ampie ma non riesco a trovare informazioni / orientamenti su come impostare questo.

Le seguenti configurazioni vhost consentono solo il client cert through. Commento le tre statemens relative a SSL-client; ladp functionrà.

<VirtualHost hg.mydomain.com:80> ServerName hg.mydomain.com:80 RedirectMatch permanent ^(.*)$ https://hg.mydomain.com$1 </VirtualHost> <VirtualHost hg.mydomain.com:443> ServerName hg.mydomain.com:443 # ServerAdmin webmaster@yourdomain.com DocumentRoot "/var/hg" CustomLog /var/log/httpd/hg-access.log combined ErrorLog /var/log/httpd/hg-error.log ScriptAliasMatch ^/(.*) /var/hg/hgweb.cgi$1 # SSL Stuff... SSLEngine on SSLCipherSuite AES+HIGH:3DES+HIGH:RC4:!MD5:!EXPORT:!SSLv2:!aNULL:!eNULL:!KRB5 # Server Certificate: SSLCertificateFile ssl/hg.mydomain.com.crt # Server Private Key: SSLCertificateKeyFile ssl/hg.mydomain.com.key # SSL Protocol Adjustments: BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0 <Directory /var/hg> Options ExecCGI FollowSymlinks AddHandler cgi-script .cgi AllowOverride AuthConfig Order deny,allow Allow from all #SSL-Client Statements SSLVerifyClient optional SSLVerifyDepth 1 SSLRequire %{SSL_CLIENT_S_DN_CN} eq "robotuser" AuthName "Developers" AuthBasicProvider ldap # AuthLDAPEnabled On AuthLDAPUrl ldaps://ldap.applied.sec/dc=applied,dc=sec?uid AuthzLDAPAuthoritative On Require valid-user </Directory> # Taken from http://www.pmwiki.org/wiki/Cookbook/CleanUrls#samedir # Used at http://ggap.sf.net/hg/ RewriteEngine On #write base depending on where the base url lives #RewriteBase /hg RewriteRule ^$ hgweb.cgi [L] # Send requests for files that exist to those files. RewriteCond %{REQUEST_FILENAME} !-f # Send requests for directories that exist to those directories. RewriteCond %{REQUEST_FILENAME} !-d # Send requests to hgweb.cgi, appending the rest of url. RewriteRule (.*) /hgweb.cgi/$1 [QSA,L] Include repos.d/repos.*.conf 

Sembra che dovrò in qualche modo creare un alias per il block directory e quindi applicare la logica per verificare la presenza / assenza del certificato client. Non so come farlo.

Se ci sono altri modi per acclimatare questo. Mi piacerebbe sentire parlare.

  • Possibile avere 2 certificati SSL in Apache?
  • Problemi di commutazione di Apache per l'utilizzo di un nuovo certificato SSL
  • Fix missing ssl-cert per il sottodominio www. utilizzando il reindirizzamento o simili
  • Imansible proteggere il dominio secondario con SSL
  • Quali sono gli effetti di avere il certificato TLS e la chiave privata nello stesso file?
  • Forzare SSL su determinati routes e forzare non-SSL su tutti gli altri routes con NGINX
  • Quando redirect nginx https non-www -> www, ho bisogno di ssl su?
  • è la ssl wildcard insicura?
  • 3 Solutions collect form web for “Come faccio a configurare apache per accettare un certificato ssl client (se presente) o autenticare utilizzando ldap (se il certificato è assente)?”

    Questo è un po 'di una congettura (non ho un modo semplice per provarlo) ma forse una combinazione di SSLOptions +FakeBasicAuth e Satisfy Any ti vedrà?

    Ho capito un modo per farlo per Apache 2.2 e 2.4, avremo bisogno di una pulizia finale per qualunque siano le vostre esigenze, ma il bit difficile dovrebbe essere fatto (o alless fatto abbastanza per chiunque altro per capire where andare vai da qui).

    Entrambe le configurazioni portno allo stesso fine finale: un client / utente può fornire un certificato, se non viene fornito, verrà richiesto per le credenziali LDAP.

    Devi triggersre mod_ssl e mod_authnz_ldap. Per Apache 2.2 devi anche abilitare mod_rewrite e mod_alias.

    Apache 2.4 introduce una direttiva If / ElseIf / Else generale che semplifica molto questa attività: http://httpd.apache.org/docs/current/mod/core.html#if

    Io non sono un guru di Apache, quindi può esserci qualcosa di terribilmente sbagliato con quello che ho fatto, ma sembra che raggiunga lo scopo statale.

    Apache 2.2:

     <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerName Dummy-testing-kbd ServerAdmin webmaster@localhost # Normal HTTPS Server Certificate Config SSLEngine on SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key # End HTTPS Config DocumentRoot /var/www Alias /ldap / <Location /ldap/> # LDAP Authentication Config AuthType Basic AuthBasicProvider ldap AuthzLDAPAuthoritative on AuthName "Password Protected. Enter your AD Username and Password" AuthLDAPURL "ldaps://ldaps-auth.mydomain.com/OU=People,DC=mydomain" Require valid-user # End LDAP </Location> <Location /> # Client Cert Config SSLRequireSSL SSLCACertificateFile /etc/ssl/ca/private/ca.crt SSLVerifyClient optional SSLVerifyDepth 2 # Populate REMOTE_USER with the value from the client certificate SSLUserName SSL_CLIENT_S_DN_CN # End Client Cert Config # Hacky way to use an internal redirect to force LDAP authentication if the certificate didn't populate the REMOTE_USER variable RewriteEngine on RewriteCond %{REMOTE_USER} ^$ RewriteRule (.*) /ldap/$1 [L] </Location> ErrorLog ${APACHE_LOG_DIR}/cert_or_ldap_error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel debug CustomLog ${APACHE_LOG_DIR}/cert_or_ldap_access.log combined </VirtualHost> </IfModule> 

    Apache 2.4:

     <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerName Dummy-testing-kbd2 ServerAdmin webmaster@localhost # Normal HTTPS Server Certificate Config SSLEngine on SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key # End HTTPS Config # Client Cert Config - setup Certificate Authority SSLCACertificateFile /etc/ssl/ca/private/ca.crt # End Client Cert Config DocumentRoot /var/www <Location /> # Client Cert Config SSLRequireSSL SSLVerifyClient optional SSLVerifyDepth 2 # Populate REMOTE_USER with the value from the client certificate SSLUserName SSL_CLIENT_S_DN_CN # End Client Cert Config # Configuring LDAP: # If no REMOTE_USER is defined (by the certificate) then do LDAP authentication <If "-z %{REMOTE_USER}"> AuthType Basic AuthBasicProvider ldap AuthName "Password Protected. Enter your AD Username and Password" AuthLDAPURL "ldaps://ldaps-auth.mydomain.com/OU=People,DC=mydomain" Require valid-user </If> # End LDAP </Location> ErrorLog ${APACHE_LOG_DIR}/cert_or_ldap_error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel debug CustomLog ${APACHE_LOG_DIR}/cert_or_ldap_access.log combined </VirtualHost> </IfModule> 

    Dovresti fare quel tipo di logica in un server backend, PHP o Java o Perl. Quindi reindirizzando impostando l'intestazione Location: al controllo sorgente effettivo.

    Se si desidera una logica di tipo if / then / else, è necessario implementarlo in un linguaggio di programmazione.

    Non sono sicuro di cosa intendi con la tua dichiarazione. Hai detto che questa configuration consente solo il client cert, e ha anche detto che LDAP functionrà. Questo rende il suono come se avete tutto il lavoro e siete tutti insieme!

    Vorrei cambiare. La directory è di solito per le cose specifiche del file system anche se sono simili.

    Provate a utilizzare due differenti e per consentire all'utente di scegliere l'URL in base all'authentication che vogliono provare.

    SSLVerifyClient optional permetterà solo al cliente di presentare un certificato, se lo ritenere. Potrebbe essere necessario cambiare per require . L'authentication avverrà a livello di Apache e, se fallisce, riceverà un errore del server.

    https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslverifyclient

    Mettere l'LDAP in un altro e l'utente può andare lì invece. Non ho usato il module di authentication LDAP da Apache.

    È ansible modificare il file di errore per includere un collegamento o un reindirizzamento automatico al collegamento LDAP se non è il collegamento SSL.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.