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 }