Author: jfclere
Date: Thu Jul 19 08:51:50 2007
New Revision: 557664

URL: http://svn.apache.org/viewvc?view=rev&rev=557664
Log:
This Valve is to extra the SSL informations from additional headers
When using Apache httpd as proxy they are added by mod_headers and the 
following directives:
RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
RequestHeader set SSL_CIPHER "%{SSL_CIPHER}s"
RequestHeader set SSL_SESSION_ID "%{SSL_SESSION_ID}s"
RequestHeader set SSL_CIPHER_USEKEYSIZE "%{SSL_CIPHER_USEKEYSIZE}s"

Added:
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/SSLValve.java

Added: tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/SSLValve.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/SSLValve.java?view=auto&rev=557664
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/SSLValve.java (added)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/SSLValve.java Thu Jul 
19 08:51:50 2007
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.valves;
+
+import java.io.IOException;
+import java.io.ByteArrayInputStream;
+
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+
+import javax.servlet.ServletException;
+
+import org.apache.catalina.valves.ValveBase;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+import org.apache.catalina.util.StringManager;
+
+/*
+ * Valve to fill the SSL informations in the request
+ * mod_header is used to fill the headers and the valve
+ * will fill the parameters of the request.
+ * In httpd.conf add the following:
+ * <IfModule ssl_module>
+ *   RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
+ *   RequestHeader set SSL_CIPHER "%{SSL_CIPHER}s"
+ *   RequestHeader set SSL_SESSION_ID "%{SSL_SESSION_ID}s"
+ *   RequestHeader set SSL_CIPHER_USEKEYSIZE "%{SSL_CIPHER_USEKEYSIZE}s"
+ * </IfModule>
+ *
+ * @author Jean-Frederic Clere
+ * @version $Revision: 420067 $, $Date: 2006-07-08 09:16:58 +0200 (sub, 08 srp 
2006) $
+ */
+
+public class SSLValve
+    extends ValveBase {
+/*
+    private static final String info =
+        "SSLValve/1.0";
+    protected static StringManager sm =
+        StringManager.getManager(Constants.Package);
+    public String getInfo() {
+        return (info);
+    }
+    public String toString() {
+        StringBuffer sb = new StringBuffer("SSLValve[");
+                if (container != null)
+            sb.append(container.getName());
+        sb.append("]");
+        return (sb.toString());
+    }
+ */
+    public String mygetHeader(Request request, String header) {
+        String strcert0 = request.getHeader(header);
+        if (strcert0 == null)
+            return null;
+        /* mod_header writes "(null)" when the ssl variable is no filled */
+        if ("(null)".equals(strcert0))
+            return null;
+        return strcert0;
+    } 
+    public void invoke(Request request, Response response)
+        throws IOException, ServletException {
+
+        /* mod_header converts the '\n' into ' ' so we have to rebuild the 
client certificate */
+        String strcert0 = mygetHeader(request, "ssl_client_cert");
+        if (strcert0 != null && strcert0.length()>28) {
+            String strcert1 = strcert0.replace(' ', '\n');
+            String strcert2 = strcert1.substring(28, strcert1.length()-26);
+            String strcert3 = new String("-----BEGIN CERTIFICATE-----\n");
+            String strcert4 = strcert3.concat(strcert2);
+            String strcerts = strcert4.concat("\n-----END CERTIFICATE-----\n");
+            // ByteArrayInputStream bais = new 
ByteArrayInputStream(strcerts.getBytes("UTF-8"));
+            ByteArrayInputStream bais = new 
ByteArrayInputStream(strcerts.getBytes());
+            X509Certificate jsseCerts[] = null;
+            try {
+                CertificateFactory cf = 
CertificateFactory.getInstance("X.509");
+                X509Certificate cert = (X509Certificate) 
cf.generateCertificate(bais);
+                jsseCerts = new X509Certificate[1];
+                jsseCerts[0] = cert;
+            } catch (java.security.cert.CertificateException e) {
+                System.out.println("SSLValve failed " + strcerts);
+                System.out.println("SSLValve failed " + e);
+            }
+            request.setAttribute("javax.servlet.request.X509Certificate", 
jsseCerts);
+        }
+        strcert0 = mygetHeader(request, "ssl_cipher");
+        if (strcert0 != null) {
+            request.setAttribute("javax.servlet.request.cipher_suite", 
strcert0);
+        }
+        strcert0 = mygetHeader(request, "ssl_session_id");
+        if (strcert0 != null) {
+            request.setAttribute("javax.servlet.request.ssl_session", 
strcert0);
+        }
+        strcert0 = mygetHeader(request, "ssl_cipher_usekeysize");
+        if (strcert0 != null) {
+            request.setAttribute("javax.servlet.request.key_size", strcert0);
+        }
+        getNext().invoke(request, response);
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to