L'accès Https Reste de Service à l'aide de Printemps RestTemplate
Quelqu'un peut-il me fournir un exemple de code pour l'accès reste de l'url du service sécurisé par https à l'aide de printemps reste modèle.
J'ai le certificat, le nom d'utilisateur et mot de passe. L'Authentification de base est utilisée sur le serveur et que je veux créer un client peut se connecter à ce serveur à l'aide de certificat fourni, le nom d'utilisateur et le mot de passe (si nécessaire).
Vous devez vous connecter pour publier un commentaire.
TrustSelfSignedStrategy
), pas de nom d'hôte de la vérification (NoopHostnameVerifier
). Le matériel de clé fournie est, pour le client, l'authentification par certificat, mais la question dit que c'est à l'aide de l'authentification HTTP de Base. Dans ce contexte, quelle est chargé à partir du fichier de clés n'est pas destiné à être utilisé à tous.Voici un code qui vous donnera une idée générale.
Vous avez besoin pour créer un personnalisé
ClientHttpRequestFactory
pour approuver le certificat.Il ressemble à ceci:
C'est la mise en œuvre de
MyCustomClientHttpRequestFactory
:Dans ce cas, mon
serverInfo
objet contient l'empreinte du serveur.Vous avez besoin de mettre en œuvre la
TrustManager
interface pour obtenirle
SslThumbprintVerifier
ou de toute autre méthode que vous voulez vérifier votre certificat (vous pouvez aussi décider de également toujours le retourtrue
).La valeur
org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
permet à tous les noms d'hôte.Si vous avez besoin de vérifier le nom de l'hôte,
vous aurez besoin de mettre en œuvre différemment.
Je ne suis pas sûr de l'utilisateur et le mot de passe et comment vous les mettre en place.
Souvent,
vous avez besoin d'ajouter un en-tête de la
restTemplate
nomméAuthorization
avec une valeur qui ressemble à ceci:
Base: <encoded user+password>
.Le
user+password
doit êtreBase64
codé.C'est une solution avec pas obsolète classe ou de la méthode :
(Java 8 approuvé)
NoopHostnameVerifier
est un risque pour la sécurité.Voici ce que je me suis retrouvé avec le même problème. L'idée est la même que dans @Avi réponse, mais je voulais aussi éviter de la statique "du Système.setProperty("https.les protocoles", "TLSv1");", de sorte que les ajustements n'affectent pas le système. Inspiré par une réponse d'ici http://www.coderanch.com/t/637177/Security/Disabling-handshake-message-Java
Un point de moi. J'ai utilisé une mutuelle cert authentification avec spring-boot microservices. Ce qui suit est de travailler pour moi, les points clés sont ici
keyManagerFactory.init(...)
etsslcontext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom())
lignes de code sans eux, au moins pour moi, les choses ne fonctionnent pas. Les certificats sont emballés par PKCS12.trustStore
enkeyStore
, depuis que vous utilisez pour le gestionnaire de clés, pas de la confiance du gestionnaire.