Apache SSL fura viselkedés

Sziasztok,

 

van egy RedHat 7.9, azon egy Apache 2.4.6.

Az Apache-on két proxy context van beállítva, a két vhost-nak van saját tanúsítványa, ill. az Apache generált magánk telepítéskor egy sajátot: a CN a szerver FQDN-je, minden más Somewhere meg Somebody.

A következő viselkedés van restartonként, ciklikusan - anélkül, hogy bármit módosítanék a konfigon:

  • első restart: az Apache mindenre a "saját" certet akarja használni, böngésző rinyál
  • második restart: az apache az első vhost-nál az első vhost certet használja, a másik vhost egy API végpont, arra azt írja, hogy hálózati hiba lépett fel (ezt még meg kell néznem, pontosan mi a baja: csak a cert, vagy egyáltalán nem éri el a back-end szervert)
  • harmadik restart: minden működik
  • GOTO 1

És ez az egész tök szépen reprodukálható: csak megállítom és elindítom a httpd-t, és sorban ezek a hibák, vagy a helyes működés jön.

 

Van bárkinek bármi ötlete, merre és mit nézzek meg?

Hozzászólások

A httpd.apache.org-ról lenne itt szó? Mert akkor érdemes lenne a 2.4.48-at is kipróbni belőle.

Nyilván nem egy és nem két helyen megy RHEL/CentOS X+1 apache több domaint SSL-en is kiszolgálva - ez nem is kérdés. :)

De konkrétan EZ mitől lehet, hogy ciklikusan újraindítva más-más a működés - anélkül, hogy a konfighoz hozzányúlnék.

Nyilván el is bacarinthatom a konfigot, de akkor nem megy. Soha. Egyáltalán. Nem pedig len(SSL hosztok száma) periódusonként előidézve a f*szságait.

Config fájlok vannak? Mert ez valamilyen race condition lehet és/vagy a fájlok beolvasási sorrendje változik és amelyik később töltődik be, az csendesen felülcsapja az előzőt.

A releváns részek:

