Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
d4fe704
feat(bosh): add uaa.mtls_enabled property and update BOSH job spec
rkoster Jul 3, 2026
f2285e6
erb: skip secret validation for tls_client_auth and private_key_jwt c…
rkoster Jul 3, 2026
5573b91
Bump UAA submodule to feat/rfc8705-mtls-client-auth
rkoster Jul 3, 2026
1c403d9
Bump UAA submodule to fix(review): address PR feedback on mTLS client…
rkoster Jul 6, 2026
05e4a5c
Bump UAA submodule: fix OIDC discovery test failures (5438939)
rkoster Jul 6, 2026
5278a78
bump uaa submodule to 2856a5d (fix JsonProperty collision + full cert…
rkoster Jul 6, 2026
43a1fd4
bump uaa submodule to 864e086 (fix test for @JsonIgnore round-trip)
rkoster Jul 7, 2026
43801d0
bump uaa submodule to 0513c60 (feat: configurable token shape — sub/a…
rkoster Jul 7, 2026
d1269df
bump uaa submodule to 98c09ab (fix: token enhancer sub/aud wins over …
rkoster Jul 7, 2026
271df7f
feat(uaa-release): expose uaa.mtls_enabled as a plain Spring property
rkoster Aug 19, 2026
629839d
chore: update uaa submodule pointer for RFC 8705 trusted-proxy mTLS v…
rkoster Aug 19, 2026
2ff2664
chore: update uaa submodule pointer (TLS 1.3 JSSE PHA workaround)
rkoster Aug 19, 2026
ce878b8
chore: update uaa submodule pointer (fix CertificateRequest CA-list a…
rkoster Aug 19, 2026
bdbe6ce
chore: update uaa submodule pointer (final coherence-review doc fix)
rkoster Aug 19, 2026
062b21f
chore: update uaa submodule (TLS 1.3 mTLS via FIPS BCJSSE)
rkoster Aug 20, 2026
9f7595b
chore: update uaa submodule pointer (trusted-proxy-ca strict path sep…
rkoster Aug 20, 2026
fc99144
chore: update uaa submodule pointer (merge develop, resolve conflicts)
rkoster Aug 21, 2026
023f732
chore: update uaa submodule pointer (tls-client-auth-required-claims)
rkoster Aug 21, 2026
d7c525d
chore: update uaa submodule pointer (XFCC mapper-failure fix)
rkoster Aug 21, 2026
815553a
chore: update uaa submodule pointer (fail-closed claims enhancer + en…
rkoster Aug 21, 2026
87368a1
chore: update uaa submodule pointer (secretless mTLS clients + claim-…
rkoster Aug 21, 2026
9603c6b
chore: update uaa submodule pointer (ReDoS length-bound fix + cnf fai…
rkoster Aug 21, 2026
06315bc
chore: update uaa submodule pointer (proxy leaf constraints + FIPS pr…
rkoster Aug 24, 2026
736766b
chore: update uaa submodule pointer (mtls discovery gating + BCFIPS v…
rkoster Aug 24, 2026
5dec183
chore: update uaa submodule pointer (fix CI regression in discovery-d…
rkoster Aug 24, 2026
4682418
fix(review): remove unimplemented configurable mTLS endpoint path
rkoster Aug 26, 2026
cb46887
fix(review): validate CA-based secretless BOSH clients
rkoster Aug 26, 2026
9623bdb
chore: update uaa submodule pointer (secretless mTLS docs client)
rkoster Aug 26, 2026
973a147
chore: update uaa submodule pointer
rkoster Aug 26, 2026
45781c9
chore: update uaa submodule pointer (mTLS selector and discovery cons…
rkoster Aug 27, 2026
0dc8a51
chore: update uaa submodule pointer (zone mTLS CA normalization)
rkoster Aug 28, 2026
4f44fb6
chore: update uaa submodule pointer (merge develop)
rkoster Aug 28, 2026
db51c29
chore: update uaa submodule pointer (mTLS JWT docs and RDN claims)
rkoster Aug 31, 2026
a84c915
fix(review): omit blank trusted proxy CA
rkoster Aug 31, 2026
4f02483
chore: update uaa submodule pointer
rkoster Sep 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions jobs/uaa/spec
Original file line number Diff line number Diff line change
Expand Up @@ -1304,8 +1304,12 @@ properties:
BTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAL5j1JCN5EoXMOOBSBUL8KeVZFQD3Nfy
YkYKBatFEKdBFlAKLBdG+5KzE7sTYesn7EzBISHXFz3DhdK2tg+IF1DeSFVmFl2n
iVxQ1sYjo4kCugHBsWo+MpFH9VBLFzsMlP3eIDuVKe8aPXFKYCGhctZEJdQTKlja
lshe50nayKrT
-----END CERTIFICATE----
lshe50nayKrT
-----END CERTIFICATE----

uaa.mtls_enabled:
description: "Enable RFC 8705 mTLS client authentication at /oauth/mtls/token. Requires Gorouter forwarded_client_cert: sanitize_set."
default: false
login.saml.providers:
description: |
Contains a hash of SAML Identity Providers,
Expand Down
13 changes: 12 additions & 1 deletion jobs/uaa/templates/config/uaa.yml.erb
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,13 @@
client.each do |key,value|
client_data[key] = value
end
has_mtls_ca = client_data['tls-client-auth-ca'].is_a?(String) &&
!client_data['tls-client-auth-ca'].strip.empty?
client_data.delete('tls-client-auth-trusted-proxy-ca') if
client_data['tls-client-auth-trusted-proxy-ca'].is_a?(String) &&
client_data['tls-client-auth-trusted-proxy-ca'].strip.empty?
message = message + "\nInvalid property: uaa.clients.#{id}.token-endpoint-auth-method" if
client_data.key?('token-endpoint-auth-method')
if !client['scopes'].nil?
client_data.delete('scopes')
if client['scopes'].is_a? Array
Expand All @@ -380,7 +387,10 @@
if is_missing(client_data, 'authorized-grant-types')
message = message + "\nMissing property: uaa.clients.#{id}.authorized-grant-types"
else
message = message + "\nMissing property: uaa.clients.#{id}.secret" if client_data['secret'].nil? && client_data['authorized-grant-types'] != 'implicit'
message = message + "\nMissing property: uaa.clients.#{id}.secret" if
client_data['secret'].nil? &&
client_data['authorized-grant-types'] != 'implicit' &&
!has_mtls_ca
if (client_data['redirect-uri'].nil? || client_data['redirect-uri'].empty?)
message = message + "\nMissing property: uaa.clients.#{id}.redirect-uri" if client_data['authorized-grant-types'] =~ /implicit|authorization_code/
elsif client_data['redirect-uri'].split(',').any? { |uri| !(uri =~ /^http(\*|s)?:\/\/(.*:.*@)?(([a-zA-Z0-9\-\*]+\.)*[a-zA-Z0-9\-]+\.)?[a-zA-Z0-9\-]+(:[0-9]+)?(\/.*|$)/) }
Expand Down Expand Up @@ -653,6 +663,7 @@
'sleep' => p('uaa.shutdown.sleep')
},
'url' => uaa_base,
'mtls-enabled' => p('uaa.mtls_enabled'),
'limitedFunctionality' => {
'statusFile' => p('uaa.limitedFunctionality.statusFile'),
'whitelist' => {
Expand Down
57 changes: 57 additions & 0 deletions spec/uaa-release.erb_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,19 @@ def str_compare(output, actual)
end
end

context 'when mTLS is enabled' do
let(:input) {'spec/input/test-defaults.yml'}
let(:erb_template) {'../jobs/uaa/templates/config/uaa.yml.erb'}

before do
generated_cf_manifest['properties']['uaa']['mtls_enabled'] = true
end

it 'does not render a configurable mtls endpoint block' do
expect(parsed_yaml).not_to have_key('mtls')
end
end

context 'for deprecated-properties-still-work.yml' do
let(:input) {'spec/input/deprecated-properties-still-work.yml'}
let(:output_uaa) {'spec/compare/deprecated-properties-still-work-uaa.yml'}
Expand Down Expand Up @@ -1261,6 +1274,50 @@ def str_compare(output, actual)
end
end

context 'client_credentials mTLS clients' do
let(:erb_template) {'../jobs/uaa/templates/config/uaa.yml.erb'}

before do
client = generated_cf_manifest['properties']['uaa']['clients']['app']
client['authorized-grant-types'] = 'client_credentials'
client.delete('secret')
end

it 'allows a secretless client with a nonblank tls-client-auth-ca' do
generated_cf_manifest['properties']['uaa']['clients']['app']['tls-client-auth-ca'] = "-----BEGIN CERTIFICATE-----\nCA\n-----END CERTIFICATE-----"

expect { parsed_yaml }.not_to raise_error
end

it 'omits a blank tls-client-auth-trusted-proxy-ca' do
generated_cf_manifest['properties']['uaa']['clients']['app']['tls-client-auth-trusted-proxy-ca'] = ' '

expect(parsed_yaml['oauth']['clients']['app']).not_to have_key('tls-client-auth-trusted-proxy-ca')
end

it 'requires a secret when tls-client-auth-ca is absent' do
expect {
parsed_yaml
}.to raise_error(ArgumentError, /Missing property: uaa.clients.app.secret/)
end

it 'requires a secret when tls-client-auth-ca is blank' do
generated_cf_manifest['properties']['uaa']['clients']['app']['tls-client-auth-ca'] = ' '

expect {
parsed_yaml
}.to raise_error(ArgumentError, /Missing property: uaa.clients.app.secret/)
end

it 'does not exempt a client with private-key trust configuration from requiring a secret' do
generated_cf_manifest['properties']['uaa']['clients']['app']['client_jwt_config'] = '{}'

expect {
parsed_yaml
}.to raise_error(ArgumentError, /Missing property: uaa.clients.app.secret/)
end
end

context 'redirect-uri is missing from required grant types' do
let(:erb_template) {'../jobs/uaa/templates/config/uaa.yml.erb'}
grant_types_requiring_secret = ['authorization_code', 'implicit']
Expand Down
2 changes: 1 addition & 1 deletion src/uaa
Submodule uaa updated 308 files