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]