Comment puis-je passer le certificat du client avec l'adresse HTTP du client?
Je veux utiliser mutuelle authentification SSL entre le service A et B. je suis actuellement à la mise en œuvre de passer le certificat du client du service en Java. Je suis à l'aide d'Apache DefaultHttpClient l'exécution de mes demandes. J'ai pu récupérer le certificat du client pour mon service Un de interne gestionnaire d'informations d'identification et je le garde comme un tableau d'octets.
DefaultHttpClient client = new DefaultHttpClient();
byte [] certificate = localCertManager.retrieveCert();
J'ai très peu d'expérience dans ce domaine et je vous remercie de votre aide!
J'ai pensé que peut-être il devrait être d'une certaine manière, à travers des arguments à l'adresse HTTP du client ou peut-être dans les en-têtes.
Comment puis-je passer le certificat du client avec l'adresse HTTP du client?
OriginalL'auteur agerrr | 2013-08-30
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de dire à un SSLSocketFactory (org.apache.http, pas javax) à propos de votre fichier de clés, et de configurer votre DefaultHTTPClient à utiliser pour les connexions https.
Un exemple est ici: http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientCustomSSL.java
C'est vaguement correct pour commencer, mais le lié exemple confond les choses en n'utilisant pas les certificats clients. Il définit en fait la variante CA certs pour la confiance que le serveur soit connecté à la place, mais peut apparaître à quelqu'un de ne pas intimement familier avec SSLContexts pour être un bon exemple. J'ai suivi ce et de a fallu beaucoup de temps pour démêler que loadTrustMaterial ne fonctionne pas.
OriginalL'auteur covener
Le certificat client est envoyé lors de la poignée de main TLS lors de l'établissement d'une connexion et ne peut pas être envoyé via HTTP à l'intérieur de cette connexion.
La communication est des couches, comme ceci:
Vous devez envoyer le certificat du client lors de la poignée de main TLS avant tout HTTP (méthodes, en-têtes, des Url, des corps de la demande) est disponible pour être influencé. Le serveur n'acceptera pas un certificat du client envoyé au plus tard.
Je le recommande commutation de DefaultHttpClient (obsolète) à CloseableHttpClient qui fonctionne plus correctement avec le try-with-resources.
Apache HttpClient 4.5 fait TLS Mutuelle assez pratique. Cette réponse a été testé avec Apache HttpClient 4.5.3.
Le point de départ essentiel est à l'aide de loadKeyMaterial à la charge de votre client certicat et il est la clé (le client paire de clés) dans le SSLContext:
Et enfin la construction d'un client HTTP avec ce socket usine:
Avec le client, l'ensemble de vos demandes peuvent être exécutées avec l'authentification TLS Mutuelle implicite:
Ici un exécutable exemple de TLS mutuelle avec Apache HttpClient:
Il est généralement préférable d'utiliser des Gradle ou Maven pour lancer quelque chose comme ça, mais dans l'intérêt de garder ce Yak se raser aussi minime que possible je suis de base JDK instructions pour la construction et l'exécution de cette.
Télécharger des Pots dans les pages suivantes:
Enregistrer l'exemple complet ci-dessus comme MutualHttpsMain.java.
Copie de votre fichier PKCS#12, mutuelle-tls-keystore.p12 dans le même répertoire.
Compiler comme suit (sur macOS/Linux/*nix aime):
Ou sur Windows:
Déroulera comme suit (sur macOS/Linux/*nix aime):
Déroulera comme suit (sur Windows):
OriginalL'auteur Alain O'Dea