getAttribute(“javax.servlet.demande.X509Certificate”) non réglé (Printemps,CXF,la Jetée,JAX-RSv1.1)
Mon client implémente les Deux sens SSL de la manière suivante:
private final static String KEYSTORE = "/security/client.jks"; private final static String KEYSTORE_PASSWORD = "secret"; private final static String KEYSTORE_TYPE = "JKS"; private final static String TRUSTSTORE = "/sécurité/certificats.jks"; private final static String TRUSTSTORE_PASSWORD = "secret"; private final static String TRUSTSTORE_TYPE = "JKS"; ... Fichier de clés keystore = fichier de clés.getInstance(KEYSTORE_TYPE); FileInputStream keystoreInput = new FileInputStream(new File(fichier de stockage des clés)); fichier de stockage des clés.charge(keystoreInput, KEYSTORE_PASSWORD.toCharArray()); Fichier de clés truststore = fichier de clés.getInstance(TRUSTSTORE_TYPE); FileInputStream truststoreIs = new FileInputStream(new File(TRUSTSTORE)); truststore.charge(truststoreIs, TRUSTSTORE_PASSWORD.toCharArray()); SSLSocketFactory socketFactory = new SSLSocketFactory(fichier de stockage des clés, KEYSTORE_PASSWORD, truststore); Régime de régime = nouveau Régime("https", 8543, socketFactory); SchemeRegistry registre = new SchemeRegistry(); de registre.registre(schéma); ClientConnectionManager ccm = new PoolingClientConnectionManager(registre); httpclient = new DefaultHttpClient(ccm); HttpResponse response = null; HttpGet httpget = new HttpGet("https://mylocalhost.com:8543/test"); response = httpclient.execute(httpget); ...
Et j'essaie de récupérer le X. 509 certificate sur le côté du serveur par le client via javax.servlet.http.HttpServletRequest.getAttribute("javax.servlet.demande.X509Certificate") comme il est décrit ici: http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletRequest.html#getAttribute%28java.lang.String%29.
- Je obtenir le HttpServletRequest sur le côté du serveur via:
HttpServletRequest servletRequest = (HttpServletRequest) msg.get("HTTP".La REQUÊTE"); via le handleMessage(Message msg) méthode de mon intercepteur de classe qui s'étend AbstractPhaseInterceptor<Message>. J'ai utiliser JAX-RS 1.1.1 sur le côté du serveur à cause de certaines dépendances Maven dont je ne suis pas autorisé à changer et donc je ne peut pas utiliser ContainerRequestFilter (pris en charge à partir de JAX-RS 2.0 sur).
Mon problème est que getAttribute("javax.servlet.demande.X509Certificate") sur le côté du serveur renvoie la valeur nulle de tous les temps. Si j'ai vérifier le trafic entre le serveur et le client, je peux voir que le certificat du serveur est envoyé au client, que la poignée de main d'œuvres. Mais je ne vois pas que le certificat client est envoyé sur le serveur et je pense que c'est la raison pour laquelle getAttribute("javax.servlet.request.X509Certificate")
retourne null
. Quelqu'un sait comment je peux résoudre ce problème? J'ai essayé quelques autres implémentations du côté du client déjà, mais sans changement.
Ce que je fais mal? Merci beaucoup d'avance!
Informations supplémentaires: j'ai vu sur le côté du serveur qui javax.servlet.demande.ssl_session_id, javax.servlet.demande.key_size et javax.servlet.demande.cipher_suite sont ensemble, mais la clé javax.servlet.demande.X509Certificate n'est pas définie. Je suis en utilisant le Serveur Jetty 8.1.15, Apache CXF 2.7.x et JAX-RS 1.1.1. J'ai essayé avec de la Jetée de configuration via http://cxf.apache.org/docs/jetty-configuration.html et http://cxf.apache.org/docs/secure-jax-rs-services.html#SecureJAX-RSServices-Configuringendpoints, l'attribut n'est toujours pas réglé.
- Le suggère le titre que vous souhaitez signer la demande HTTPS, le contenu de la question, on dirait que vous essayez d'utiliser un certificat client. Ceux sont des choses différentes.
- Salut Bruno, un client doit être authentifié par le serveur via X. 509 certificate. Je veux extraire les X. 509 certificat de sorte que le serveur peut comparer le certificat avec ses truststore. Je ne pouvais pas savoir encore si le problème est du côté du client ou du côté serveur. Donc, ma question peut-être un peu imprécise. S'il vous plaît garder avec moi, je suis un débutant ici. Merci beaucoup! J'ai ajouté des informations supplémentaires ci-dessus.
Vous devez vous connecter pour publier un commentaire.
Problème est résolu. Il n'était pas un problème dans le code, c'était un problème de certificat seulement. Mon problème était que j'étais un débutant concernant les certificats X509 ainsi, c'était un problème de poignée de main entre le serveur et le client. Dans ce cas, seul le protocole SSL/poignée de main debug m'a aidé. Le journal de débogage dit que le serveur n'a accepté le client de certificats émanant d'une autorité de certification spécifique, le serveur dit au client l'autorité de certification requise dans une demande de certificat au cours de la ServerHello message. Étant donné que le Client n'a pas un certificat du CA, il n'a pas envoyer quelque chose et la connexion entre le client et le serveur a été fermé puis, avec le résultat que javax.servlet.demande.X509Certificate n'a pas été définie.
Pour toutes les autres personnes qui pourraient rejoindre le même problème parfois (ce qui semble être une commune de la configuration SSL problème quant à IBM, comme il est mentionné dans le premier lien ci-dessous), les sources suivantes m'a beaucoup aidé:
- http://www-01.ibm.com/support/docview.wss?uid=swg27038122&aid=1
(pages 16 et 17)
- http://java.dzone.com/articles/how-analyze-java-ssl-errors (montre que la poignée de main doit chercher)
- besoin d'aide au Débogage SSL handshake dans tomcat (montre comment déboguer les erreurs ssl en Java)
- https://thomas-leister.de/internet/eigene-openssl-certificate-authority-ca-erstellen-und-zertifikate-signieren/ (en allemand, mais peut-être que vous pouvez trouver un équivalent en anglais)
- https://access.redhat.com/site/documentation/en-US/Red_Hat_JBoss_Fuse/6.0/html/Web_Services_Security_Guide/files/i382674.html (suite de l'article en allemand)
- http://www.webfarmr.eu/2010/04/import-pkcs12-private-keys-into-jks-keystores-using-java-keytool/ (comment créer un fichier de clés et truststore)
Après la création d'une autorité de certification, d'un serveur et le certificat du client et après la création du fichier de stockage des clés et truststore pour les deux, l'attribut a été défini maintenant:
- Here15_1: javax.servlet.demande.X509Certificate
- Here16_2: la classe [Ljava.de sécurité.cert.X509Certificate;
- Here16_3: [Ljava.de sécurité.cert.X509Certificate;@43b8f002
Le code du serveur est capable d'extraire le certificat du client de l'information maintenant, trop.