mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-12-22 10:37:59 +01:00
Use ACE representation of XMPP domain on certificate verification
This is based on the patch provided by Georg Lukas, modified to take
XMPP domain names that can not be represented as DNS names into
account. See c42d2eea24 (r269250137)
Fixes SMACK-870.
This commit is contained in:
parent
381190a45c
commit
f60e4055ec
1 changed files with 22 additions and 2 deletions
|
@ -141,6 +141,7 @@ import org.jxmpp.jid.impl.JidCreate;
|
|||
import org.jxmpp.jid.parts.Resourcepart;
|
||||
import org.jxmpp.stringprep.XmppStringprepException;
|
||||
import org.jxmpp.util.XmppStringUtils;
|
||||
import org.minidns.dnsname.DnsName;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
|
@ -861,8 +862,27 @@ public class XMPPTCPConnection extends AbstractXMPPConnection {
|
|||
final HostnameVerifier verifier = getConfiguration().getHostnameVerifier();
|
||||
if (verifier == null) {
|
||||
throw new IllegalStateException("No HostnameVerifier set. Use connectionConfiguration.setHostnameVerifier() to configure.");
|
||||
} else if (!verifier.verify(getXMPPServiceDomain().toString(), sslSocket.getSession())) {
|
||||
throw new CertificateException("Hostname verification of certificate failed. Certificate does not authenticate " + getXMPPServiceDomain());
|
||||
}
|
||||
|
||||
final String verifierHostname;
|
||||
{
|
||||
DnsName xmppServiceDomainDnsName = getConfiguration().getXmppServiceDomainAsDnsNameIfPossible();
|
||||
// Try to convert the XMPP service domain, which potentially includes Unicode characters, into ASCII
|
||||
// Compatible Encoding (ACE) to match RFC3280 dNSname IA5String constraint.
|
||||
// See also: https://bugzilla.mozilla.org/show_bug.cgi?id=280839#c1
|
||||
if (xmppServiceDomainDnsName != null) {
|
||||
verifierHostname = xmppServiceDomainDnsName.ace;
|
||||
}
|
||||
else {
|
||||
LOGGER.log(Level.WARNING, "XMPP service domain name '" + getXMPPServiceDomain()
|
||||
+ "' can not be represented as DNS name. TLS X.509 certificate validiation may fail.");
|
||||
verifierHostname = getXMPPServiceDomain().toString();
|
||||
}
|
||||
}
|
||||
if (!verifier.verify(verifierHostname, sslSocket.getSession())) {
|
||||
throw new CertificateException(
|
||||
"Hostname verification of certificate failed. Certificate does not authenticate "
|
||||
+ getXMPPServiceDomain());
|
||||
}
|
||||
|
||||
// Set that TLS was successful
|
||||
|
|
Loading…
Reference in a new issue