Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: add HTTP proxy example

...

Expand
titleHTTP Authentication

Currently it is less than straightforward to configure more typical HTTP credentials such as a basic-auth username and password, due to a lack of abstraction methods in our code to hide some of the gory details of the HttpClient's data model. In particular, some of the methods that need to be called take multiple parameters, which violates the bean convention for a setter. It's possible to invoke more complex methods in Spring, but it takes some extra wiring. We intend to supply some additional code for this in a future release.

Note that some of the older custom schemas such as the metadata configuration schema may support shorthand for supplying username/password credentials, and while these do work, they're deprecated in favor of the more generic httpClientSecurityParameters-ref syntax.

At the moment, it's fairly simple to supply a username and password that gets used unilaterally with a given component's requests. That is, it's not "scoped" to limit its use to a particular server. This implies that you have a working configuration in place to authenticate the server's certificate so that the password isn't sent inadvertently to a malicious location. An example follows (again, building on the server authentication case):

Use of Basic Authentication
Code Block
languagexml
<bean id="CustomHttpSecurity" class="org.opensaml.security.httpclient.HttpClientSecurityParameters">
	<property name="tLSTrustEngine">
		<bean parent="shibboleth.StaticExplicitTrustEngine"
			p:certificates="%{idp.home}/credentials/server.pem" />
	</property>
	<property name="basicCredentials">
		<bean class="org.apache.http.auth.UsernamePasswordCredentials"
			c:_0="webauth" c:_1="%{idp.collector.password}" />
	</property>
</bean>

<!-- Sample feature we're actually trying to use, which we inject custom rules into. -->
<bean id="PushReporter" parent="shibboleth.metrics.HTTPReporter" c:name="MyCollector"
	p:httpClient-ref="CustomHttpClient"
	p:httpClientSecurityParameters-ref="CustomHttpSecurity"
	p:collectorURL="https://log.example.org/cgi-bin/collector.cgi" />

The next level up in complexity is the desirable ability to limit the scope of the credentials for safety's sake. The example relies on the hostname and port of the server to scope the password. There are more advanced ways to build the AuthScope object being passed into the API such as including the Realm challenge from the server.

Basic Authentication with host/port AuthScope
Code Block
languagexml
<bean id="CustomHttpSecurity" class="org.opensaml.security.httpclient.HttpClientSecurityParameters">
	<property name="tLSTrustEngine">
		<bean parent="shibboleth.StaticExplicitTrustEngine"
			p:certificates="%{idp.home}/credentials/server.pem" />
	</property>
</bean>

<bean id="ScopedBasicAuth" class="org.springframework.beans.factory.config.MethodInvokingBean"
		p:targetObject-ref="CustomHttpSecurity"
		p:targetMethod="setBasicCredentialsWithScope">
	<property name="arguments">
		<list>
			<bean class="org.apache.http.auth.UsernamePasswordCredentials"
				c:_0="webauth" c:_1="%{idp.collector.password}" />
			<bean class="org.apache.http.auth.AuthScope"
				c:_0="log.example.org" c:_1="443" />
		</list>
	</property>
</bean>

<!-- Sample feature we're actually trying to use, which we inject custom rules into. -->
<bean id="PushReporter" parent="shibboleth.metrics.HTTPReporter" c:name="MyCollector"
	p:httpClient-ref="CustomHttpClient"
	p:httpClientSecurityParameters-ref="CustomHttpSecurity"
	p:collectorURL="https://log.example.org/cgi-bin/collector.cgi" />

A more advanced example would be to configure multiple sets of credentials for different servers, assuming a component that potentially contacts different servers. Since this is not a common case with any of our components, it's not likely to be needed much.

Expand
titleHTTP Proxy

The HTTPClientBuilder object that is the base for the HTTPClient beans has properties for HTTP proxy settings. For example, the Duo OIDC Nimbus plugin can be configured to use a proxy for its Duo API calls by adding this bean to conf/authn/duo-oidc-authn-config.xml:

Code Block
languagexml
 <bean id="shibboleth.authn.DuoOIDC.nimbus.HttpClient"
        parent="shibboleth.authn.DuoOIDC.nimbus.InternalHttpClient"
           p:connectionProxyHost="proxy.example.org"
           p:connectionProxyPort="3128" />

Reference

Expand
titleProperties

These properties are used in a set of DEPRECATED parent beans that are no longer supported due to a Spring bug that can impact the reloading of service configurations. They remain present for compatibility and for convenience should you choose to use them in your own bean definitions

Name

Type

Default

Description

idp.httpclient.useSecurityEnhancedTLSSocketFactory

Boolean

false

If true, causes the default clients to be injected with a special socket factory that supports advanced TLS features (requires substantial additional configuration)

idp.httpclient.connectionDisregardTLSCertificate              

Boolean

false

If the previous property is false, this allows the default TLS behavior of the client to ignore the TLS server certificate entirely (use with obvious caution, typically only while testing)

idp.httpclient.connectionRequestTimeout

Duration

PT1M

TIme to wait for a connection to be returned from the pool (can be 0 for no imposed value)

idp.httpclient.connectionTimeout

Duration

PT1M

TIme to wait for a connection to be established (can be 0 for no imposed value)

idp.httpclient.socketTimeout

Duration

PT1M

Time to allow between packets on a connection (can be 0 for no imposed value)

idp.httpclient.maxConnectionsTotal

Integer

100

Caps the number of simultaneous connections created by the pooling connection manager

idp.httpclient.maxConnectionsPerRoute

Integer

100

Caps the number of simultaneous connections per route created by the pooling connection manager

idp.httpclient.memorycaching.maxCacheEntries

Integer

50

Size of the in-memory result cache

idp.httpclient.memorycaching.maxCacheEntrySize

Long

1048576 (1MB)

Largest size to allow for an in-memory cache entry

idp.httpclient.filecaching.maxCacheEntries

Integer

100

Size of the on-disk result cache

idp.httpclient.filecaching.maxCacheEntrySize

Long

10485760 (10MB)

Largest sze to allow for an on-disk cache entry

idp.httpclient.filecaching.cacheDirectory

Local directory

Location of on-disk cache

...