Comment faire pour configurer l'authentification du client avec apache.commons.net.ftps?
J'ai mis en place un client FTPS (FTP sur SSL/TLS) en java à l'aide de la apache.commons.net-cadre.
Il est configuré pour faire de la sécurité explicite sur le port par défaut 21.
ftpsClient = new FTPSClient(false);
ftpsClient.setTrustManager(getConfiguration().getCertificatesManager());
ftpsClient.connect(getConfiguration().getHostName(), getConfiguration().getPort());
Tant que je ne les appliquent pas client d'authentification sur le serveur, tout fonctionne bien.
Mais j'ai besoin d'activer le client d'authentification, donc je l'appliquer sur le serveur et configuré le client-propriétés du système:
-Djavax.net.ssl.keyStore="D:/.../ftps-client-auth.keystore"
-Djavax.net.ssl.keyStorePassword="*****"
-Djavax.net.ssl.keyStoreType=JKS
Ce que j'ai obtenu est le même que si je n'ai pas les propriétés du système:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1806)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:986)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:265)
at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:207)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:172)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:192)
Le serveur-journal dit:
DEBUG: Client "<my ip address>", "SSL_accept failed: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate"
Semble droit - j'ai activé -Djavax.net.debug=tous les, ce qui montre que le serveur envoie une liste de la CNs, il accepte, mais le client envoie un vide de la chaîne de certification.
- Qu'ai-je fait de mal?
- Dois-je faire un peu de configuration par programmation?
- Faire de certificats ou de la clé privée nécessité de soutenir quelque chose de spécial pour SSL/TLS?
un collègue configurer un serveur vsftp avec l'authentification du client. Malheureusement, je ne connais pas les réglages qu'il a utilisé.
Je'lll regarder dans que puis Andy. Merci pour la réponse!
OriginalL'auteur Andy | 2012-11-20
Vous devez vous connecter pour publier un commentaire.
Compris: vous devez définir par programmation un
KeyManager
.Réglage des caractéristiques du système (
-Djavax.net.ssl.keyStore
, ...) n'est pas suffisante, parce que le cadre n'utilise pas de SoleilsSSLSocketFactory
.Exemple:
Vous voudrez peut-être choisir une autre Fiducie-Manager, par exemple, qui est basé sur Java-keystore. Le utils fournir une méthode pour que, trop:
TrustManagerUtils.getDefaultTrustManager(keystore)
getConfiguration ?? où avez-vous trouver?
J'ai mis à jour l'exemple. Jetez un oeil à TrustManagerUtils pour créer une instance.
OriginalL'auteur Andy