Add Managed Identity v2 KeyGuard mTLS PoP support - #1059
Open
Gladwin Johnson (gladjohn) wants to merge 1 commit into
Open
Add Managed Identity v2 KeyGuard mTLS PoP support#1059Gladwin Johnson (gladjohn) wants to merge 1 commit into
Gladwin Johnson (gladjohn) wants to merge 1 commit into
Conversation
Copilot started reviewing on behalf of
Gladwin Johnson (gladjohn)
August 16, 2026 01:00
View session
Contributor
There was a problem hiding this comment.
Pull request overview
Adds optional Windows KeyGuard-backed Managed Identity v2 mTLS PoP support, including core SDK integration, native CNG/attestation extensions, caching, tests, documentation, and manual validation.
Changes:
- Extends token acquisition, HTTP, result, and cache pipelines for mTLS-bound tokens.
- Adds the Windows CNG/KeyGuard provider and IMDS v2 credential flow.
- Adds unit tests, documentation, Maven modules, and an e2e validation app.
Reviewed changes
Copilot reviewed 61 out of 61 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
run-java-msi-v2-mtls-devapp.ps1 |
Builds and runs manual validation. |
README.md |
Introduces the mTLS extension. |
pom.xml |
Registers extension and e2e modules. |
msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/TokenRequestExecutorTest.java |
Tests mTLS OAuth request construction. |
msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsProviderLoaderTest.java |
Tests missing-provider failure. |
msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsParametersTest.java |
Tests parameters, cache partitioning, and token validation. |
msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsBindingTest.java |
Tests token endpoint validation. |
msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/DefaultHttpClientMtlsTest.java |
Tests redirect prevention. |
msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/AuthenticationResultMtlsTest.java |
Tests binding serialization and equality. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/TokenResponse.java |
Parses OAuth token type. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/TokenRequestExecutor.java |
Sends request-specific mTLS token requests. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/TokenCache.java |
Supports explicit extended cache hashes. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/OAuthHttpRequest.java |
Propagates request socket factories. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/MsalRequest.java |
Stores extended cache-key hashes. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/MsalError.java |
Defines mTLS error codes. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ManagedIdentityResponse.java |
Parses relative expiration values. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ManagedIdentityParameters.java |
Adds mTLS and attestation options. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsRequest.java |
Defines the provider request contract. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsProviderLoader.java |
Discovers optional providers. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsHttpResponse.java |
Defines callback HTTP responses. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsHttpRequest.java |
Defines callback HTTP requests. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ManagedIdentityMtlsBinding.java |
Represents validated binding generations. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/IMtlsCapableHttpClient.java |
Marks mTLS-capable custom clients. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/IMtlsBindingContext.java |
Exposes process-local JSSE bindings. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/IManagedIdentityMtlsProvider.java |
Defines the optional provider SPI. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/IManagedIdentityMtlsHttpClient.java |
Defines the MSAL HTTP callback. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/IAuthenticationResult.java |
Exposes token and binding metadata. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/HttpRequest.java |
Carries request-specific socket factories. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/DefaultHttpClient.java |
Applies mTLS factories and disables redirects. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AuthenticationResult.java |
Stores token type and live bindings. |
msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AcquireTokenByManagedIdentitySupplier.java |
Integrates binding, cache, IMDS, and OAuth flows. |
msal4j-sdk/docs/managed-identity-v2-mtls-pop.md |
Documents architecture and validation. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/Pkcs10BuilderTest.java |
Tests CSR DER generation. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/KeyGuardMtlsBindingContextTest.java |
Tests binding key IDs and contexts. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/KeyGuardManagedIdentityMtlsProviderTest.java |
Tests certificate rotation timing. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/ImdsV2ClientTest.java |
Tests IMDS v2 contracts. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/CngX509ExtendedKeyManagerTest.java |
Tests RSA alias selection. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/CngSignatureParametersTest.java |
Tests PSS parameter validation. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/CngRsaPrivateKeyTest.java |
Tests non-exportability and cleanup. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/CngProviderTest.java |
Tests provider registration and delegation. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/CngKeyGuardTest.java |
Tests stale native-key deletion. |
msal4j-mtls-extensions/src/test/java/com/microsoft/aad/msal4j/mtls/AttestationTokenCacheTest.java |
Tests attestation caching and concurrency. |
msal4j-mtls-extensions/src/main/resources/META-INF/services/com.microsoft.aad.msal4j.IManagedIdentityMtlsProvider |
Registers the KeyGuard provider. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/Pkcs10Builder.java |
Builds PKCS#10 CSRs. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/NCryptLibrary.java |
Defines Windows NCrypt bindings. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/MtlsMsiException.java |
Defines extension failures. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/KeyGuardMtlsBindingContext.java |
Creates JSSE binding contexts. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/KeyGuardManagedIdentityMtlsProvider.java |
Manages binding creation and rotation. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/ImdsV2Client.java |
Implements IMDS v2 requests and parsing. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/CngX509ExtendedKeyManager.java |
Supplies KeyGuard credentials to JSSE. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/CngSignatureSpi.java |
Implements CNG-backed RSA signing. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/CngRsaPrivateKey.java |
Wraps non-exportable CNG keys. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/CngProvider.java |
Registers CNG signature services. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/CngKeyGuard.java |
Implements KeyGuard and attestation interop. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/AttestationTokenCache.java |
Caches fresh attestation JWTs. |
msal4j-mtls-extensions/src/main/java/com/microsoft/aad/msal4j/mtls/AttestationLibrary.java |
Defines attestation DLL bindings. |
msal4j-mtls-extensions/README.md |
Documents extension usage. |
msal4j-mtls-extensions/pom.xml |
Configures the extension artifact. |
msal4j-mtls-extensions-e2e/src/main/java/com/microsoft/aad/msal4j/mtls/e2e/ManagedIdentityMtlsPopKeyVaultDevApp.java |
Implements manual Key Vault validation. |
msal4j-mtls-extensions-e2e/pom.xml |
Builds the shaded validation app. |
.github/copilot-instructions.md |
Documents the new architecture and modules. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Gladwin Johnson (gladjohn)
force-pushed
the
gladjohn/java-msi-v2-mtls-binding-context-local
branch
2 times, most recently
from
August 16, 2026 02:29
a5eec14 to
e2b03ec
Compare
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 30714a3c-b1e6-4578-8223-e07611e44e1d
Gladwin Johnson (gladjohn)
force-pushed
the
gladjohn/java-msi-v2-mtls-binding-context-local
branch
from
August 16, 2026 15:09
e2b03ec to
a0b0785
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds production-shaped Managed Identity v2 mTLS Proof-of-Possession support for Java using Windows VBS KeyGuard and optional Microsoft Azure Attestation.
Java retains native interop only for KeyGuard/CNG signing and attestation. JCA/JSSE owns TLS, and callers receive a reusable
IMtlsBindingContextcontaining the binding certificate and standard JavaSSLContextfor independent downstream HTTP calls.Reviewer entry point:
managed-identity-v2-mtls-pop-review-guide.mdArchitecture
Native signing remains limited to:
Changes
Microsoft.Azure.Security.KeyGuardAttestation1.1.5AttestationClientLib.dllin the optional extension, verifies its SHA-256 before loading, and includes its license and notice.token_type=mtls_popand HTTPS token endpoints.IMtlsCapableHttpClientfor custom transports.Validation
msal4j-sdkandmsal4j-mtls-extensionstest suites pass.mtls_poptoken;SSLContext;cnf.x5t#S256against SHA-256 of the full leaf certificate DER;HttpsURLConnectionand received HTTP 200;Unauthorized;TokenSource.CACHEwith the matching live binding context.Security properties