Mutuelle d'authentification avec les services web
Actuellement, j'ai réussi la mise en œuvre de l'Authentification Mutuelle de sécurité tant que le client accède au site à l'aide d'un navigateur web, car les navigateurs prennent soin de l'échange de certificats pour vous. Maintenant, j'ai besoin de créer une interface sécurisée avec laquelle les utilisateurs peuvent accéder à des services web via HTTPS, à l'aide de l'authentification mutuelle requise par le serveur.
Tout d'abord, il y a aucune ressources quelqu'un sait de qui peut m'aider? J'ai regardé pendant un certain temps et n'a rien trouvé. Tout autres conseils de quelqu'un peut me donner sur la façon d'aller à ce sujet?
Deuxièmement, je pense que mon plus grand barrage est mon manque de compréhension de la façon de gérer les certificats. Comment puis-je négocier acceptant la clé du serveur et de présenter ma propre clé pour le serveur? C'est en Java.
Vous devez vous connecter pour publier un commentaire.
J'ai passé un long moment sur ce sujet, mais j'ai finalement trouvé un exemple qui fonctionne réellement. C'est Glassfish et Netbeans mais je suppose que vous pourriez obtenir en travaillant dans d'autres milieux (par exemple, Eclipse et Tomcat) si vous avez joué un peu avec elle.
http://java.sun.com/webservices/reference/tutorials/wsit/doc/WSIT_Security9.html#wp162511
Le problème que j'ai trouvé bien, c'est quand vous voulez utiliser vos propres certificats, pas ceux qui sont déjà pré-installé avec glassfish.
Note: je ne suis pas un expert en sécurité. Ne pas déployer ce dans un environnement de production!
Pour ce faire, je suis à l'aide de NetBeans 6.9, JDK 1.6, GlassFish 3.0.1 et OpenSSL v1.0 (je suis en utilisant le titre officieux de binaires Win32)
Dans la console d'administration de GlassFish, activer la Sécurité de votre http-listener, cochez la SSL3, TLS Authentification des Clients et des boîtes, définir le Certificat d'un Pseudo serveur, la Clé de stockage de config\fichier de clés.jks, la banque de Confiance de config\fichier de clés.jks, la Confiance de l'Algorithme de PKIX et de laisser le Max Longueur de Certificat à 5.
Dans NetBeans, créez un nouveau projet d'Application Web. Dans ce cadre, de créer un nouveau Service Web.
Mon code de Service Web ressemblait à ceci:
Clic droit sur le Service Web et sélectionnez Web de modification des Attributs de Service. Cochez le Service de sécurité de la boîte et sélectionnez Mutuelle des Certificats de Sécurité, le Mécanisme de Sécurité. Cliquez sur le bouton configuration... et cochez le cryptage de la boîte de Signature. Maintenant décocher le Développement de l'Utilisation par Défaut de la boîte, puis cliquez sur le fichier de clés bouton. Définir l'emplacement de votre serveur.jks fichier de clés et sélectionnez le
server
alias. Faites de même pour le Truststore de configuration (même si vous n'avez pas à sélectionner un alias ici).Importer le client1.p12 certificat du client dans votre navigateur. Déployer votre Service Web pour Glassfish. Ouvrez votre service web dans un navigateur et accédez à l'déployé WSDL via HTTPS. Télécharger le fichier WSDL, et les autres schémas. Renommer référencé schémas de copies locales de sorte que lorsque vous utilisez WSDL2Java NetBeans n'utilise pas toutes les ressources distantes. (Ce paragraphe est parce que vous avez limité votre WSDL pour les clients avec un certificat approuvé mais NetBeans peut pas le récupérer à distance car il n'a pas accès au certificat en question).
Créer un nouveau Projet Java. Créer un nouveau Client de Service Web. Lorsque vous y êtes invité, point de NetBeans pour enregistrer votre fichier WSDL. Importer le METRO2.0 les fichiers de bibliothèque (
C:\Program Files\Netbeans 6.9\enterprise\modules\ext\metr\webservices-*.jar
). Mon code ressemble à ceci:Copie webservices-api.jar dans votre Java\jdk1.6\jre\lib\approuvé répertoire.
Cliquez-droit sur le Service Web de référence et sélectionnez Web de modification des Attributs de Service. Définir l'emplacement du fichier de stockage des clés à client1.jks et définir l'alias de
client1
. Définir le truststore emplacement de client1.jks et définir l'alias deserver
.J'espère que vous pouvez maintenant exécuter votre client et vous devriez obtenir un résultat comme ceci:
[email protected], CN=Bob Smith, OU=Something, O=SomethingElse, L=AnyTown, ST=AnyState, C=US
Pour l'authentification mutuelle avec le protocole SSL (aka les deux sens SSL) à l'extérieur d'un navigateur, vous aurez besoin de... Bien, en fait, nous allons voir ce que vous avez besoin d'un moyen de SSL première:
Le serveur de fichier de clés contient le serveur (éventuellement auto-signé) certificat et la clé privée. Ce magasin est utilisée par le serveur pour signer des messages et de retour d'informations d'identification pour le client.
Le client truststore contient le serveur (auto-signé) certificat (extrait à partir du serveur de fichier de clés dans un stand-alone un certificat, sans la clé privée du serveur). Ceci est nécessaire si le certificat n'est pas signé par une autorité de certification de confiance pour lesquels vous avez déjà un certificat dans le truststore fourni avec le JRE. Cette étape permet de créer une chaîne de confiance.
Avec cela, vous pouvez mettre en œuvre un moyen de SSL (l'utilisation traditionnelle des cas).
Pour mettre en œuvre les deux sens de SSL, vous devez faire cette installation "symétrique" donc, nous aurons besoin d'ajouter:
Le client de magasin de clés contient le client (éventuellement auto-signé) certificat et la clé privée. Ce magasin est utilisé par le client pour le même but que le serveur de magasin de clés, c'est à dire d'envoyer des informations d'identification du client au serveur lors de la TLS authentification mutuelle poignée de main.
Le serveur truststore contient les clients (auto-signé) autonome certificats (extrait de la clients de magasin de clés en stand-alone certificats, sans les clients de la clé privée). Ceci est nécessaire pour les mêmes raisons que précédemment mentionné.
Quelques ressources pour vous aider à générer des tas de trucs à mettre en œuvre les solutions finales:
Si le service web de la bibliothèque utilise la norme
java.net.URL
classe comme un client HTTP, vous pouvez définir certains propriétés système et l'authentification bidirectionnelle sera géré par le haut-prise en charge de HTTPS.La propriétés nécessaires sont:
javax.net.ssl.trustStore
: Contient de la racine de certificats d'autorité de certificationjavax.net.ssl.keyStore
: Contient du client certificat et la clé privéejavax.net.ssl.keyStorePassword
: Le mot de passe de protection du client de la clé privéeCes paramètres prennent les valeurs par défaut pour toutes les connexions SSL par le processus. Si vous voulez plus de contrôle, vous devez configurer votre propre
SSLContext
. Si c'est possible avec votre webservice d'exécution dépend d'exécution que vous avez choisi.Une recette simple est donnée dans cette entrée de blog.
Mais je pense que la vraie réponse peut dépendre des Api Java que vous utilisez pour mettre en œuvre votre côté client HTTP interactions. Par exemple, il semble que vous feriez des choses un peu différemment à l'aide de JAX-RPC.