# grep -i include conf/httpd.conf
Include conf.modules.d/*.conf
...
IncludeOptional conf.d/*.conf

# ls -1 conf.modules.d/*.conf
conf.modules.d/00-base.conf
conf.modules.d/00-dav.conf
conf.modules.d/00-lua.conf
conf.modules.d/00-mpm.conf
conf.modules.d/00-proxy.conf
conf.modules.d/00-ssl.conf
conf.modules.d/00-systemd.conf
conf.modules.d/01-cgi.conf

# ls -1 conf.d/*.conf
conf.d/autoindex.conf
conf.d/ssl.conf
conf.d/userdir.conf
conf.d/vhost_testwebapi.conf
conf.d/vhost_testweb.conf
conf.d/welcome.conf

Ezek közül az ssl.conf, vhost_testwebapi.conf és vhost_testweb.conf tartalmaz SSL beállítást:

conf.d/ssl.conf:SSLCertificateFile /etc/pki/tls/certs/localhost.crt
conf.d/ssl.conf:SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

conf.d/vhost_testwebapi.conf:    SSLCertificateKeyFile       /etc/httpd/ssl/testwebapi.key
conf.d/vhost_testwebapi.conf:    SSLCertificateFile          /etc/httpd/ssl/testwebapi.pem
conf.d/vhost_testwebapi.conf:    SSLCertificateChainFile     /etc/httpd/ssl/testwebapi.crt

conf.d/vhost_testweb.conf:    SSLCertificateKeyFile       /etc/httpd/ssl/testweb.key
conf.d/vhost_testweb.conf:    SSLCertificateFile          /etc/httpd/ssl/testweb.pem
conf.d/vhost_testweb.conf:    SSLCertificateChainFile     /etc/httpd/ssl/testweb.crt

A testweb kb egy statikus oldal, amit ennek ellenére egy Tomcat szolgál ki (ahogy a testwebapi-t is), valami generált JS. Már az ott megjelenő tartalomhoz is kell a testwebapi.

Ma reggel még teszteltem, igazából a ciklikus ismétlődés nem áll, inkább random dobálja be a certeket. Van olyan, hogy az ssl.conf-ban levő cert jön be mindkét oldalhoz (testweb, testwebapi). Van olyan, hogy a testweb oldal bejön a saját certjével, , de a testwebapi az ssl.conf-ban beállított certet használja. És van olyan is, amikor mindkét oldal a neki beállított certet használja.

Ezt a beolvasás sorrendjét más is mondta már (nem itt), de több dolgot sem értek ezzel kapcsolatban:

  • van lehetőség explicit determinisztikus sorrendet megadni? Debian esetében pl. a sites-enabled alatt levő konfigok ABC sorrendben töltődnek be
  • igazából nem tök mindegy, mi a sorrend? A VHOST-nak van beállítva ServerName, akkor miért nem az ott megadott certet használja?

Igen.

Ennek ellenére ezt vágja az arcomba ez a dög induláskor:

[Fri Jul 09 10:19:47.422339 2021] [ssl:debug] [pid 5619] ssl_util_ssl.c(508): AH02412: [testweb.mydomain.hu:443] Cert does not match for name 'testweb.mydomain.hu' [subject: emailAddress=root@SRV-WEB-TEST.mydomain.local,CN=SRV-WEB-TEST.mydomain.local,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=-- / issuer: emailAddress=root@SRV-WEB-TEST.mydomain.local,CN=SRV-WEB-TEST.mydomain.local,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=-- / serial: 20EC / notbefore: Jul  7 15:19:03 2021 GMT / notafter: Jul  7 15:19:03 2022 GMT]

Amúgy a konfig releváns része (a log sor a beállított logból származik):

<VirtualHost *:443>

    ServerName testweb.mydomain.hu
    SSLEngine On

    ErrorLog /var/log/httpd/testweb.mydomain.hu-error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel debug

    LogFormat "\"%{BALANCER_WORKER_NAME}e\" \"%{Set-Cookie}o\" %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" custom

    CustomLog /var/log/httpd/testweb.mydomain.hu-access.log combined


    SSLCertificateKeyFile       /etc/httpd/ssl/testweb.mydomain.hu.key
    SSLCertificateFile          /etc/httpd/ssl/testweb.mydomain.hu.pem
    SSLCertificateChainFile     /etc/httpd/ssl/testweb.mydomain.hu.crt

És akkor még a teljesség kedvéért:

# openssl x509 -in /etc/httpd/ssl/testweb.mydomain.hu.pem -noout -subject
subject= /CN=testweb.mydomain.hu

Az utolsó kettő kb megegyezik, csak a neveket cseréltem ki.

Az ssl.conf-ban sallangmentesítve:

Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost *:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

Ill észrevettem még egy sort most a debug beállítással:

[Fri Jul 09 10:28:03.068797 2021] [ssl:debug] [pid 5684] ssl_util_ssl.c(508): AH02412: [testweb.mydomain.hu:443] Cert does not match for name 'testweb.mydomain.hu' [subject: emailAddress=root@SRV-WEB-TEST.mydomain.local,CN=SRV-WEB-TEST.mydomain.local,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=-- / issuer: emailAddress=root@SRV-WEB-TEST.mydomain.local,CN=SRV-WEB-TEST.mydomain.local,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=-- / serial: 20EC / notbefore: Jul  7 15:19:03 2021 GMT / notafter: Jul  7 15:19:03 2022 GMT]
[Fri Jul 09 10:28:03.068803 2021] [ssl:warn] [pid 5684] AH01909: RSA certificate configured for testweb.mydomain.hu:443 does NOT include an ID which matches the server name
[Fri Jul 09 10:28:03.068807 2021] [ssl:debug] [pid 5684] ssl_engine_init.c(988): AH02236: Configuring RSA server private key
[Fri Jul 09 10:28:03.088365 2021] [ssl:info] [pid 5684] AH02200: Loading certificate & private key of SSL-aware server 'testweb.mydomain.hu:443'
[Fri Jul 09 10:28:03.088457 2021] [ssl:debug] [pid 5684] ssl_engine_pphrase.c(506): AH02249: unencrypted RSA private key - pass phrase not required
[Fri Jul 09 10:28:03.088981 2021] [ssl:info] [pid 5684] AH01914: Configuring server testweb.mydomain.hu:443 for SSL protocol
[Fri Jul 09 10:28:03.089057 2021] [ssl:debug] [pid 5684] ssl_engine_init.c(886): AH01904: Configuring server certificate chain (1 CA certificate)
[Fri Jul 09 10:28:03.089061 2021] [ssl:debug] [pid 5684] ssl_engine_init.c(406): AH01893: Configuring TLS extension handling
[Fri Jul 09 10:28:03.089064 2021] [ssl:debug] [pid 5684] ssl_engine_init.c(933): AH02232: Configuring RSA server certificate
[Fri Jul 09 10:28:03.089099 2021] [ssl:debug] [pid 5684] ssl_util_ssl.c(508): AH02412: [testweb.mydomain.hu:443] Cert matches for name 'testweb.mydomain.hu' [subject: CN=testweb.mydomain.hu / issuer: CN=R3,O=Let's Encrypt,C=US / serial: 03981F9757F723F1D280B0EC4000000000000 / notbefore: Apr 20 09:34:59 2021 GMT / notafter: Jul 19 09:34:59 2021 GMT]

szóval az első sorban jelzi, hogy nem egyezik a certben levő CN a vhost ServerName-el, majd az utolsóban, kb 0.2 mp-el később meg betölti.

Ez most épp egy működő állapot.

 

Szerk:

és akkor egy hibás indulás ismét:

[Fri Jul 09 10:37:07.888173 2021] [ssl:debug] [pid 5733] ssl_util_ssl.c(508): AH02412: [testweb.mydomain.hu:443] Cert matches for name 'testweb.mydomain.hu' [subject: CN=testweb.mydomain.hu / issuer: CN=R3,O=Let's Encrypt,C=US / serial: 03981F9757F723F1D280B0EC4D74455C4771 / notbefore: Apr 20 09:34:59 2021 GMT / notafter: Jul 19 09:34:59 2021 GMT]
[Fri Jul 09 10:37:07.888177 2021] [ssl:debug] [pid 5733] ssl_engine_init.c(988): AH02236: Configuring RSA server private key
[Fri Jul 09 10:37:07.905102 2021] [ssl:info] [pid 5733] AH02200: Loading certificate & private key of SSL-aware server 'testweb.mydomain.hu:443'
[Fri Jul 09 10:37:07.905192 2021] [ssl:debug] [pid 5733] ssl_engine_pphrase.c(506): AH02249: unencrypted RSA private key - pass phrase not required
[Fri Jul 09 10:37:07.905732 2021] [ssl:info] [pid 5733] AH01914: Configuring server testweb.mydomain.hu:443 for SSL protocol
[Fri Jul 09 10:37:07.905809 2021] [ssl:debug] [pid 5733] ssl_engine_init.c(886): AH01904: Configuring server certificate chain (1 CA certificate)
[Fri Jul 09 10:37:07.905813 2021] [ssl:debug] [pid 5733] ssl_engine_init.c(406): AH01893: Configuring TLS extension handling
[Fri Jul 09 10:37:07.905815 2021] [ssl:debug] [pid 5733] ssl_engine_init.c(933): AH02232: Configuring RSA server certificate
[Fri Jul 09 10:37:07.905869 2021] [ssl:debug] [pid 5733] ssl_util_ssl.c(508): AH02412: [testweb.mydomain.hu:443] Cert does not match for name 'testweb.mydomain.hu' [subject: emailAddress=root@SRV-WEB-TEST.mydomain.local,CN=SRV-WEB-TEST.mydomain.local,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=-- / issuer: emailAddress=root@SRV-WEB-TEST.mydomain.local,CN=SRV-WEB-TEST.mydomain.local,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=-- / serial: 20EC / notbefore: Jul  7 15:19:03 2021 GMT / notafter: Jul  7 15:19:03 2022 GMT]

Először megtalálja a jó certet, aztán előveszi a másikat.

Hm... nem lehet, hogy számít, hogy az ssl.conf vagy a testweb*.conf töltődik-e be először? Az ssl.conf default cert az, ami rossz, gondolom.

Hát megmondom őszintén, nem tudom, hogy számít-e. Ha számít, akkor amúgy miért számít? A <Virtualhost> nem elég egyértelmű jelölés?

Amúgy igen, az ssl.conf-ban levő cert (ami amúgy nem default, hiszen miért lenne az default?) amit feleslegesen tölt be ebben a kontextusban.

És a logokat megnézve néha azt tölti be először, néha meg a jót - néha pedig fordítva.

Az mondjuk fura, hogy miért ezt veszi elő, és pl a testweb vhost-ban miért nem jelenik meg a testwebapi, ill viszont?

 

Nem értem... soha nem találkoztam még ilyennel.

Amúgy igen, az ssl.conf-ban levő cert (ami amúgy nem default, hiszen miért lenne az default?) amit feleslegesen tölt be ebben a kontextusban.

Azért default, mert egy host hivatkozás nélküli VirtualHost blokkon belül van. Azt gyanítom, hogy ha ezt tölti be utólag, akkor felülcsapja a másik két VirtualHost szekcióban a cert hivatkozást.

Az mondjuk fura, hogy miért ezt veszi elő, és pl a testweb vhost-ban miért nem jelenik meg a testwebapi, ill viszont?

Mert azok nevesített VirtualHost blokkok.

Ah, köszi, ez adott egy ötletet.

Ez van az ssl.conf-ban:

# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"
#ServerName www.example.com:443

hádde' nincs honnan öröklődnie, mivel nem volt beállítva a ServerName sehol... :(

Most beállítottam, visszatettem az eredeti ssl.conf-ot, és máris jó.

 

Szóval köszi, jövök egy sörrel :).

Az ssl.conf-ból kivettem a <VirtualHost> blokkot teljes egészében. Az ott levő SSLProtocol és SSLCipherSuite direktívákat átpakoltam a kontexten kívül.

Így most nincs "default" cert, és tadámm: minden működik. Legalábbis többszöri restart után is megy minden, a logokban nincs semmi not matched cert.

 

Tanulság nincs.