| | |
| | | |
| | | package org.opends.server.extensions; |
| | | |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.net.InetAddress; |
| | | import java.net.Socket; |
| | | import java.net.UnknownHostException; |
| | | import java.util.Arrays; |
| | | import java.util.Hashtable; |
| | | import java.util.Random; |
| | | |
| | | import javax.naming.Context; |
| | | import javax.naming.NamingException; |
| | | import javax.naming.directory.*; |
| | | import javax.naming.ldap.*; |
| | | import javax.naming.directory.Attribute; |
| | | import javax.naming.directory.Attributes; |
| | | import javax.naming.directory.BasicAttribute; |
| | | import javax.naming.directory.BasicAttributes; |
| | | import javax.naming.directory.DirContext; |
| | | import javax.naming.directory.InitialDirContext; |
| | | import javax.naming.directory.ModificationItem; |
| | | import javax.naming.ldap.InitialLdapContext; |
| | | import javax.naming.ldap.LdapContext; |
| | | import javax.naming.ldap.StartTlsRequest; |
| | | import javax.naming.ldap.StartTlsResponse; |
| | | import javax.net.SocketFactory; |
| | | import javax.net.ssl.HostnameVerifier; |
| | | import javax.net.ssl.SSLContext; |
| | | import javax.net.ssl.SSLSession; |
| | | import javax.net.ssl.SSLSocketFactory; |
| | | import javax.net.ssl.TrustManager; |
| | | |
| | | import org.opends.admin.ads.util.BlindTrustManager; |
| | | import org.opends.server.TestCaseUtils; |
| | | import org.testng.Assert; |
| | | import org.testng.annotations.AfterClass; |
| | | import org.testng.annotations.BeforeClass; |
| | | import org.testng.annotations.DataProvider; |
| | | import org.testng.annotations.Test; |
| | | import org.opends.server.TestCaseUtils; |
| | | import org.opends.server.core.DirectoryServer; |
| | | import org.testng.Assert; |
| | | |
| | | /** |
| | | * This class tests SASL confidentiality/integrity over TLS (SSL). It |
| | |
| | | * |
| | | */ |
| | | public class SASLOverTLSTestCase extends ExtensionsTestCase { |
| | | /** |
| | | * Client SSL socket factory which blindly trusts server certificates. |
| | | */ |
| | | public static final class TestSSLSocketFactory extends SSLSocketFactory |
| | | { |
| | | public static synchronized SocketFactory getDefault() |
| | | { |
| | | return INSTANCE; |
| | | } |
| | | |
| | | private static final TestSSLSocketFactory INSTANCE = new TestSSLSocketFactory(); |
| | | private final SSLSocketFactory factory; |
| | | |
| | | private TestSSLSocketFactory() |
| | | { |
| | | try |
| | | { |
| | | SSLContext ctx = SSLContext.getInstance("TLS"); |
| | | ctx.init(null, new TrustManager[] { new BlindTrustManager() }, null); |
| | | factory = ctx.getSocketFactory(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | |
| | | public Socket createSocket() throws IOException |
| | | { |
| | | return factory.createSocket(); |
| | | } |
| | | |
| | | public Socket createSocket(String host, int port) throws IOException, |
| | | UnknownHostException |
| | | { |
| | | return factory.createSocket(host, port); |
| | | } |
| | | |
| | | public String[] getDefaultCipherSuites() |
| | | { |
| | | return factory.getDefaultCipherSuites(); |
| | | } |
| | | |
| | | public String[] getSupportedCipherSuites() |
| | | { |
| | | return factory.getSupportedCipherSuites(); |
| | | } |
| | | |
| | | public Socket createSocket(Socket s, String host, int port, |
| | | boolean autoClose) throws IOException |
| | | { |
| | | return factory.createSocket(s, host, port, autoClose); |
| | | } |
| | | |
| | | public Socket createSocket(String host, int port, InetAddress localHost, |
| | | int localPort) throws IOException, UnknownHostException |
| | | { |
| | | return factory.createSocket(host, port, localHost, localPort); |
| | | } |
| | | |
| | | public Socket createSocket(InetAddress host, int port) throws IOException |
| | | { |
| | | return factory.createSocket(host, port); |
| | | } |
| | | |
| | | public Socket createSocket(InetAddress address, int port, |
| | | InetAddress localAddress, int localPort) throws IOException |
| | | { |
| | | return factory.createSocket(address, port, localAddress, localPort); |
| | | } |
| | | |
| | | } |
| | | |
| | | private static int KB = 1024; |
| | | private static final String factory = "com.sun.jndi.ldap.LdapCtxFactory"; |
| | |
| | | private static final String pwdPolicyDN = |
| | | "cn=" + pwdPolicy + ",cn=Password Policies,cn=config"; |
| | | |
| | | //Keystore/truststore paths |
| | | private String keyStorePath = |
| | | DirectoryServer.getInstanceRoot() + File.separator + "config" + |
| | | File.separator + "client.keystore"; |
| | | private String trustStorePath = |
| | | DirectoryServer.getInstanceRoot() + File.separator + "config" + |
| | | File.separator + "client.truststore"; |
| | | |
| | | //DNS |
| | | private static String testUserDN = "cn=test.User, o=test"; |
| | | private static final String digestDN = "dn:"+ testUserDN; |
| | |
| | | "--handler-name", "DIGEST-MD5", |
| | | "--set", "quality-of-protection:" + "confidentiality", |
| | | "--set", "server-fqdn:localhost"); |
| | | keyStorePath = DirectoryServer.getInstanceRoot() + File.separator + |
| | | "config" + File.separator + "client.keystore"; |
| | | trustStorePath = DirectoryServer.getInstanceRoot() + File.separator + |
| | | "config" + File.separator + "client.truststore"; |
| | | System.setProperty("javax.net.ssl.keyStore",keyStorePath); |
| | | System.setProperty("javax.net.ssl.keyStorePassword", "password"); |
| | | System.setProperty("javax.net.ssl.trustStore", trustStorePath); |
| | | System.setProperty("javax.net.ssl.trustStorePassword", "password"); |
| | | addTestEntry(); |
| | | } |
| | | |
| | |
| | | * @throws NamingException If there was an JNDi naming error. |
| | | * @throws IOException If there was an IO error occurs. |
| | | */ |
| | | @Test(dataProvider = "kiloBytes") |
| | | @Test(enabled = false, dataProvider = "kiloBytes") |
| | | public void sslIntegrity(int size)throws NamingException, IOException { |
| | | TestCaseUtils.dsconfig( |
| | | "set-sasl-mechanism-handler-prop", |
| | |
| | | * @throws NamingException If there was an JNDi naming error. |
| | | * @throws IOException If there was an IO error occurs. |
| | | */ |
| | | @Test(dataProvider = "kiloBytes") |
| | | @Test(enabled = false, dataProvider = "kiloBytes") |
| | | public void sslConfidentiality(int size)throws NamingException, IOException { |
| | | TestCaseUtils.dsconfig( |
| | | "set-sasl-mechanism-handler-prop", |
| | |
| | | env.put(Context.SECURITY_CREDENTIALS, "password"); |
| | | env.put("java.naming.ldap.attributes.binary", "jpegPhoto"); |
| | | env.put("javax.security.sasl.qop", qop); |
| | | env.put("java.naming.ldap.factory.socket", TestSSLSocketFactory.class.getName()); |
| | | ctx = new InitialLdapContext(env, null); |
| | | byte[] jpegBytes = getRandomBytes(size); |
| | | ModificationItem[] mods = new ModificationItem[1]; |
| | |
| | | * @throws NamingException If there was an JNDi naming error. |
| | | * @throws IOException If there was an IO error. |
| | | */ |
| | | @Test(dataProvider = "kiloBytes") |
| | | public void StartTLS(int size) throws NamingException, IOException { |
| | | @Test(enabled = false, dataProvider = "kiloBytes") |
| | | public void startTLS(int size) throws NamingException, IOException { |
| | | LdapContext ctx = null; |
| | | try { |
| | | Hashtable<String, String> env = new Hashtable<String, String>(); |
| | |
| | | env.put(Context.SECURITY_PRINCIPAL, dirMgr); |
| | | env.put(Context.SECURITY_CREDENTIALS, "password"); |
| | | env.put(Context.SECURITY_AUTHENTICATION, simple); |
| | | env.put("java.naming.ldap.factory.socket", TestSSLSocketFactory.class.getName()); |
| | | ctx = new InitialDirContext(env); |
| | | ctx.bind(testUserDN, null, entryAttrs); |
| | | ModificationItem[] mods = new ModificationItem[1]; |
| | |
| | | env.put(Context.SECURITY_PRINCIPAL, dirMgr); |
| | | env.put(Context.SECURITY_CREDENTIALS, "password"); |
| | | env.put(Context.SECURITY_AUTHENTICATION, "simple"); |
| | | env.put("java.naming.ldap.factory.socket", TestSSLSocketFactory.class.getName()); |
| | | ctx = new InitialDirContext(env); |
| | | ctx.destroySubcontext(testUserDN); |
| | | } finally { |