PowerProtect : Échec de l’authentification à l’aide d’Active Directory après la mise à niveau vers la version 19.19
Summary: Les utilisateurs ne peuvent pas se connecter à PowerProtect Data Manager à l’aide des informations d’identification Active Directory.
Symptoms
Les utilisateurs ne peuvent pas s’authentifier à l’aide de leurs informations d’identification Microsoft Active Directory (AD) après la mise à niveau de PowerProtect vers la version 19.19.0-15.
Un message d’erreur similaire à ce qui suit s’affiche :
"Failed to authenticate the user with identity provider. Please check for any network connectivity issues with the external identity provider if configured. Also check for expired certificates or credential issues with the configured provider."
Un message d’erreur similaire à ce qui suit est présent dans le fichier keycloak.log de l’appliance PowerProtect :
2025-04-02 01:11:20,715 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-23) Uncaught server error: org.keycloak.models.ModelException: LDAP Query failed at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getResultList(LDAPQuery.java:178) at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getFirstResult(LDAPQuery.java:185) at org.keycloak.storage.ldap.LDAPStorageProvider.loadLDAPUserByUsername(LDAPStorageProvider.java:1052) at org.keycloak.storage.ldap.LDAPStorageProvider.getUserByUsername(LDAPStorageProvider.java:649) at org.keycloak.storage.ldap.LDAPStorageProvider.getUserById(LDAPStorageProvider.java:373) at org.keycloak.storage.UserStorageManager.getUserById(UserStorageManager.java:395) at org.keycloak.models.cache.infinispan.UserCacheSession.getUserById(UserCacheSession.java:222) at org.keycloak.models.sessions.infinispan.PersistentUserSessionProvider.wrap(PersistentUserSessionProvider.java:642) at org.keycloak.models.sessions.infinispan.PersistentUserSessionProvider.getUserSession(PersistentUserSessionProvider.java:287) at org.keycloak.models.sessions.infinispan.PersistentUserSessionProvider.getUserSession(PersistentUserSessionProvider.java:282) at org.keycloak.services.managers.AuthenticationManager.verifyIdentityToken(AuthenticationManager.java:1493) at org.keycloak.services.managers.AuthenticationManager.authenticateIdentityCookie(AuthenticationManager.java:862) at org.keycloak.services.managers.AuthenticationSessionManager.getUserSessionFromAuthenticationCookie(AuthenticationSessionManager.java:259) at org.keycloak.protocol.AuthorizationEndpointBase.createAuthenticationSession(AuthorizationEndpointBase.java:184) at org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.process(AuthorizationEndpoint.java:193) at org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildGet(AuthorizationEndpoint.java:115) at org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint$quarkusrestinvoker$buildGet_4b690b27439f19dd29733dc5fd4004f24de0adb6.invoke(Unknown Source) at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29) at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141) at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147) at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:635) at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521) at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11) at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: org.keycloak.models.ModelException: Querying of LDAP failed org.keycloak.storage.ldap.idm.query.internal.LDAPQuery@29377815 at org.keycloak.storage.ldap.idm.store.ldap.LDAPIdentityStore.fetchQueryResults(LDAPIdentityStore.java:294) at org.keycloak.storage.ldap.idm.query.internal.LDAPQuery.getResultList(LDAPQuery.java:174) ... 27 more Caused by: javax.naming.CommunicationException: yourcompany.com:636 [Root exception is javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target] at java.naming/com.sun.jndi.ldap.Connection.<init>(Connection.java:251) at java.naming/com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:141) at java.naming/com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1620) at java.naming/com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2848) at java.naming/com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:349) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:229) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:247) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154) at java.naming/com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84) at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:520) at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305) at java.naming/javax.naming.InitialContext.init(InitialContext.java:236) at java.naming/javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154) at org.keycloak.storage.ldap.idm.store.ldap.LDAPContextManager.createLdapContext(LDAPContextManager.java:74) at org.keycloak.storage.ldap.idm.store.ldap.LDAPContextManager.getLdapContext(LDAPContextManager.java:93) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:709) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.execute(LDAPOperationManager.java:704) at org.keycloak.storage.ldap.idm.store.ldap.LDAPOperationManager.search(LDAPOperationManager.java:255) at org.keycloak.storage.ldap.idm.store.ldap.LDAPIdentityStore.fetchQueryResults(LDAPIdentityStore.java:278) ... 28 more Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:130) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:378) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:316) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:647) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:467) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:363) at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:393) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:476) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:447) at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:201) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:172) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1506) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1421) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426) at java.naming/com.sun.jndi.ldap.Connection.initialSSLHandshake(Connection.java:370) at java.naming/com.sun.jndi.ldap.Connection.createSocket(Connection.java:288) at java.naming/com.sun.jndi.ldap.Connection.<init>(Connection.java:230) ... 47 more Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:388) at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:271) at java.base/sun.security.validator.Validator.validate(Validator.java:256) at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:230) at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:132) at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:631) ... 61 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:148) at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:129) at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:383) ... 66 more
Cause
Ce comportement se produit lorsque la haute disponibilité est configurée pour les contrôleurs de domaine. Dans PowerProtect Data Manager 19.19, il existe une modification architecturale majeure concernant le fonctionnement de l’authentification et de la gestion des utilisateurs. Dans le cadre de la mise à niveau, la configuration existante est migrée vers la nouvelle architecture. Après la migration, en l’absence du certificat d’autorité de certification racine utilisé pour les contrôleurs de domaine de PowerProtect Data Manager, la chaîne d’approbation est rompue
. La validation échoue lors de la modification de la connexion Active Directory pour extraire automatiquement le certificat d’autorité de certification racine vers la chaîne d’approbation.
Resolution
Dans les versions de PowerProtect Data Manager postérieures à la version 19.19.0-15, les modifications architecturales affectent la validation de la chaîne de certificats. Pour ajouter un certificat d’autorité de certification racine à la chaîne d’approbation, procédez comme suit :
- Assurez-vous que le fichier de certificat d’autorité de certification racine utilisé sur les contrôleurs de domaine est disponible.
- Supprimez la connexion existante à Active Directory.
- Sélectionnez le bouton Add sur la page Directory Settings.
- Sélectionnez AD, cochez la case Connexion sécurisée et renseignez les détails Active Directory.
- Dans la section Certificat, sélectionnez l’option Télécharger le certificat.
- La sélection de l’option Télécharger le certificat vous permet de télécharger ou coller le certificat racine ou le certificat de l’hôte.
- Sélectionnez l’option Télécharger le fichier de certificat.
- Sélectionnez le type de certification, qu’il s’agisse d’hôte, d’ICA ou de Root. Si un certificat d’autorité de certification racine doit être chargé, sélectionnez l’option Root.
- Cliquez sur Télécharger le fichier de certificat et sélectionnez le certificat de votre système/serveur.
- Sélectionnez l’option « Coller le certificat ».
- Sélectionnez le type de certification, qu’il s’agisse d’hôte, d’ICA ou de Root. Si un certificat d’autorité de certification racine est en cours d’ajout, sélectionnez l’option Root.
- Collez le certificat dans le champ vide.
- Vérifiez les informations sous Show Advanced Settings et sélectionnez le bouton Apply.
- Allez dans le menu Administration , sélectionnez l’onglet Certificats, puis l’ongletServeurs externes . Vérifiez que vous pouvez trouver un certificat d’autorité de certification racine répertorié avec l’état Approuvé pour le numéro de port utilisé (636 est le port par défaut).
- Accédez à la page Utilisateurs Groupes sous la section Contrôle d’accès pour ajouter des utilisateurs et des groupes à partir d’Active Directory.
- Testez en vous authentifiant à l’aide des informations d’identification Active Directory. Les utilisateurs doivent utiliser userPrincipalName (UPN) lors de l’ajout du nom d’utilisateur sur la page de connexion.
Le Guide de configuration de la sécurité de PowerProtect Data Manager contient plus d’options pour les connexions LDAP (Lightweight Directory Access Protocol) ou AD.
Additional Information
À partir de PowerProtect Data Manager 19.19, dans le nom d’utilisateur, il est recommandé d’utiliser userPrincipalName (UPN) qui est défini dans Active Directory. Le nom de domaine utilisé dans UPN peut être différent du nom utilisé lors de l’ajout d’un domaine à PowerProtect Data Manager. Dans les versions précédentes, les utilisateurs devaient ajouter un nom de domaine à PowerProtect Data Manager.
Solution de contournement
: la connexion Microsoft Active Directory existante peut être supprimée et ajoutée en tant que LDAP sans utiliser le protocole SSL (Secure Sockets Layer). Cela permet aux utilisateurs de s’authentifier sans utiliser la chaîne de certificats.