2010-06-21 1 views
1

Je crée un service Web (et un client de test) qui utilise l'authentification mutuelle. J'ai utilisé this guide pour créer une CA et des magasins clés/confiance mais au lieu de créer des fichiers .p12 pour les clients, j'ai utilisé la section "CONFIGURATION DE VOTRE SERVEUR WEB" pour créer un fichier de clés pour chaque client que je dois authentifier.WebServiceContext.getUserPrincipal renvoie "ANONYMOUS" lors de l'utilisation de l'authentification mutuelle

Le code côté serveur est trivial et doit retourner le nom de l'utilisateur authentifié:

import javax.annotation.Resource; 
import javax.jws.WebMethod; 
import javax.jws.WebService; 
import javax.xml.ws.WebServiceContext; 

@WebService() 
public class ListProducts { 

    @Resource WebServiceContext context; 

    @WebMethod(operationName = "listProducts") 
    public String listProducts() { 
    return context.getUserPrincipal().toString(); 
    } 
} 

Alors que le code client ressemble à:

System.getProperties().setProperty("javax.net.trustStore", "C:\\NetBeansProjects\\security-client\\client.jks"); 
    System.getProperties().setProperty("javax.net.trustStorePassword", "changeit"); 
    System.getProperties().setProperty("javax.net.keyStore", "C:\\NetBeansProjects\\security-client\\client.jks"); 
    System.getProperties().setProperty("javax.net.keyStorePassword", "changeit"); 

    ListProductsService lps = new ListProductsService(); 
    ListProducts lp = lps.getListProductsPort(); 

    System.out.println(lp.listProducts()); 

La partie de la sécurité de mon web Le fichier .xml ressemble à ceci:

<security-constraint> 
    <display-name>HTTPS</display-name> 
    <web-resource-collection> 
     <web-resource-name>All</web-resource-name> 
     <description/> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
     <description>Force HTTPS</description> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>CLIENT-CERT</auth-method> 
</login-config> 

Si cela est utile, je suis en train de déployer sur GlassFish et j'ai utilisé la console d'administration pour configurer SSL Network Listener pour utiliser SSL3, TLS et l'authentification du client et renseigner le magasin de clés et le magasin de confiance et définir PKIX comme algorithme de confiance. .

Le problème est que la sortie du client est ANONYMOUS. Ce que je veux vraiment, c'est l'information d'utilisateur qui est imprimée dans le certificat (par exemple CN=Joe Bloggs, OU=Some Org Unit, O=Some Org, L=AnyTown, ST=AnyState, C=US)

En regardant à travers l'objet MessageContext qui est également retourné, les autres champs semblent être remplis correctement donc je me demande pourquoi les informations de sécurité ne sont pas t étant capturé. Je suis convaincu qu'il y a une prise de contact SSL qui se passe parce que quand j'utilise le -Djavax.net.debug=ssl,handshake les messages enregistrés semblent bien (plus, si je pointe le client vers un autre keystore il tombe dessus). Des idées?

Répondre

0

J'ai pris une approche différente et tout a fonctionné (enfin). Vous pouvez voir le détail dans this answer. L'histoire courte est que l'authentification que j'ai utilisée dans la question est un niveau trop élevé pour que Java puisse y accéder au niveau du service Web.