2009-12-07 9 views
1

Je tente d'activer la communication SSL à partir d'un client de service Web (Axis2) en utilisant le certificat sur la carte CAC de l'utilisateur. Fonctionne comme un charme .... jusqu'à ce que le serveur Web est activé CAC. À ce stade, la connexion SSL est rejetée avec le message d'erreur indiquant que les autres certificats de la chaîne n'ont pas été inclus.Envoi de la chaîne complète à partir de la carte d'accès commun (CAC)?

Je me suis assuré que le fournisseur est disponible, soit en l'ajoutant dans le fichier security.properties soit en le créant par programmation.

Mon approche actuelle consiste simplement à définir les propriétés du système: System.setProperty ("javax.net.ssl.keyStore", "NONE"); System.setProperty ("javax.net.ssl.keyStoreType", "PKCS11");

Je comprends de this question/réponse que cette approche envoie seulement le certificat "entité finale". Apparemment, j'ai besoin d'implémenter mon propre X509KeyManager. Ceci est nouveau pour moi, quelqu'un peut-il suggérer une bonne référence ou fournir des exemples de la façon de le faire?

Appréciez l'aide.

+0

Êtes-vous sûr de vouloir parler des cartes CAC ici? – bmargulies

Répondre

1

La meilleure implémentation du gestionnaire de clés dépend de l'émetteur des certificats que vous prévoyez d'utiliser.

Si le certificat du CAC de l'utilisateur sera toujours délivré par une autorité de certification spécifique, simplement stocker le certificat de l'émetteur et des certificats intermédiaires en amont de la chaîne dans un fichier PKCS # 7  . Dans la méthode getCertificateChain(), cette collection peut être ajoutée en aveugle au certificat de l'utilisateur et renvoyée. Si les choses ne sont pas si simples, mais une liste complète des émetteurs possibles peut être énumérée, obtenir tous leurs certificats, et leurs certificats de l'émetteur, et ainsi de suite, jusqu'à la racine des certificats.

Ajoutez tous les certificats racine à un magasin de clés en tant qu'entrées approuvées. Regroupez les certificats intermédiaires dans un fichier de format PKCS- # 7 –.

Mettre en œuvre X509KeyManager (ou étendre X509ExtendedKeyManager si vous travaillez avec SSLEngine). Plus précisément, dans la méthode getCertificateChain(), vous allez utiliser un CertPathBuilder pour créer une chaîne valide du certificat de l'utilisateur à une racine approuvée. Le target est le certificat que vous chargez à partir du CAC de l'utilisateur avec le paramètre alias. Les trusted roots sont les certificats dans le magasin de confiance que vous avez créé; les certificats intermédiaires peuvent être loaded à partir du fichier PKCS   # 7 et added to the builder parameters. Une fois la chaîne construite, get the certificate path et convert it à un ensemble. C'est le résultat de la méthode getCertificateChain().

Si vous ne pouvez pas prédire qui délivrera le certificat de l'utilisateur, vous pourrez peut-être obtenir les certificats intermédiaires à l'exécution à partir d'un annuaire LDAP ou d'un autre référentiel. C'est un tout nouveau niveau de difficulté.

+0

Si vous connaissez les intermédiaires et contrôlez le serveur auquel vous vous connectez, vous pouvez ajouter les intermédiaires nécessaires à la configuration du serveur au lieu de modifier le client. –

+0

Peut-être. Cela dépend du serveur. Quand un serveur est mal configuré avec une chaîne incomplète, il n'est pas déraisonnable pour les clients de le traiter comme un bug. De même, il est raisonnable d'avoir la même attente pour l'authentification du client.Dans cette question, l'annonceur a indiqué qu'il contrôle le client et a demandé de l'aide pour la mise en œuvre d'un gestionnaire de clés - une approche qui répond à l'attente de fournir une chaîne complète. – erickson

+0

Merci pour vos commentaires. Je vais essayer ceci avec un socket régulier et ensuite comprendre comment insérer le même changement dans la configuration d'Axis2. –

Questions connexes