001    /*
002     * $HeadURL: http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.11/src/java/org/apache/commons/ssl/SSLEchoServer.java $
003     * $Revision: 138 $
004     * $Date: 2008-03-03 23:50:07 -0800 (Mon, 03 Mar 2008) $
005     *
006     * ====================================================================
007     * Licensed to the Apache Software Foundation (ASF) under one
008     * or more contributor license agreements.  See the NOTICE file
009     * distributed with this work for additional information
010     * regarding copyright ownership.  The ASF licenses this file
011     * to you under the Apache License, Version 2.0 (the
012     * "License"); you may not use this file except in compliance
013     * with the License.  You may obtain a copy of the License at
014     *
015     *   http://www.apache.org/licenses/LICENSE-2.0
016     *
017     * Unless required by applicable law or agreed to in writing,
018     * software distributed under the License is distributed on an
019     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
020     * KIND, either express or implied.  See the License for the
021     * specific language governing permissions and limitations
022     * under the License.
023     * ====================================================================
024     *
025     * This software consists of voluntary contributions made by many
026     * individuals on behalf of the Apache Software Foundation.  For more
027     * information on the Apache Software Foundation, please see
028     * <http://www.apache.org/>.
029     *
030     */
031    
032    package org.apache.commons.ssl;
033    
034    import org.apache.commons.ssl.util.ReadLine;
035    
036    import javax.net.ssl.SSLPeerUnverifiedException;
037    import javax.net.ssl.SSLServerSocket;
038    import javax.net.ssl.SSLSession;
039    import javax.net.ssl.SSLSocket;
040    import java.io.IOException;
041    import java.io.InputStream;
042    import java.io.InterruptedIOException;
043    import java.io.OutputStream;
044    import java.security.cert.Certificate;
045    import java.security.cert.X509Certificate;
046    
047    /**
048     * @author Credit Union Central of British Columbia
049     * @author <a href="http://www.cucbc.com/">www.cucbc.com</a>
050     * @author <a href="mailto:juliusdavies@cucbc.com">juliusdavies@cucbc.com</a>
051     * @since 2-May-2006
052     */
053    public class SSLEchoServer {
054    
055        public static void main(String[] args) throws Exception {
056            int port = 7443;
057            if (args.length >= 1) {
058                port = Integer.parseInt(args[0]);
059            }
060    
061            SSLServer ssl = new SSLServer();
062            ssl.setTrustMaterial(TrustMaterial.TRUST_ALL);
063            ssl.setCheckExpiry(false);
064            ssl.setCheckCRL(false);
065            ssl.setCheckHostname(false);
066            ssl.setWantClientAuth(true);
067            ssl.useDefaultJavaCiphers();
068    
069            SSLServerSocket ss = (SSLServerSocket) ssl.createServerSocket(port, 3);
070            System.out.println("SSL Echo server listening on port: " + port);
071            while (true) {
072                SSLSocket s = (SSLSocket) ss.accept();
073                s.setSoTimeout(30000);
074                EchoRunnable r = new EchoRunnable(s);
075                new Thread(r).start();
076            }
077    
078        }
079    
080        public static class EchoRunnable implements Runnable {
081            private SSLSocket s;
082    
083            public EchoRunnable(SSLSocket s) {
084                this.s = s;
085            }
086    
087            public void run() {
088                InputStream in = null;
089                OutputStream out = null;
090                System.out.println("Socket accepted!");
091                try {
092                    SSLSession session = s.getSession();
093    
094                    try {
095                        Certificate[] certs = JavaImpl.getPeerCertificates(session);
096                        if (certs != null) {
097                            for (int i = 0; i < certs.length; i++) {
098                                // log client cert info
099                                X509Certificate cert = (X509Certificate) certs[i];
100                                String s = "client cert " + i + ":";
101                                s += JavaImpl.getSubjectX500(cert);
102                                System.out.println(s);
103                                System.out.println(Certificates.toString(cert));
104                            }
105                        }
106                    }
107                    catch (SSLPeerUnverifiedException sslpue) {
108                        // oh well, no client cert for us
109                        System.out.println(sslpue);
110                    }
111    
112                    in = s.getInputStream();
113                    out = s.getOutputStream();
114                    ReadLine readLine = new ReadLine(in);
115                    String line = readLine.next();
116                    if (line != null && line.indexOf("HTTP") > 0) {
117                        out.write("HTTP/1.1 200 OK\r\n\r\n".getBytes());
118                        out.flush();
119                    }
120                    while (line != null) {
121                        String echo = "ECHO:>" + line + "\n";
122                        out.write(echo.getBytes());
123                        out.flush();
124                        line = readLine.next();
125                    }
126                }
127                catch (IOException ioe) {
128                    try {
129                        if (out != null) {
130                            out.close();
131                        }
132                        if (in != null) {
133                            in.close();
134                        }
135                        s.close();
136                    }
137                    catch (Exception e) {
138                    }
139    
140                    if (ioe instanceof InterruptedIOException) {
141                        System.out.println("Socket closed after 30 second timeout.");
142                    } else {
143                        ioe.printStackTrace();
144                    }
145    
146                }
147            }
148        }
149    
150    }