Author: gmazza Date: Thu Mar 27 23:18:19 2008 New Revision: 642095 URL: http://svn.apache.org/viewvc?rev=642095&view=rev Log: Reactivating hostname = SSL certificate common name (CN) check for https:// based SOAP client requests. The cxf.xml config property I chose to disable this option is "disableCNCheck". I'm open to other names if anyone can think of something better.
Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParameters.java incubator/cxf/trunk/common/schemas/src/main/resources/schemas/configuration/security.xsd incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/configuration/jsse/spring/TLSClientParametersConfig.java incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/https/HttpsURLConnectionFactory.java Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParameters.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParameters.java?rev=642095&r1=642094&r2=642095&view=diff ============================================================================== --- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParameters.java (original) +++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/configuration/jsse/TLSClientParameters.java Thu Mar 27 23:18:19 2008 @@ -24,5 +24,24 @@ * */ public class TLSClientParameters extends TLSParameterBase { - + private boolean disableCNCheck; + + /** + * Set whether or not JSEE should omit checking if the host name + * specified in the URL matches that of the Common Name + * (CN) on the server's certificate. Default is false; + * this attribute should not be set to true during production use. + */ + public void setDisableCNCheck(boolean disableCNCheck) { + this.disableCNCheck = disableCNCheck; + } + + /** + * Returns whether or not JSSE omits checking if the + * host name specified in the URL matches that of the Common Name + * (CN) on the server's certificate. + */ + public boolean isDisableCNCheck() { + return disableCNCheck; + } } Modified: incubator/cxf/trunk/common/schemas/src/main/resources/schemas/configuration/security.xsd URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/common/schemas/src/main/resources/schemas/configuration/security.xsd?rev=642095&r1=642094&r2=642095&view=diff ============================================================================== --- incubator/cxf/trunk/common/schemas/src/main/resources/schemas/configuration/security.xsd (original) +++ incubator/cxf/trunk/common/schemas/src/main/resources/schemas/configuration/security.xsd Thu Mar 27 23:18:19 2008 @@ -380,6 +380,16 @@ </xs:annotation> </xs:element> </xs:all> + <xs:attribute name="disableCNCheck" type="xs:boolean" default="false"> + <xs:annotation> + <xs:documentation> + This attribute specifies if JSSE should omit checking if the + host name specified in the URL matches that of the Common Name + (CN) on the server's certificate. Default is false; this attribute + should not be set to true during production use. + </xs:documentation> + </xs:annotation> + </xs:attribute> <xs:attribute name="jsseProvider" type="xs:string"> <xs:annotation> <xs:documentation> Modified: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java?rev=642095&r1=642094&r2=642095&view=diff ============================================================================== --- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java (original) +++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java Thu Mar 27 23:18:19 2008 @@ -76,7 +76,7 @@ if (xmlReader == null) { InputStream in = (InputStream)message.getContent(InputStream.class); if (in == null) { - throw new RuntimeException("Can't found input stream in message"); + throw new RuntimeException("Can't find input stream in message"); } xmlReader = StaxUtils.createXMLStreamReader(in); } Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/configuration/jsse/spring/TLSClientParametersConfig.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/configuration/jsse/spring/TLSClientParametersConfig.java?rev=642095&r1=642094&r2=642095&view=diff ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/configuration/jsse/spring/TLSClientParametersConfig.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/configuration/jsse/spring/TLSClientParametersConfig.java Thu Mar 27 23:18:19 2008 @@ -38,6 +38,9 @@ throws GeneralSecurityException, IOException { + if (params.isDisableCNCheck()) { + this.setDisableCNCheck(true); + } if (params.isSetCipherSuitesFilter()) { this.setCipherSuitesFilter(params.getCipherSuitesFilter()); } Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java?rev=642095&r1=642094&r2=642095&view=diff ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java Thu Mar 27 23:18:19 2008 @@ -402,7 +402,8 @@ + "' has been configured for TLS " + "keyManagers " + tlsClientParameters.getKeyManagers() + "trustManagers " + tlsClientParameters.getTrustManagers() - + "secureRandom " + tlsClientParameters.getSecureRandom()); + + "secureRandom " + tlsClientParameters.getSecureRandom() + + "Disable Common Name (CN) Check: " + tlsClientParameters.isDisableCNCheck()); } } else { if (LOG.isLoggable(Level.FINE)) { @@ -1752,7 +1753,18 @@ */ @Override protected void onFirstWrite() throws IOException { - handleHeadersTrustCaching(); + try { + handleHeadersTrustCaching(); + } catch (IOException e) { + if (e.getMessage() != null && e.getMessage().contains("HTTPS hostname wrong:")) { + throw new IOException("The https URL hostname does not match the " + + "Common Name (CN) on the server certificate. To disable this check " + + "(NOT recommended for production) set the CXF client TLS configuration " + + "property \"disableCNCheck\" to true."); + } else { + throw e; + } + } } protected void handleHeadersTrustCaching() throws IOException { Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/https/HttpsURLConnectionFactory.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/https/HttpsURLConnectionFactory.java?rev=642095&r1=642094&r2=642095&view=diff ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/https/HttpsURLConnectionFactory.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/https/HttpsURLConnectionFactory.java Thu Mar 27 23:18:19 2008 @@ -60,7 +60,7 @@ private static final Logger LOG = LogUtils.getL7dLogger(HttpsURLConnectionFactory.class); - private static final HostnameVerifier VERIFIER = new AlwaysTrueHostnameVerifier(); + private static final HostnameVerifier DISABLE_HOSTNAME_VERIFIER = new AlwaysTrueHostnameVerifier(); /* * For development and testing only @@ -105,7 +105,7 @@ } /** - * Create a HttpURLConnection, proxified if neccessary. + * Create a HttpURLConnection, proxified if necessary. * * * @param proxy This parameter is non-null if connection should be proxied. @@ -153,17 +153,12 @@ } /** - * This class is the default hostname verifier that the - * HttpsURLConnection implementation uses to verify that - * a hostname belongs to a particular verified key/certificate - * pair. - * <p> - * The default is to make sure that "CN=<hostname>", which - * isn't always desired. The MessageTrustDecider is - * the point at which an application can place trust in the - * certificate and target URL. We use this default of always - * returning true, delegating the trust decision to the - * MessageTrustDecider. + * This "accept all" hostname verifier is activated when the + * disableCNCheck TLS client configuration parameter is set to + * true (not recommended for production use). The default of + * false makes sure the Common Name (CN) on the server + * certificate equals that of the https:// URL provided by + * the SOAP client. */ private static class AlwaysTrueHostnameVerifier implements HostnameVerifier { @@ -212,7 +207,9 @@ socketFactory = new SSLSocketFactoryWrapper(ctx.getSocketFactory(), cipherSuites); } - connection.setHostnameVerifier(VERIFIER); + if (tlsClientParameters.isDisableCNCheck()) { + connection.setHostnameVerifier(DISABLE_HOSTNAME_VERIFIER); + } connection.setSSLSocketFactory(socketFactory); }