You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ra...@apache.org on 2010/03/19 16:45:17 UTC

svn commit: r925288 - in /qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport: ./ network/security/ network/security/ssl/

Author: rajith
Date: Fri Mar 19 15:45:16 2010
New Revision: 925288

URL: http://svn.apache.org/viewvc?rev=925288&view=rev
Log:
This is related to QPID-2444 and QPID-2445
If SASL EXTERNAL is used the CN and DC components will be extracted from the clients certificate to construct a user ID which will then be set in the out going
messages.
This also contains support for verifying the server when using SSL. The hostname is checked against the server certificates CN.

Modified:
    qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/ClientDelegate.java
    qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayer.java
    qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java
    qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java
    qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java

Modified: qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/ClientDelegate.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/ClientDelegate.java?rev=925288&r1=925287&r2=925288&view=diff
==============================================================================
--- qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/ClientDelegate.java (original)
+++ qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/ClientDelegate.java Fri Mar 19 15:45:16 2010
@@ -181,10 +181,25 @@ public class ClientDelegate extends Conn
     @Override public void connectionOpenOk(Connection conn, ConnectionOpenOk ok)
     {
         SaslClient sc = conn.getSaslClient();
-        if (sc != null && sc.getMechanismName().equals("GSSAPI") && getUserID() != null)
+        if (sc != null)
         {
-            conn.setUserID(getUserID());
+            if (sc.getMechanismName().equals("GSSAPI"))
+            {
+                String id = getKerberosUser();
+                if (id != null)
+                {
+                    conn.setUserID(id);
+                }
+            }
+            else if (sc.getMechanismName().equals("EXTERNAL"))
+            {
+                if (conn.getSecurityLayer() != null)
+                {
+                    conn.setUserID(conn.getSecurityLayer().getUserID());
+                }
+            }
         }
+        
         conn.setState(OPEN);
     }
 
@@ -245,7 +260,7 @@ public class ClientDelegate extends Conn
 
     }
 
-    private String getUserID()
+    private String getKerberosUser()
     {
         log.debug("Obtaining userID from kerberos");
         String service = conSettings.getSaslProtocol() + "@" + conSettings.getSaslServerName();

Modified: qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayer.java?rev=925288&r1=925287&r2=925288&view=diff
==============================================================================
--- qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayer.java (original)
+++ qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayer.java Fri Mar 19 15:45:16 2010
@@ -156,7 +156,7 @@ public class SecurityLayer
         
         public String getUserID()
         {
-            return null;
+            return SSLUtil.retriveIdentity(engine);
         }
         
     }

Modified: qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java?rev=925288&r1=925287&r2=925288&view=diff
==============================================================================
--- qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java (original)
+++ qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLReceiver.java Fri Mar 19 15:45:16 2010
@@ -28,6 +28,7 @@ import javax.net.ssl.SSLException;
 import javax.net.ssl.SSLEngineResult.HandshakeStatus;
 import javax.net.ssl.SSLEngineResult.Status;
 
+import org.apache.qpid.transport.ConnectionSettings;
 import org.apache.qpid.transport.Receiver;
 import org.apache.qpid.transport.TransportException;
 import org.apache.qpid.transport.util.Logger;
@@ -42,7 +43,8 @@ public class SSLReceiver implements Rece
     private ByteBuffer localBuffer;
     private boolean dataCached = false;
     private final Object notificationToken;
-
+    private ConnectionSettings settings;
+    
     private static final Logger log = Logger.get(SSLReceiver.class);
 
     public SSLReceiver(SSLEngine engine, Receiver<ByteBuffer> delegate,SSLSender sender)
@@ -56,6 +58,11 @@ public class SSLReceiver implements Rece
         notificationToken = sender.getNotificationToken();
     }
 
+    public void setConnectionSettings(ConnectionSettings settings)
+    {
+        this.settings = settings;
+    }
+    
     public void closed()
     {
        delegate.closed();
@@ -159,8 +166,13 @@ public class SSLReceiver implements Rece
                         sender.doTasks();
                         handshakeStatus = engine.getHandshakeStatus();
 
-                    case NEED_WRAP:
                     case FINISHED:
+                        if (this.settings != null && this.settings.isVerifyHostname() )
+                        {
+                            SSLUtil.verifyHostname(engine, this.settings.getHost());
+                        }
+                            
+                    case NEED_WRAP:                        
                     case NOT_HANDSHAKING:
                         synchronized(notificationToken)
                         {

Modified: qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java?rev=925288&r1=925287&r2=925288&view=diff
==============================================================================
--- qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java (original)
+++ qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLSender.java Fri Mar 19 15:45:16 2010
@@ -28,6 +28,7 @@ import javax.net.ssl.SSLException;
 import javax.net.ssl.SSLEngineResult.HandshakeStatus;
 import javax.net.ssl.SSLEngineResult.Status;
 
+import org.apache.qpid.transport.ConnectionSettings;
 import org.apache.qpid.transport.Sender;
 import org.apache.qpid.transport.SenderException;
 import org.apache.qpid.transport.util.Logger;
@@ -39,7 +40,8 @@ public class SSLSender implements Sender
     private int sslBufSize;
     private ByteBuffer netData;
     private long timeout = 30000;
-
+    private ConnectionSettings settings;
+    
     private final Object engineState = new Object();
     private final AtomicBoolean closed = new AtomicBoolean(false);
 
@@ -53,6 +55,11 @@ public class SSLSender implements Sender
         netData = ByteBuffer.allocate(sslBufSize);
         timeout = Long.getLong("qpid.ssl_timeout", 60000);
     }
+    
+    public void setConnectionSettings(ConnectionSettings settings)
+    {
+        this.settings = settings;
+    }
 
     public void close()
     {
@@ -225,6 +232,11 @@ public class SSLSender implements Sender
                     break;
 
                 case FINISHED:
+                    if (this.settings != null && this.settings.isVerifyHostname() )
+                    {
+                        SSLUtil.verifyHostname(engine, this.settings.getHost());
+                    }
+                    
                 case NOT_HANDSHAKING:
                     break; //do  nothing
 

Modified: qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java?rev=925288&r1=925287&r2=925288&view=diff
==============================================================================
--- qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java (original)
+++ qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java Fri Mar 19 15:45:16 2010
@@ -38,7 +38,7 @@ public class SSLUtil
               log.debug("Host Name obtained from DN : " + hostname);
           }
           
-          if (hostname != null && hostname.equalsIgnoreCase(hostnameExpected))
+          if (hostname != null && !hostname.equalsIgnoreCase(hostnameExpected))
           {
               throw new TransportException("SSL hostname verification failed." +
                                            " Expected : " + hostnameExpected +
@@ -50,7 +50,7 @@ public class SSLUtil
         {
             log.warn("Exception received while trying to verify hostname",e);
             // For some reason the SSL engine sets the handshake status to FINISH twice
-            // in succession. For some reason the first time the peer certificate 
+            // in succession. The first time the peer certificate 
             // info is not available. The second time it works !
             // Therefore have no choice but to ignore the exception here.
         }



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org