[
https://issues.apache.org/jira/browse/CAMEL-3750?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13020304#comment-13020304
]
David Valeri commented on CAMEL-3750:
-------------------------------------
For number 1)
A) Is there harm in extending AbstractCamelFactoryBean from core-xml? It
appeared to be the pattern being followed by the Spring and Blueprint handlers.
The pattern I see is AbstractCamelFactoryBean (core-xml) ->
AbstractMyTypeFactoryBean (core-xml) -> ConcreteMyTypeFactoryBean (spring OR
blueprint). I think this makes Blueprint support just a matter of implementing
ConcreteMyTypeFactoryBean instances and a handler in the Blueprint module
right? Is there some mistake in my abstract factory beans that is going to
prevent adding Blueprint support down the road?
B) The SSLContextParameters use of ClassResolver was implemented per the
earlier request from Claus. Originally the code was as follows:
{code:java}
try {
is = new FileInputStream(this.resource);
} catch (FileNotFoundException e) {
LOG.debug("Could not open resource as a file, trying as class
path resource.", e);
}
if (is == null) {
is = this.getClass().getResourceAsStream(this.resource);
if (is == null) {
LOG.debug("Could not open resource as a class path resource
using the "
+ this.getClass().getClassLoader()
+ " classloader. Trying as a class path resource
with the TCCL (if set).");
}
}
if (is == null && Thread.currentThread().getContextClassLoader() !=
null) {
is =
Thread.currentThread().getContextClassLoader().getResourceAsStream(this.resource);
if (is == null) {
LOG.debug("Could not open resource as a class path resource
using the TCCL "
+ this.getClass().getClassLoader() + ". Trying
as a URL.");
}
}
if (is == null) {
try {
is = new URL(this.resource).openStream();
} catch (IOException e) {
LOG.debug("Could not open resource as a URL.", e);
}
}
if (is == null) {
throw new IOException("Could not open " + this.resource + " as
a file, class path resource, or URL.");
}
{code}
I didn't look through the ClassResolver implementations before making the
requested change, but after reviewing OsgiClassResolver, it appears that it
does not consult the TCCL. OsgiClassResolver only looks in the bundle that
created the Camel context. I can see a case where the key store resource may
be in another bundle from the one loading the context and accessible only
through the bundle's classpath rather than through the Bundle contents.
Perhaps both ClassResolver and the TCCL should be consulted?
2) The HTTP component's TLS support is a little limited because of how Commons
HTTP 3.x supports TLS configuration. The 3.x branches lookup a
"ProtocolSocketFactory" in a global repository provided by the Protocol class.
I could accept sslContextParametersRef and set it into Protocol in the
component, BUT the second endpoint the user creates using
sslContextParametersRef is going to clobber the ProtocolSocketFactory
configuration from the first endpoint since they both use the same schema name
("https"). Since this repository is global, used both inside and outside of
the Camel component, and I think it would be exceedingly difficult to rework
the component to cleanly support a per endpoint use of sslContextParametersRef,
I opted for the simpler approach as show below.
{code:java}
SSLContextParameters params = new SSLContextParameters();
ProtocolSocketFactory factory =
new SSLContextParametersSecureProtocolSocketFactory(params);
Protocol.registerProtocol("https",
new Protocol(
"https",
factory,
443));
{code}
I suppose it might be possible to generate a schema name for each endpoint
using the sslContextParametersRef parameter and register the
ProtocolSocketFactory under that generated schema name. Then hand the URL off
to Commons HTTP with the generated schema name.
So https://www.google.com?sslContextParametersRef=params1 would result in
something like the following:
{code:java}
ProtocolSocketFactory factory =
new
SSLContextParametersSecureProtocolSocketFactory(params1);
Protocol.registerProtocol("generatedSchemaName1",
new Protocol(
"https",
factory,
443));
{code}
Where Commons HTTP is actually handed the URL:
generatedSchemaName1://www.google.com
I'd have to look at the HTTP component again to see if all of the needed
information to do something like this is accessible or if there would be a fair
bit of refactoring needed to get all of the information in the same spot.
> Provide a common mechanism to facilitate configuration of TLS across Camel
> components
> -------------------------------------------------------------------------------------
>
> Key: CAMEL-3750
> URL: https://issues.apache.org/jira/browse/CAMEL-3750
> Project: Camel
> Issue Type: New Feature
> Components: camel-core, camel-http, camel-jetty
> Reporter: David Valeri
> Assignee: Willem Jiang
> Fix For: Future
>
> Attachments: CAMEL-3750-camel-core-xml.patch,
> CAMEL-3750-camel-core.patch, CAMEL-3750-camel-http.patch,
> CAMEL-3750-camel-http4.patch, CAMEL-3750-camel-itest-osgi.patch,
> CAMEL-3750-camel-jetty.patch, CAMEL-3750-camel-spring.patch
>
>
> CXF provides a nice Spring Namespace handler for configuring TLS options on
> the Jetty transport. Configuring these options using XML in Spring or
> through a simplified set of utility classes decreases the learning curve for
> users by sheltering them from the horrors of JSSE.
> There are a large number of components in Camel that deal with socket
> communication at some level, but they all require users to learn the specific
> low level configuration capabilities of the library on which the component is
> based in order to configure custom TLS options.
> It would be convenient if users didn't need to learn the advanced networking
> configuration options for each component.
> This enhancement suggests a similar Spring Namespace handler and utility
> classes that allow for simplified configuration of an SSLContext as well as
> adding provisions to some of the Camel components in order to accept this new
> configuration mechanism. The initial components to support the new
> configuration mechanism are the http, http4, and Jetty components. Other
> components would follow.
> An example usage is below.
> Programmatic configuration:
> {code}
> KeyStoreParameters ksp = new KeyStoreParameters();
> ksp.setResource(this.getClass().getClassLoader().getResource("jsse/localhost.ks").toString());
> ksp.setPassword(pwd);
> ksp.setContext(context);
>
> KeyManagersParameters kmp = new KeyManagersParameters();
> kmp.setKeyPassword(pwd);
> kmp.setKeyStore(ksp);
> TrustManagersParameters tmp = new TrustManagersParameters();
> tmp.setKeyStore(ksp);
>
> SSLContextParameters sslContextParameters = new SSLContextParameters();
> sslContextParameters.setKeyManagers(kmp);
> sslContextParameters.setTrustManagers(tmp);
> {code}
> XML Configuration:
> {code:XML}
> <SSLContextParameters id="sslContextParameters" secureSocketProtocol="TLS">
> <keyManagers
> keyPassword="password">
> <keyStore resource="./localhost.jks" password="password"/>
> </keyManagers>
> <secureSocketProtocolsFilter>
> <include>TLS.*</include>
> </secureSocketProtocolsFilter>
> </SSLContextParameters>
> {code}
> Usage in a route:
> {code}
> from("jetty:https://localhost:443/hello?sslContextParametersRef=sslContextParameters").process(proc);
> {code}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira