Javamail d'Échec de l'Authentification NTLM
En essayant de se connecter à Exchange server à l'aide de l'authentification NTLM dans JavaMail. Je peux me connecter au SMTP, mais pas d'IMAP. Je peux aussi de s'authentifier via le mac OS X Mail.application application en utilisant l'identique d'hôte/nom d'utilisateur/mot de passe du compte, le type = "IMAP", le Port 143, ssl=false, l'authentification=NTLM, le Nom de Domaine="".
La connexion code:
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Store;
import java.util.Properties;
public class NTLMTest {
public static void main(String[] args) throws Exception {
final String host = "example.com";
final String user = "bob";
final String password = "password";
final Properties properties = new Properties();
Session session = Session.getDefaultInstance(properties);
session.setDebug(true);
//SMTP CONNECT
final Transport transport = session.getTransport("smtp");
transport.connect(host, user, password);
System.out.println("SMTP Connect successful");
//IMAP CONNECT
final Store store = session.getStore("imap");
store.connect(host, user, password);
System.out.println("IMAP Connect Successful");
}
}
La sortie:
DEBUG: setDebug: JavaMail version 1.4.3
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "example.com", port 25, isSSL false
220 server18.example.com ESMTP Sendmail 8.14.3/8.14.3/Debian-5+lenny1; Thu, 2 Dec 2010 18:05:30 +0100; (No UCE/UBE) logging access from: xxx.xxx.xxx.xxx
DEBUG SMTP: connected to host "example.com", port: 25
EHLO 192.168.1.107
250-server18.example.com Hello c-xxxx [xxx.xxx.xxx.xxx], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 20971520
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "SIZE", arg "20971520"
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: Found extension "ETRN", arg ""
DEBUG SMTP: Found extension "AUTH", arg "DIGEST-MD5 CRAM-MD5 LOGIN PLAIN"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "DELIVERBY", arg ""
DEBUG SMTP: Found extension "HELP", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
AUTH LOGIN
334 VXNlcm5hbWU6
YWR2aWVzZW5raWVzMDU=
334 UGFzc3dvcmQ6
ZGlja2hvbmluZw==
235 2.0.0 OK Authenticated
SMTP Connect successful
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]
DEBUG: mail.imap.fetchsize: 16384
DEBUG: mail.imap.statuscachetimeout: 1000
DEBUG: mail.imap.appendbuffersize: -1
DEBUG: mail.imap.minidletime: 10
DEBUG: trying to connect to host "example.com", port 143, isSSL false
* OK server18.example.com Cyrus IMAP4 v2.1.18-IPv6-Debian-2.1.18-5.1 server ready
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE AUTH=DIGEST-MD5 AUTH=NTLM AUTH=CRAM-MD5 ANNOTATEMORE
A0 OK Completed
IMAP DEBUG: AUTH: DIGEST-MD5
IMAP DEBUG: AUTH: NTLM
IMAP DEBUG: AUTH: CRAM-MD5
DEBUG: protocolConnect login, host=example.com, user=bob, password=<non-null>
DEBUG NTLM: type 1 message: Type1Message[suppliedDomain=,suppliedWorkstation=192.168.1.107,flags=0x00000201]
DEBUG NTLM: type 1 message length: 45
A1 AUTHENTICATE NTLM
+
TlRMTVNTUAABAAAAASIAAAAAAAAAAAAADQANACAAAAAxOTIuMTY4LjEuMTA3
+ TlRMTVNTUAACAAAAAAAAADAAAAABIgAApdhJrA6NzmwAAAAAAAAAAAAAAAAAAAAA
TlRMTVNTUAADAAAAGAAYAEAAAAAwADAAWAAAAAAAAAAAAAAAHAAcAIgAAAAaABoApAAAAAAAAAAAAAAAAQIAALV6mIutJKdZSH4IZGmvNqNFxJafzInd0yJDR4J3oe3LyBls0Y75UuwBAQAAAAAAANAS9yNDkssBVbH5v087iUIAAAAAAAAAAGEAZAB2AGkAZQBzAGUAbgBrAGkAZQBzADAANQAxADkAMgAuADEANgA4AC4AMQAuADEAMAA3AA==
A1 NO authentication failure
Exception in thread "main" javax.mail.AuthenticationFailedException: authentication failure
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:613)
at javax.mail.Service.connect(Service.java:291)
at javax.mail.Service.connect(Service.java:172)
at com.prosc.emailplugin.NTLMTest.main(NTLMTest.java:25)
Disconnected from the target VM, address: '127.0.0.1:56125', transport: 'socket'
Process finished with exit code 1
J'ai essayé d'emballage le nom d'utilisateur avec des barres obliques inverses, par http://www.oracle.com/technetwork/java/faq-135477.html#Exchange-login j'obtiens l'erreur suivante:
Exception in thread "main" javax.mail.AuthenticationFailedException: One time use of a plaintext password will enable requested mechanism for user
Barres obliques inverses autour de le nom d'utilisateur SMTP connecter la partie la cause de la panne. Je ne peux pas dire si le "Une fois, utiliser" il s'agit d'un pas dans la bonne direction ou pas.
Si vous pouvez sentir l'e-Mail.application de connexion au Serveur Exchange, vous pouvez voir comment il s'authentifie (bien que vous ne savez pas comment générer les jetons, mais vous pourriez voir si c'est faire quelque chose de différent de JavaMail).
Je n'ai jamais été invité à entrer un nom d'utilisateur NT pour le Courrier.app. J'ai essayé d'utiliser le nom d'utilisateur aussi, mais obtenir la même erreur.
J'ai essayé de départ TCPMonitor à l'écoute sur localhost:9143 et suivre les demandes vers le serveur sur le port 143, mais tout ce que j'obtiens est: * OK server18.example.nl Cyrus IMAP4 v2.1.18-IPv6-Debian-2.1.18-serveur 5.1 prêts existe-il d'autres ports en plus de 143 utilisé?
Il ne faut 143 pour IMAP...
OriginalL'auteur Sam Barnum | 2010-12-02
Vous devez vous connecter pour publier un commentaire.
J'ai remarqué que - via SMTP - l'Authentification NTLM ne fonctionne pas avec une version plus ancienne de javax.mail (1.4.1) mais il fonctionne désormais avec la version 1.4.5.
Et le nom d'utilisateur pour être spécifiée est de la forme "domaine\nom d'utilisateur". Peut-être que même effet (à la différence dans les versions de javax.mail) s'appliquerait également aux IMAP.
OriginalL'auteur FelixJongleur42
De ce que je me souviens à propos de l'authentification NTLM, et votre NTLM les messages de débogage je peux rassembler les éléments suivants:
Je vous suggère d'essayer la suite de la route dans lequel les informations d'identification (u/p) sont prises automatiquement par le JDK à partir du client Windows de la machine.
Probablement pas, dans ce cas nous parlons d'authentification NTLMv2. BTW: je me souviens juste que la solution que nous avons employé à l'époque était à l'aide de Kerberos. La plupart des échanges en charge l'Authentification Kerberos et le protocole prend en charge les informations d'Identification de Délégations, et je pense que ça fonctionne aussi si vous naviguez à partir d'un non-poste windows.
OriginalL'auteur Asaf Mesika
Voici ma solution de travail:
À l'aide de netbeans, créer un nouveau projet java. Mettez ce code là:
Changer le nom d'utilisateur, mots de passe, les ports, et les propriétés de vos paramètres.
Vous aurez besoin d'obtenir le
javamail-1.4.7
et de la charge de lamail.jar
de (http://www.oracle.com/technetwork/java/index-138643.html) dans le projet.Une chose que nous avons fait qui éclairent sur ce que nos paramètres doivent être est de télécharger le client de messagerie Thunderbird qui peut détecter automatiquement les informations sur le serveur exchange pour s'assurer que tous nos paramètres ont été à droite. Si vous ne pouvez pas convaincre thunderbird connecter, puis ce même code ne devrait pas être appelés à travailler.
OriginalL'auteur Eric Leschinski
J'ai eu le même problème d'envoi de mail via l'Échange connecteur SMTP.
Après avoir découvert que javamail ne prend pas en charge NTLMv2 l'authentification, j'ai travaillé sur une solution de contournement qui nécessite bibliothèque JCIFS.
Je downloded l'api javamail code source (https://java.net/projects/javamail/pages/Home) et édité la classe com.soleil.mail.auth.Ntlm pour ajouter le manque de soutien pour l'authentification NTLMv2 à l'aide de la bibliothèque JCIFS de soutien (http://jcifs.samba.org).
La première modification dans le fichier Ntlm.java était dans la méthode init0, et qui consistait en l'ajout de l'indicateur manquant NTLMSSP_NEGOTIATE_NTLM2:
La deuxième modification a consisté à remplacer la méthode generateType3Msg:
Le simpest j'ai trouvé de patch de la bibliothèque est de compiler la classe et de la mise à jour de la bibliothèque de fichier jar:
Pour activer le débogage autant que possible, j'ai utilisé le code suivant dans la méthode main de ma classe de test:
avec cet enregistrement.propriétés:
Avant d'appliquer le patch le test a été bloqué après l'envoi de Type 1 message, car mon serveur Exchange nécessaire d'authentification NTLMv2.
Après le patch, le athentication a été fait avec succès.
Une autre solution est d'envoyer un email via le #de#Exchange webservice## aka EWS en utilisant le ##EWS API Java## publié et maintenue par Microsoft (https://github.com/OfficeDev/ews-java-api), comme dans cet exemple:
}
Mais encore une fois il y a un patch à appliquer à l'intérieur de la classe NTLM de EwsJCIFSNTLMScheme.java pour activer l'authentification NTLMv2 comme indiqué dans la réponse à ce post:
Comment faire pour utiliser l'authentification LDAP pour les Services Web Exchange connexion en Java?
Qui est:
}
J'ai essayé et cela a fonctionné pour moi.
OriginalL'auteur Andrea Luciano
Essayez de définir le domaine "" sur les propriétés de la banque imap :
Depuis SMTP vous connecter à l'aide de la CONNEXION, l'utilisation du nom de domaine n'est pas nécessaire. Mais dans NTLM le domaine est obligatoire.
OriginalL'auteur Jon Ander Ortiz Durántez