Hi, Httpclient, My employer (Credit Union Central of British Columbia) has given me permission to donate some code to Apache. This code comes from my earlier attempt on this list to get HTTPClient to accept self-signed certificates.
Here's the code: http://juliusdavies.ca/commons-ssl/ The way it works looks like this: SSLClient client = new SSLClient(); client.addTrustMaterial( TrustMaterial.CACERTS ); client.addTrustMaterial( new TrustMaterial( "/path/to/cert.pem" ) ); SSLSocket s = (SSLSocket) client.createSocket( "www.cucbc.com", 443 ); I put in a createSocket() that takes a timeout integer value to make your life easier. I've put in a "ping" utility I'm finding very handy. It writes "HEAD / HTTP/1.1" on a socket and then spits out any errors, including certificate chains (in Base64 PEM format). It's the default class in the manifest, so all you need to use it is run: java -jar commons-ssl.jar Here's what it spits out if you don't specify any options: ============================================================== Usage: java -jar commons-ssl.jar [options] Options: (*=required) * -t --target [hostname[:port]] default port=443 -b --bind [hostname[:port]] default port=0 "ANY" -c --client-cert [path to client certificate] *.jks or *.pfx -p --password [client cert password] Example: java -jar commons-ssl.jar -t cucbc.com:443 -c ./client.pfx -p `cat ./pass.txt` ============================================================== Here's what it spits out after a successful run: $ java -jar commons-ssl.jar -t www.cucbc.com Writing: ================================================================================ HEAD / HTTP/1.1 Host: www.cucbc.com Reading: ================================================================================ HTTP/1.1 200 OK Date: Thu, 04 May 2006 00:22:27 GMT Server: Apache/2.0.46 (Red Hat) Accept-Ranges: bytes Connection: close Content-Type: text/html; charset=UTF-8 Server Certificate for: [www.cucbc.com/64.114.5.46:443] ================================================================================ s.0: CN=www.cucbc.com, O=Credit Union Central of British Columbia, L=Vancouver, ST=British Columbia, C=CA i.0: [EMAIL PROTECTED], CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA -----BEGIN CERTIFICATE----- MIIDdjCCAt+gAwIBAgIDIhV6MA0GCSqGSIb3DQEBBAUAMIHOMQswCQYDVQQGEwJa QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xHTAb BgNVBAoTFFRoYXd0ZSBDb25zdWx0aW5nIGNjMSgwJgYDVQQLEx9DZXJ0aWZpY2F0 aW9uIFNlcnZpY2VzIERpdmlzaW9uMSEwHwYDVQQDExhUaGF3dGUgUHJlbWl1bSBT ZXJ2ZXIgQ0ExKDAmBgkqhkiG9w0BCQEWGXByZW1pdW0tc2VydmVyQHRoYXd0ZS5j b20wHhcNMDUxMTEwMTkxMzE3WhcNMDYxMTEwMTkxMzE3WjCBhzELMAkGA1UEBhMC Q0ExGTAXBgNVBAgTEEJyaXRpc2ggQ29sdW1iaWExEjAQBgNVBAcTCVZhbmNvdXZl cjExMC8GA1UEChMoQ3JlZGl0IFVuaW9uIENlbnRyYWwgb2YgQnJpdGlzaCBDb2x1 bWJpYTEWMBQGA1UEAxMNd3d3LmN1Y2JjLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB jQAwgYkCgYEAr6PzKwELErUMueWqE7c+BDw9Cp2zNyivHmLWKpL/82xQCq+VG6Nx OFVpg7rLMMgkbabFD5F8bC63ALaURfxtggWBOCpaHhr78F25rolWPRfpaGtjXeMk Of3t/LeGImdljAqetHft51i6SE1EKxD8du9eTN7wNI7Sj8olgHY2MgkCAwEAAaOB pjCBozAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwQAYDVR0fBDkwNzA1 oDOgMYYvaHR0cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVByZW1pdW1TZXJ2ZXJD QS5jcmwwMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC50 aGF3dGUuY29tMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEEBQADgYEAl0DrUmw2 2+ua2oh1mpxcqOlHAhW3DJvHd2dXYrEYivd0cJ1mFJahfGDfbM2VuFkKgTgKF3Wu /fzH8AERAuYz80WGifvXk3U3CgxOT0Cuv2MzaNMUuNw76iZmNjD9Rfh3flA+HWZj kkpeS0oIu2QDgK1tN3TAfGWMaU9p50r5W9E= -----END CERTIFICATE----- It even prints out the certificates if the SSL handshake fails, so that can be very handy when you've got miscreant client certificates or typos in your truststores! If you would like to read the code, or try playing with it, please check out this URL: http://juliusdavies.ca/commons-ssl/ Unfortunately I haven't included a build script yet, but just going into the "org/apache/commons/ssl" directory and typing "javac *.java" does the trick. There are no dependencies at this time (for now I've stolen Base64.java from commons-codec!). What should I do to try and get a new "commons-ssl" project started? If this code is accepted, I would like to bring HTTPClient's "contrib-ssl" into the HTTPClient 4.0 branch, and depend on "commons-ssl". Sorry if I'm a little breathless. I'm pretty excited. yours, -- Julius Davies Senior Application Developer, Technology Services Credit Union Central of British Columbia http://www.cucbc.com/ Tel: 604-730-6385 Cel: 604-868-7571 Fax: 604-737-5910 1441 Creekside Drive Vancouver, BC Canada V6J 4S7 http://juliusdavies.ca/ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]