Author: buildbot
Date: Fri May 12 12:47:44 2017
New Revision: 1012128

Log:
Production update by buildbot for cxf

Modified:
    websites/production/cxf/content/cache/docs.pageCache
    websites/production/cxf/content/docs/jax-rs-jose.html

Modified: websites/production/cxf/content/cache/docs.pageCache
==============================================================================
Binary files - no diff available.

Modified: websites/production/cxf/content/docs/jax-rs-jose.html
==============================================================================
--- websites/production/cxf/content/docs/jax-rs-jose.html (original)
+++ websites/production/cxf/content/docs/jax-rs-jose.html Fri May 12 12:47:44 
2017
@@ -119,11 +119,11 @@ Apache CXF -- JAX-RS JOSE
            <!-- Content -->
            <div class="wiki-content">
 <div id="ConfluenceContent"><p>&#160;</p><p>&#160;</p><p><style 
type="text/css">/*<![CDATA[*/
-div.rbtoc1490280432451 {padding: 0px;}
-div.rbtoc1490280432451 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1490280432451 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1494593227750 {padding: 0px;}
+div.rbtoc1494593227750 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1494593227750 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1490280432451">
+/*]]>*/</style></p><div class="toc-macro rbtoc1494593227750">
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-Introduction">Introduction</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-MavenDependencies">Maven Dependencies</a></li><li><a 
shape="rect" href="#JAX-RSJOSE-JavaandJCEPolicy">Java and JCE 
Policy&#160;</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JOSEOverviewandImplementation">JOSE Overview and 
Implementation</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-JWAAlgorithms">JWA Algorithms</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JWKKeys">JWK Keys</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JWSSignature">JWS Signature</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-SignatureandVerificationProviders">Signature and Verification 
Providers</a></li><li><a shape="rect" href="#JAX-RSJOSE-JWSCompact">JWS 
Compact</a></li><li><a shape="rect" href="#JAX-RSJOSE-JWSJSON">JWS 
JSON</a></li><li><a shape="rect" href="#JAX-RSJOSE-JWSwithDetachedContent">JWS 
with Detached Content</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JWSwithUnencodedPayload">JWS with Unencoded 
Payload</a></li></ul>
@@ -131,13 +131,13 @@ div.rbtoc1490280432451 li {margin-left:
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-KeyandContentEncryptionProviders">Key and Content Encryption 
Providers</a></li><li><a shape="rect" href="#JAX-RSJOSE-JWECompact">JWE 
Compact</a></li><li><a shape="rect" href="#JAX-RSJOSE-JWEJSON">JWE 
JSON</a></li></ul>
 </li><li><a shape="rect" href="#JAX-RSJOSE-JSONWebToken">JSON Web 
Token</a></li><li><a shape="rect" href="#JAX-RSJOSE-JWSandJWECombined">JWS and 
JWE Combined</a></li></ul>
 </li><li><a shape="rect" href="#JAX-RSJOSE-JOSEJAX-RSFilters">JOSE JAX-RS 
Filters</a>
-<ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-JWS">JWS</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JWE">JWE</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-LinkingJWTauthenticationstoJWSorJWEcontent">Linking JWT 
authentications to JWS or JWE content</a></li></ul>
+<ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-JWS">JWS</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-SigningandVerificationofHTTPAttachments">Signing and 
Verification of HTTP Attachments</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-JWE">JWE</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-LinkingJWTauthenticationstoJWSorJWEcontent">Linking JWT 
authentications to JWS or JWE content</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-OptionalprotectionofHTTPheaders">Optional protection of HTTP 
headers</a></li></ul>
 </li><li><a shape="rect" href="#JAX-RSJOSE-Configuration">Configuration</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-ConfigurationPropertyContainers">Configuration Property 
Containers</a>
 <ul class="toc-indentation"><li><a shape="rect" 
href="#JAX-RSJOSE-Signature">Signature</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-Encryption">Encryption</a></li></ul>
 </li><li><a shape="rect" 
href="#JAX-RSJOSE-Configurationthatappliestobothencryptionandsignature">Configuration
 that applies to both encryption and signature</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-Configurationthatappliestosignatureonly">Configuration that 
applies to signature only</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-Configurationthatappliestoencryptiononly">Configuration that 
applies to encryption only</a></li><li><a shape="rect" 
href="#JAX-RSJOSE-ConfigurationthatappliestoJWTtokensonly">Configuration that 
applies to JWT tokens only</a></li></ul>
 </li><li><a shape="rect" 
href="#JAX-RSJOSE-Interoperability">Interoperability</a></li><li><a 
shape="rect" href="#JAX-RSJOSE-Third-PartyLibraries">Third-Party 
Libraries</a></li></ul>
-</div><h1 id="JAX-RSJOSE-Introduction">Introduction</h1><p><a shape="rect" 
class="external-link" href="https://datatracker.ietf.org/wg/jose/documents/"; 
rel="nofollow">JOSE</a>&#160;is a set of high quality specifications that 
specify how data payloads can be signed/validated and/or encrypted/decrypted 
with the cryptographic properties set in the JSON-formatted metadata (headers). 
The data to be secured can be in JSON or other formats (plain text, XML, binary 
data).</p><p><a shape="rect" class="external-link" 
href="https://datatracker.ietf.org/wg/jose/documents/"; 
rel="nofollow">JOSE</a>&#160;is a key piece of advanced OAuth2 and OpenId 
Connect applications but can also be successfully used for securing the regular 
HTTP web service communications.</p><p>CXF 3.0.x, 3.1.x and 3.2.0 provide a 
complete implementation of <a shape="rect" class="external-link" 
href="https://datatracker.ietf.org/wg/jose/documents/"; rel="nofollow">JOSE</a> 
and offer a comprehensive utility and filter support f
 or protecting JAX-RS services and clients with the help of <a shape="rect" 
class="external-link" href="https://datatracker.ietf.org/wg/jose/documents/"; 
rel="nofollow">JOSE</a>.</p><p>CXF <a shape="rect" 
href="http://cxf.apache.org/docs/jax-rs-oauth2.html";>OAuth2</a> and <a 
shape="rect" href="http://cxf.apache.org/docs/jax-rs-oidc.html";>OIDC</a> 
modules are also depending on it.</p><h1 
id="JAX-RSJOSE-MavenDependencies">Maven Dependencies</h1><p>&#160;</p><p>Having 
the following dependency will let developers write JOSE JWS or JWE 
code:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
+</div><h1 id="JAX-RSJOSE-Introduction">Introduction</h1><p><a shape="rect" 
class="external-link" href="https://datatracker.ietf.org/wg/jose/documents/"; 
rel="nofollow">JOSE</a>&#160;is a set of high quality specifications that 
specify how data payloads can be signed/validated and/or encrypted/decrypted 
with the cryptographic properties set in the JSON-formatted metadata (headers). 
The data to be secured can be in JSON or other formats (plain text, XML, binary 
data).</p><p><a shape="rect" class="external-link" 
href="https://datatracker.ietf.org/wg/jose/documents/"; 
rel="nofollow">JOSE</a>&#160;is a key piece of advanced OAuth2 and OpenId 
Connect applications but can also be successfully used for securing the regular 
HTTP web service communications.</p><p>CXF 3.0.x, 3.1.x and 3.2.0 provide a 
complete implementation of <a shape="rect" class="external-link" 
href="https://datatracker.ietf.org/wg/jose/documents/"; rel="nofollow">JOSE</a> 
and offer a comprehensive utility and filter support f
 or protecting JAX-RS services and clients with the help of <a shape="rect" 
class="external-link" href="https://datatracker.ietf.org/wg/jose/documents/"; 
rel="nofollow">JOSE</a>.</p><p>CXF <a shape="rect" 
href="http://cxf.apache.org/docs/jax-rs-oauth2.html";>OAuth2</a> and <a 
shape="rect" href="http://cxf.apache.org/docs/jax-rs-oidc.html";>OIDC</a> 
modules are also depending on it.</p><p><strong>New</strong>: Signature and 
Verification support for multiparts using JWS Detached Content 
mode.</p><p><strong>New</strong>: Optional HTTP Header protection.</p><h1 
id="JAX-RSJOSE-MavenDependencies">Maven Dependencies</h1><p>&#160;</p><p>Having 
the following dependency will let developers write JOSE JWS or JWE 
code:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeContent panelContent pdl">
 <pre class="brush: xml; gutter: false; theme: Default" 
style="font-size:12px;">&lt;dependency&gt;
   &lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
   &lt;artifactId&gt;cxf-rt-rs-security-jose&lt;/artifactId&gt;
@@ -271,13 +271,13 @@ String nextJwsJson = consumer.validateAn
 // use WebClient to post nextJwsJson to the next consumer, with nextJwsJson 
being nearly identical to the original
 // double-signed JWS JSON signature, minus the signature which was already 
validated, in this case nextJwsJson will 
 // only have a single signature </pre>
-</div></div><p>The above code produces a JWS JSON sequence containing two 
signatures, similarly to <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7515#appendix-A.6.4"; rel="nofollow">this 
example</a>. If the sequence contains a single signature only then the JWS JSON 
'signatures' array will contain a single 'signature' element, or the whole 
sequence can be <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7515#appendix-A.6.4"; 
rel="nofollow">flattened</a> instead with the actual 'signatures' array 
dropped. JwsJsonProducer &#160;does not produce the flattened sequence when 
only a single signature is used by default because 3rd party JWS JSON consumers 
may only be able to process the sequences with the 'signatures' array, so pass 
a 'supportFlattened' flag to JwsJsonProducer if needed.&#160;</p><p>Does it 
make sense to use JWS JSON if you do not plan to do multiple signatures ? 
Indeed, if it is only a single signature then using JWS Co
 mpact is a good alternative, likely to be used most often.</p><p>However, even 
if you do a single signature, you may still want to try JWS JSON because is is 
easier to observe the individual JWS JSON structure parts when, example, 
checking the logs or TCP-tracing HTTP requests/responses. This is especially 
true when we start talking about an unencoded payload option, see below.</p><h3 
id="JAX-RSJOSE-JWSwithDetachedContent">JWS with Detached Content</h3><p><a 
shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7515#appendix-F"; rel="nofollow">JWS with a 
Detached Content</a> provides a way to integrity-protect some data without 
actually having these data included in the resulting JWS sequence.</p><p>For 
example, if the producer and consumer can both access the same shared piece of 
data, then the producer can sign these data, post the JWS sequence (without the 
data) to the consumer. The consumer will validate this JWS sequence and assert 
the data have not been modifi
 ed by the time it has received and started validating the sequence. JWS 
Compact and JWS JSON Producer and Consumer provider constructors accept an 
optional 'detached' flag in cases were it is required. &#160; &#160; 
&#160;</p><h3 id="JAX-RSJOSE-JWSwithUnencodedPayload">JWS with Unencoded 
Payload</h3><p>By default, JWS Compact and JWS JSON sequences have the data 
first Base64Url encoded and then inlined in the resulting sequence. This is 
useful especially for JWS Compact which is used in OAuth2/OIDC &#160;flows to 
represent the signed access or id tokens.&#160;</p><p>One concern around the 
data being inlined is that it takes an extra time to Base64Url encode them 
which may become noticeable with large payloads, and another one is that one 
can not see the data while looking at JWS sequences in the logs or trace 
screens.</p><p>Thus a <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7797"; rel="nofollow">JWS with Unencoded 
Payload</a> option (JWS header 'b64' pr
 operty set to false) has been introduced to let users configure JWS Signature 
providers not to encode the actual data payload, see <a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7797#page-7"; 
rel="nofollow">this example</a>.</p><p>Both JWS JSON and JWS Compact support 
'b64' property for the detached and embedded payloads.</p><p>In CXF you can 
apply this option to both JWS Compact (embedded payloads - from CXF 3.1.7) and 
JWS JSON sequences, here is a JWS JSON code fragment:</p><p>&#160;</p><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader 
panelHeader pdl" style="border-bottom-width: 1px;"><b>JWS JSON 
Unencoded</b></div><div class="codeContent panelContent pdl">
+</div></div><p>The above code produces a JWS JSON sequence containing two 
signatures, similarly to <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7515#appendix-A.6.4"; rel="nofollow">this 
example</a>. If the sequence contains a single signature only then the JWS JSON 
'signatures' array will contain a single 'signature' element, or the whole 
sequence can be <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7515#appendix-A.6.4"; 
rel="nofollow">flattened</a> instead with the actual 'signatures' array 
dropped. JwsJsonProducer &#160;does not produce the flattened sequence when 
only a single signature is used by default because 3rd party JWS JSON consumers 
may only be able to process the sequences with the 'signatures' array, so pass 
a 'supportFlattened' flag to JwsJsonProducer if needed.&#160;</p><p>Does it 
make sense to use JWS JSON if you do not plan to do multiple signatures ? 
Indeed, if it is only a single signature then using JWS Co
 mpact is a good alternative, likely to be used most often.</p><p>However, even 
if you do a single signature, you may still want to try JWS JSON because is is 
easier to observe the individual JWS JSON structure parts when, example, 
checking the logs or TCP-tracing HTTP requests/responses. This is especially 
true when we start talking about an unencoded payload option, see below.</p><h3 
id="JAX-RSJOSE-JWSwithDetachedContent">JWS with Detached Content</h3><p><a 
shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7515#appendix-F"; rel="nofollow">JWS with 
Detached Content</a> provides a way to integrity-protect some data without 
actually having these data included in the resulting JWS sequence.</p><p>For 
example, if the producer and consumer can both access the same shared piece of 
data, then the producer can sign these data, post the JWS sequence (without the 
data) to the consumer. The consumer will validate this JWS sequence and assert 
the data have not been modified
  by the time it has received and started validating the sequence. JWS Compact 
and JWS JSON Producer and Consumer provider constructors accept an optional 
'detached' flag in cases were it is required. &#160; &#160; &#160;</p><p>Note 
the detached content mode is used to support the signing and verification of 
CXF multipart attachment parts, see below for more information.</p><h3 
id="JAX-RSJOSE-JWSwithUnencodedPayload">JWS with Unencoded Payload</h3><p>By 
default, JWS Compact and JWS JSON sequences have the data first Base64Url 
encoded and then inlined in the resulting sequence. This is useful especially 
for JWS Compact which is used in OAuth2/OIDC &#160;flows to represent the 
signed access or id tokens.&#160;</p><p>One concern around the data being 
inlined is that it takes an extra time to Base64Url encode them which may 
become noticeable with large payloads, and another one is that one can not see 
the data while looking at JWS sequences in the logs or trace 
screens.</p><p>Thus a <a s
 hape="rect" class="external-link" href="https://tools.ietf.org/html/rfc7797"; 
rel="nofollow">JWS with Unencoded Payload</a> option (JWS header 'b64' property 
set to false) has been introduced to let users configure JWS Signature 
providers not to encode the actual data payload, see <a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7797#page-7"; 
rel="nofollow">this example</a>.</p><p>Both JWS JSON and JWS Compact support 
'b64' property for the detached and embedded payloads.</p><p>In CXF you can 
apply this option to both JWS Compact (embedded payloads - from CXF 3.1.7) and 
JWS JSON sequences, here is a JWS JSON code fragment:</p><p>&#160;</p><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader 
panelHeader pdl" style="border-bottom-width: 1px;"><b>JWS JSON 
Unencoded</b></div><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">JwsJsonProducer producer = new 
JwsJsonProducer(UNSIGNED_PLAIN_JSON_DOCUMENT, true);
 JwsHeaders headers = new JwsHeaders(SignatureAlgorithm.HS256);
 headers.setPayloadEncodingStatus(false);
 producer.signWith(new HmacJwsSignatureProvider(ENCODED_MAC_KEY_1, 
SignatureAlgorithm.HS256),
                   headers);</pre>
-</div></div><p>Note that JWS Compact uses a '.' as a separator between its 3 
parts. <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7797#section-5"; rel="nofollow">JWS with 
Unencoded Payload</a> recommends that it is the application's responsibility to 
deal with the unencoded payloads which may have '.' characters. Similarly, JWS 
JSON unencoded payloads with double quotes will need to be taken care of by the 
application.&#160;</p><h2 id="JAX-RSJOSE-JWEEncryption">JWE 
Encryption</h2><p><a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7516"; rel="nofollow">JWE</a> (JSON Web 
Encryption) document describes how a document content, and, when applicable, a 
content encryption key, can be encrypted. For example, <a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7516#appendix-A.1"; 
rel="nofollow">Appendix A1</a> shows how the content can be encrypted with a 
secret key using AesGcm with the actual content encryption key
  being encrypted using RSA-OAEP.</p><p>CXF ships JWE related classes in <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/tree/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe";
 rel="nofollow">this package</a> and offers a support for all of JWA <a 
shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-4"; rel="nofollow">key 
encryption</a> and <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-5"; rel="nofollow">content 
encryption</a> algorithms.</p><h3 
id="JAX-RSJOSE-KeyandContentEncryptionProviders">Key and Content Encryption 
Providers</h3><p>JWE Encryption process typically involves a content-encryption 
key being generated with this key being subsequently encrypted/wrapped with a 
key known to the consumer. Thus CXF offers the providers for supporting the 
key-encryption algorithms and providers for supporting the content-encryption 
algorithms. Direct key 
 encryption (where the content-encryption key is established out of band) is 
also supported.</p><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/KeyEncryptionProvider.java";
 rel="nofollow">KeyEncryptionProvider</a> supports encrypting a 
content-encryption key, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/KeyDecryptionProvider.java";
 rel="nofollow">KeyDecryptionProvider</a> - decrypting it.</p><p>The following 
table shows the key encryption algorithms and the corresponding providers 
(<span class="pl-smi">org.apache.cxf.rs.security.jose.jwe</span> 
package):</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>Algorithm</strong></td><td colspan="1" rowspan="1" 
class="confluenc
 eTd"><strong>JWE Header 'alg'</strong></td><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>KeyEncryptionProvider</strong></td><td colspan="1" 
rowspan="1" 
class="confluenceTd"><strong>KeyDecryptionProvider</strong></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.2"; 
rel="nofollow">RSAES-PKCS1-v1_5</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">RSA1_5</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>RSAKeyEncryptionAlgorithm</p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p>RSAKeyDecryptionAlgorithm</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.3"; 
rel="nofollow">RSAES OAEP</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">RSA-OAEP, RSA-OAEP-256</p></td><td 
colspan="1" rowspan="1" class="confl
 uenceTd">RSAKeyEncryptionAlgorithm</td><td colspan="1" rowspan="1" 
class="confluenceTd">RSAKeyDecryptionAlgorithm</td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-4.4"; rel="nofollow">AES Key 
Wrap</a></td><td colspan="1" rowspan="1" class="confluenceTd"><p 
class="newpage">A128KW, A192KW, A256KW</p></td><td colspan="1" rowspan="1" 
class="confluenceTd">AesKeyWrapEncryptionAlgorithm</td><td colspan="1" 
rowspan="1" class="confluenceTd">AesKeyWrapDecryptionAlgorithm</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.5"; 
rel="nofollow">Direct</a></td><td colspan="1" rowspan="1" 
class="confluenceTd">dir</td><td colspan="1" rowspan="1" 
class="confluenceTd">DirectKeyEncryptionAlgorithm</td><td colspan="1" 
rowspan="1" class="confluenceTd">DirectKeyDecryptionAlgorithm</td></tr><tr><td 
colspan="1" 
 rowspan="1" class="confluenceTd"><a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#page-15"; rel="nofollow">ECDH-ES Key 
Wrap</a></td><td colspan="1" rowspan="1" class="confluenceTd"><p 
class="newpage">ECDH-ES+A128KW (+A192KW, +256KW)</p></td><td colspan="1" 
rowspan="1" class="confluenceTd">EcdhAesWrapKeyEncryptionAlgorithm</td><td 
colspan="1" rowspan="1" 
class="confluenceTd">EcdhAesWrapKeyDecryptionAlgorithm</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#page-15"; 
rel="nofollow">ECDH-ES Direct</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">ECDH-ES</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><span 
class="pl-en">EcdhDirectKeyJweEncryption</span></td><td colspan="1" rowspan="1" 
class="confluenceTd"><span 
class="pl-en">EcdhDirectKeyJweDecryption</span></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><a shape="r
 ect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-4.7"; rel="nofollow">AES-GCM 
Key Wrap</a></td><td colspan="1" rowspan="1" class="confluenceTd"><p 
class="newpage">A128GCMKW, A192GCMKW, A256GCMKW</p></td><td colspan="1" 
rowspan="1" class="confluenceTd">AesGcmWrapKeyEncryptionAlgorithm</td><td 
colspan="1" rowspan="1" 
class="confluenceTd">AesGcmWrapKeyDecryptionAlgorithm</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.8"; 
rel="nofollow">PBES2</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">PBES2-HS256+A128KW</p><p 
class="newpage">PBES2-HS384+A192KW</p><p 
class="newpage">PBES2-HS512+A256KW</p></td><td colspan="1" rowspan="1" 
class="confluenceTd">PbesHmacAesWrapKeyEncryptionAlgorithm</td><td colspan="1" 
rowspan="1" 
class="confluenceTd">PbesHmacAesWrapKeyDecryptionAlgorithm</td></tr></tbody></table></div><p>&#160;</p><p>RSA-OAEP
 algo
 rithms are likely to be used most often at the moment due to existing JKS 
stores being available everywhere and a relatively easy way of making the 
public validation keys available.</p><p>BouncyCastle is required if you use AES 
Key or AES-GCM Key Wrap or PBES2 key encryption.</p><p><a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/ContentEncryptionProvider.java";
 rel="nofollow">ContentEncryptionProvider</a> supports encrypting a generated 
content-encryption key, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/ContentDecryptionProvider.java";
 rel="nofollow">ContentDecryptionProvider</a> - decrypting it.</p><p>The 
following table shows the content encryption algorithms and the corresponding 
providers:</p><div class="table-wrap"><table class="confluenceT
 able"><tbody><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>Algorithm</strong></td><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>JWE Header 'enc'</strong></td><td colspan="1" 
rowspan="1" 
class="confluenceTd"><strong>ContentEncryptionProvider</strong></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><strong>ContentDecryptionProvider</strong></td></tr><tr><td
 colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-5.2"; 
rel="nofollow">AES_CBC_HMAC_SHA2</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">A128CBC-HS256(-HS384, 
-HS512)</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>AesCbcHmacJweEncryption,</p></td><td colspan="1" 
rowspan="1" 
class="confluenceTd"><p>AesCbcHmacJweDecryption</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-5.3"; rel
 ="nofollow">AES-GCM</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">A128GCM, A92GCM, A256GCM</p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd">AesGcmContentEncryptionAlgorithm</td><td colspan="1" 
rowspan="1" 
class="confluenceTd">AesGcmContentDecryptionAlgorithm</td></tr></tbody></table></div><p>All
 of the above providers can be initialized with the keys loaded from JWK or 
Java JKS stores or from the in-memory representations.</p><p>BouncyCastle is 
required if you use AES_CBC_HMAC content encryption.</p><p>Once you have 
decided which key and content encryption algorithms need to be supported you 
can initialize <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryptionProvider.java";
 rel="nofollow">JwsEncryptionProvider</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jos
 
e-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryptionProvider.java"
 rel="nofollow">JwsDecryptionProvider</a> which do the actual JWE 
encryption/decryption work by coordinating with the key and content encryption 
providers. CXF ships <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryption.java";
 rel="nofollow">JweEncryption</a> (JwsEncryptionProvider) and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryption.java";
 rel="nofollow">JweDecryption</a> (JweDecryptionProvider) helpers, simply pass 
them the preferred key and content encryption providers and have the content 
encrypted or decrypted.</p><p>JweEncryption and JweDecryption help with 
creating and processing JWE Compact sequences (see the next section).&#160; 
 JweEncryption can also help with streaming JWE JSON sequences (see JAX-RS JWE 
filters section).</p><p>Note that <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/AesCbcHmacJweEncryption.java";
 rel="nofollow">AesCbcHmacJweEncryption</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/AesCbcHmacJweDecryption.java";
 rel="nofollow">AesCbcHmacJweDecryption</a> providers supporting <a 
shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-5.2"; 
rel="nofollow">AES_CBC_HMAC_SHA2</a> contet encryption are extending 
JweEncryption and JweDecryption respectively. They implement <a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-5.2.2"; 
rel="nofollow">the content encryption</a> internally but do 
 accept preferred key encryption/decryption providers.</p><p>Similarly, <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/DirectKeyJweEncryption.java";
 rel="nofollow">DirectKeyJweEncryption</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/DirectKeyJweDecryption.java";
 rel="nofollow">DirectKeyJweDecryption</a> are simple&#160;JweEncryption and 
JweDecryption extensions making it straighforward to do the direct key content 
encryption/decryption.</p><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweUtils.java";
 rel="nofollow">JweUtils</a> utility class has a lot of helper methods to load 
key and and content encryption providers 
 and get the data encrypted and decrypted.</p><h3 
id="JAX-RSJOSE-JWECompact">JWE Compact</h3><p><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7516#section-3.3"; 
rel="nofollow">JWE Compact representation</a> is the most often used JWE 
sequence format. It is the concatenation of 5 parts: Base64URL-encoded sequence 
of JWE headers (algorithm and other properties),&#160; Base64URL-encoded 
sequence of JWE encryption key (empty in case of the direct encryption), 
Base64URL-encoded sequence of JWE Initialization vector,&#160;Base64URL-encoded 
sequence of the produced ciphertext (encrypted data) and 
finally&#160;Base64URL-encoded sequence of the authentication tag (integrity 
protection for the headers and the ciphertext itself).</p><p><a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweCompactProducer.java";
 rel="nofollow">JweCompactProducer</a> and 
 <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweCompactConsumer.java";
 rel="nofollow">JweCompactConsumer</a> offer a basic support for creating and 
consuming compact JWE sequences. In most cases you will likely prefer to use <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryption.java";
 rel="nofollow">JweEncryption</a> and <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryption.java";
 rel="nofollow">JweDecryption</a> instead: <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryption.java";
 rel="no
 follow">JweEncryption</a> uses JweCompactProducer internally when its <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryptionProvider.java#L27";
 rel="nofollow">encrypt</a> method is called (<a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryptionProvider.java#L32";
 rel="nofollow">getEncryptedOutput</a> will be discussed in the JAX-RS JWE 
filters section), and <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryption.java";
 rel="nofollow">JweDecryption</a> accepts only JWE Compact and uses 
JweCompactConsumer internally.</p><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/se
 
curity/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweJwtCompactProducer.java"
 rel="nofollow">JweJwtCompactProducer</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsJwtCompactConsumer.java";
 rel="nofollow">JwsJwtCompactConsumer</a> help with directly encrypting typed 
JWT Tokens.</p><p>Here is the example of doing AES Key Wrap and&#160;AES CBC 
HMAC in CXF:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CXF Jwe 
AesWrapAesCbcHMac</b></div><div class="codeContent panelContent pdl">
+</div></div><p>Note that JWS Compact uses a '.' as a separator between its 3 
parts. <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7797#section-5"; rel="nofollow">JWS with 
Unencoded Payload</a> recommends that it is the application's responsibility to 
deal with the unencoded payloads which may have '.' characters. Similarly, JWS 
JSON unencoded payloads with double quotes will need to be taken care of by the 
application.&#160;</p><p>Note the the signing and verification of CXF multipart 
attachment parts does depend on this unencoded payload feature, see below for 
more information.</p><h2 id="JAX-RSJOSE-JWEEncryption">JWE Encryption</h2><p><a 
shape="rect" class="external-link" href="https://tools.ietf.org/html/rfc7516"; 
rel="nofollow">JWE</a> (JSON Web Encryption) document describes how a document 
content, and, when applicable, a content encryption key, can be encrypted. For 
example, <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7
 516#appendix-A.1" rel="nofollow">Appendix A1</a> shows how the content can be 
encrypted with a secret key using AesGcm with the actual content encryption key 
being encrypted using RSA-OAEP.</p><p>CXF ships JWE related classes in <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/tree/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe";
 rel="nofollow">this package</a> and offers a support for all of JWA <a 
shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-4"; rel="nofollow">key 
encryption</a> and <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-5"; rel="nofollow">content 
encryption</a> algorithms.</p><h3 
id="JAX-RSJOSE-KeyandContentEncryptionProviders">Key and Content Encryption 
Providers</h3><p>JWE Encryption process typically involves a content-encryption 
key being generated with this key being subsequently encrypted/wrapped with a 
key known to the con
 sumer. Thus CXF offers the providers for supporting the key-encryption 
algorithms and providers for supporting the content-encryption algorithms. 
Direct key encryption (where the content-encryption key is established out of 
band) is also supported.</p><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/KeyEncryptionProvider.java";
 rel="nofollow">KeyEncryptionProvider</a> supports encrypting a 
content-encryption key, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/KeyDecryptionProvider.java";
 rel="nofollow">KeyDecryptionProvider</a> - decrypting it.</p><p>The following 
table shows the key encryption algorithms and the corresponding providers 
(<span class="pl-smi">org.apache.cxf.rs.security.jose.jwe</span> 
package):</p><div class="table-wrap"><table cl
 ass="confluenceTable"><tbody><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>Algorithm</strong></td><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>JWE Header 'alg'</strong></td><td colspan="1" 
rowspan="1" class="confluenceTd"><strong>KeyEncryptionProvider</strong></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><strong>KeyDecryptionProvider</strong></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.2"; 
rel="nofollow">RSAES-PKCS1-v1_5</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">RSA1_5</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>RSAKeyEncryptionAlgorithm</p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><p>RSAKeyDecryptionAlgorithm</p></td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.3"; 
rel="nofollow">R
 SAES OAEP</a></td><td colspan="1" rowspan="1" class="confluenceTd"><p 
class="newpage">RSA-OAEP, RSA-OAEP-256</p></td><td colspan="1" rowspan="1" 
class="confluenceTd">RSAKeyEncryptionAlgorithm</td><td colspan="1" rowspan="1" 
class="confluenceTd">RSAKeyDecryptionAlgorithm</td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-4.4"; rel="nofollow">AES Key 
Wrap</a></td><td colspan="1" rowspan="1" class="confluenceTd"><p 
class="newpage">A128KW, A192KW, A256KW</p></td><td colspan="1" rowspan="1" 
class="confluenceTd">AesKeyWrapEncryptionAlgorithm</td><td colspan="1" 
rowspan="1" class="confluenceTd">AesKeyWrapDecryptionAlgorithm</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.5"; 
rel="nofollow">Direct</a></td><td colspan="1" rowspan="1" 
class="confluenceTd">dir</td><td colspan="1" rowspan="1" clas
 s="confluenceTd">DirectKeyEncryptionAlgorithm</td><td colspan="1" rowspan="1" 
class="confluenceTd">DirectKeyDecryptionAlgorithm</td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#page-15"; rel="nofollow">ECDH-ES Key 
Wrap</a></td><td colspan="1" rowspan="1" class="confluenceTd"><p 
class="newpage">ECDH-ES+A128KW (+A192KW, +256KW)</p></td><td colspan="1" 
rowspan="1" class="confluenceTd">EcdhAesWrapKeyEncryptionAlgorithm</td><td 
colspan="1" rowspan="1" 
class="confluenceTd">EcdhAesWrapKeyDecryptionAlgorithm</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#page-15"; 
rel="nofollow">ECDH-ES Direct</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">ECDH-ES</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><span 
class="pl-en">EcdhDirectKeyJweEncryption</span></td><td colspan="1" row
 span="1" class="confluenceTd"><span 
class="pl-en">EcdhDirectKeyJweDecryption</span></td></tr><tr><td colspan="1" 
rowspan="1" class="confluenceTd"><a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-4.7"; rel="nofollow">AES-GCM 
Key Wrap</a></td><td colspan="1" rowspan="1" class="confluenceTd"><p 
class="newpage">A128GCMKW, A192GCMKW, A256GCMKW</p></td><td colspan="1" 
rowspan="1" class="confluenceTd">AesGcmWrapKeyEncryptionAlgorithm</td><td 
colspan="1" rowspan="1" 
class="confluenceTd">AesGcmWrapKeyDecryptionAlgorithm</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-4.8"; 
rel="nofollow">PBES2</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">PBES2-HS256+A128KW</p><p 
class="newpage">PBES2-HS384+A192KW</p><p 
class="newpage">PBES2-HS512+A256KW</p></td><td colspan="1" rowspan="1" 
class="confluenceTd">PbesHmacAesWrapKeyEncryptionAlgo
 rithm</td><td colspan="1" rowspan="1" 
class="confluenceTd">PbesHmacAesWrapKeyDecryptionAlgorithm</td></tr></tbody></table></div><p>&#160;</p><p>RSA-OAEP
 algorithms are likely to be used most often at the moment due to existing JKS 
stores being available everywhere and a relatively easy way of making the 
public validation keys available.</p><p>BouncyCastle is required if you use AES 
Key or AES-GCM Key Wrap or PBES2 key encryption.</p><p><a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/ContentEncryptionProvider.java";
 rel="nofollow">ContentEncryptionProvider</a> supports encrypting a generated 
content-encryption key, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/ContentDecryptionProvider.java";
 rel="nofollow">ContentDecryptionProvider</a> - decryptin
 g it.</p><p>The following table shows the content encryption algorithms and 
the corresponding providers:</p><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>Algorithm</strong></td><td colspan="1" rowspan="1" 
class="confluenceTd"><strong>JWE Header 'enc'</strong></td><td colspan="1" 
rowspan="1" 
class="confluenceTd"><strong>ContentEncryptionProvider</strong></td><td 
colspan="1" rowspan="1" 
class="confluenceTd"><strong>ContentDecryptionProvider</strong></td></tr><tr><td
 colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-5.2"; 
rel="nofollow">AES_CBC_HMAC_SHA2</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">A128CBC-HS256(-HS384, 
-HS512)</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>AesCbcHmacJweEncryption,</p></td><td colspan="1" 
rowspan="1" class="confluenceTd"><p>AesCbcHmacJweDecryption</p></
 td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7518#section-5.3"; 
rel="nofollow">AES-GCM</a></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p class="newpage">A128GCM, A92GCM, A256GCM</p></td><td 
colspan="1" rowspan="1" 
class="confluenceTd">AesGcmContentEncryptionAlgorithm</td><td colspan="1" 
rowspan="1" 
class="confluenceTd">AesGcmContentDecryptionAlgorithm</td></tr></tbody></table></div><p>All
 of the above providers can be initialized with the keys loaded from JWK or 
Java JKS stores or from the in-memory representations.</p><p>BouncyCastle is 
required if you use AES_CBC_HMAC content encryption.</p><p>Once you have 
decided which key and content encryption algorithms need to be supported you 
can initialize <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryptionProvide
 r.java" rel="nofollow">JwsEncryptionProvider</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryptionProvider.java";
 rel="nofollow">JwsDecryptionProvider</a> which do the actual JWE 
encryption/decryption work by coordinating with the key and content encryption 
providers. CXF ships <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryption.java";
 rel="nofollow">JweEncryption</a> (JwsEncryptionProvider) and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryption.java";
 rel="nofollow">JweDecryption</a> (JweDecryptionProvider) helpers, simply pass 
them the preferred key and content encryption providers and have the
  content encrypted or decrypted.</p><p>JweEncryption and JweDecryption help 
with creating and processing JWE Compact sequences (see the next 
section).&#160; JweEncryption can also help with streaming JWE JSON sequences 
(see JAX-RS JWE filters section).</p><p>Note that <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/AesCbcHmacJweEncryption.java";
 rel="nofollow">AesCbcHmacJweEncryption</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/AesCbcHmacJweDecryption.java";
 rel="nofollow">AesCbcHmacJweDecryption</a> providers supporting <a 
shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-5.2"; 
rel="nofollow">AES_CBC_HMAC_SHA2</a> contet encryption are extending 
JweEncryption and JweDecryption respectively. They implemen
 t <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7518#section-5.2.2"; rel="nofollow">the 
content encryption</a> internally but do accept preferred key 
encryption/decryption providers.</p><p>Similarly, <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/DirectKeyJweEncryption.java";
 rel="nofollow">DirectKeyJweEncryption</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/DirectKeyJweDecryption.java";
 rel="nofollow">DirectKeyJweDecryption</a> are simple&#160;JweEncryption and 
JweDecryption extensions making it straighforward to do the direct key content 
encryption/decryption.</p><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cx
 f/rs/security/jose/jwe/JweUtils.java" rel="nofollow">JweUtils</a> utility 
class has a lot of helper methods to load key and and content encryption 
providers and get the data encrypted and decrypted.</p><h3 
id="JAX-RSJOSE-JWECompact">JWE Compact</h3><p><a shape="rect" 
class="external-link" href="https://tools.ietf.org/html/rfc7516#section-3.3"; 
rel="nofollow">JWE Compact representation</a> is the most often used JWE 
sequence format. It is the concatenation of 5 parts: Base64URL-encoded sequence 
of JWE headers (algorithm and other properties),&#160; Base64URL-encoded 
sequence of JWE encryption key (empty in case of the direct encryption), 
Base64URL-encoded sequence of JWE Initialization vector,&#160;Base64URL-encoded 
sequence of the produced ciphertext (encrypted data) and 
finally&#160;Base64URL-encoded sequence of the authentication tag (integrity 
protection for the headers and the ciphertext itself).</p><p><a shape="rect" 
class="external-link" href="https://github.com/apache/cxf/blob
 
/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweCompactProducer.java"
 rel="nofollow">JweCompactProducer</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweCompactConsumer.java";
 rel="nofollow">JweCompactConsumer</a> offer a basic support for creating and 
consuming compact JWE sequences. In most cases you will likely prefer to use <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryption.java";
 rel="nofollow">JweEncryption</a> and <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryption.java";
 rel="nofollow">JweDecryption</a> instead: <a shape="rect" 
class="external-link" 
 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryption.java";
 rel="nofollow">JweEncryption</a> uses JweCompactProducer internally when its 
<a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryptionProvider.java#L27";
 rel="nofollow">encrypt</a> method is called (<a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweEncryptionProvider.java#L32";
 rel="nofollow">getEncryptedOutput</a> will be discussed in the JAX-RS JWE 
filters section), and <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweDecryption.java";
 rel="nofollow">JweDecryption</a> accepts 
 only JWE Compact and uses JweCompactConsumer internally.</p><p><a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jwe/JweJwtCompactProducer.java";
 rel="nofollow">JweJwtCompactProducer</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsJwtCompactConsumer.java";
 rel="nofollow">JwsJwtCompactConsumer</a> help with directly encrypting typed 
JWT Tokens.</p><p>Here is the example of doing AES Key Wrap and&#160;AES CBC 
HMAC in CXF:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CXF Jwe 
AesWrapAesCbcHMac</b></div><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">final String specPlainText = "Live long and prosper.";
         
 AesWrapKeyEncryptionAlgorithm keyEncryption = new 
AesWrapKeyEncryptionAlgorithm(KEY_ENCRYPTION_KEY_A3, KeyAlgorithm.A128KW);
@@ -492,7 +492,111 @@ Payload:
       }
    ]
 }</pre>
-</div></div><p>The client code and server configuration is nearly identical to 
a code/configuration needed to set up JWS Compact filters as shown above, 
simply replace JwsWriterInterceptor/JwsClientResponseFilter with 
JwsJsonWriterInterceptor/JwsJsonClientResponseFilter in the client code, and 
JwsContainerRequestFilter/JwsContainerResponseFilter with 
JwsJsonContainerRequestFilter/JwsJsonContainerResponseFilter</p><h2 
id="JAX-RSJOSE-JWE">JWE</h2><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JweWriterInterceptor.java";
 rel="nofollow">JweWriterInterceptor</a> creates Compact JWE sequences on the 
client or server out directions. For example, if you have the client code 
posting a Book or the server code returning a Book, with this Book 
representation expected to be encrypted, then add&#160;<a shape="rect" 
class="external-link" href="https://github.com/apache
 
/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JweWriterInterceptor.java"
 rel="nofollow">JweWriterInterceptor</a> and set the encryption properties on 
the JAX-RS client or server.</p><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JweClientResponseFilter.java";
 rel="nofollow">JweClientResponseFilter</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JweContainerRequestFilter.java";
 rel="nofollow">JweContainerRequestFilter</a> process the incoming client or 
server Compact JWE sequences.</p><p>Here is an example of a plain text "book" 
being encrypted with the A128KW key and A128GCM content encryption (see JWE 
section above), converted into Compact JWE and POSTed to the
  target service:</p><div class="preformatted panel" style="border-width: 
1px;"><div class="preformattedContent panelContent">
+</div></div><p>The client code and server configuration is nearly identical to 
a code/configuration needed to set up JWS Compact filters as shown above, 
simply replace JwsWriterInterceptor/JwsClientResponseFilter with 
JwsJsonWriterInterceptor/JwsJsonClientResponseFilter in the client code, and 
JwsContainerRequestFilter/JwsContainerResponseFilter with 
JwsJsonContainerRequestFilter/JwsJsonContainerResponseFilter</p><h2 
id="JAX-RSJOSE-SigningandVerificationofHTTPAttachments">Signing and 
Verification of HTTP Attachments</h2><p>The signing and verification of HTTP 
request and response attachments is supported starting from CXF 
3.1.12.</p><p>This feature does not buffer the request and response attachment 
data and is completely streaming-'friendly'.</p><p>It depends on&#160;<a 
shape="rect" class="external-link" 
href="https://tools.ietf.org/html/rfc7515#appendix-F"; rel="nofollow">JWS with 
Detached Content</a> and&#160; <a shape="rect" class="external-link" 
href="https://tools.ietf.org/html
 /rfc7797" rel="nofollow">JWS with Unencoded Payload</a> options as well as on 
the newly introduced CXF <a shape="rect" 
href="http://cxf.apache.org/docs/jax-rs-multiparts.html#JAX-RSMultiparts-MultipartFilters";>multipart
 filters</a> and works as follows.</p><p>When request or response attachment 
parts are about to be submitted to the Multipart serialization provider, JWS 
Multipart Output Filter initializes a <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsSignature.java";
 rel="nofollow">JWSSignature</a> object. Next every parts's output stream is 
replaced with the filtering output stream which updates the signature object on 
every write operation. Finally this multipart filter adds one more attachment 
part to the list of the attachments to be written - this part holds a reference 
to JWS Signature. When this last part is written, JWSSignature produces the 
signature
  bytes which are encoded using either JWS Compact or JWS JSON format, with the 
detached and unencoded content already being pushed to the output 
stream.</p><p>When the attachment parts are about to be read by the Multipart 
deserialization provider, their signature carried over in the last part will 
need to be verified. Just before the parts are about to be read in order to be 
made available to the application code, JWS Multipart Input Filter checks the 
last part and initializes a <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/jws/JwsVerificationSignature.java";
 rel="nofollow">JWSVerificationSignature</a> object. Next for every attachment 
but the last one it replaces the input stream with the filtering input stream 
which updates the signature verification object on every read operation. Once 
all the data have been read it compares the calculated signature with the recei
 ved signature.</p><p>Note all of the multipart attachments parts can be 
secured this way but by default, unless filters set a 'supportSinglePartOnly' 
property to 'false', the attachments with more than one data part will be 
rejected. This is done to avoid some possible security side-effects when the 
receiving side starts processing the parts as soon as they become available, 
before all of the multipart payload has been read.</p><p>Here is the example 
showing how a Book object (represented as an XML attachment on the wire) can be 
secured.</p><p>Given this client code:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">@Test
+public void testJwsJwkBookHMacMultipart() throws Exception {
+    String address = "https://localhost:"; + PORT + "/jwsjwkhmacSinglePart";
+    BookStore bs = createJwsBookStoreHMac(address, true, false);
+    Book book = bs.echoBookMultipart(new Book("book", 123L));
+    assertEquals("book", book.getName());
+    assertEquals(123L, book.getId());
+}
+private BookStore createJwsBookStoreHMac(String address, 
+                                         boolean supportSinglePart,
+                                         boolean useJwsJsonSignatureFormat) 
throws Exception {
+     JAXRSClientFactoryBean bean = createJAXRSClientFactoryBean(address, 
supportSinglePart, 
+                                                                   
useJwsJsonSignatureFormat);
+     bean.getProperties(true).put("rs.security.signature.properties",
+         "org/apache/cxf/systest/jaxrs/security/secret.jwk.properties");
+
+     bean.setServiceClass(BookStore.class);
+     bean.setAddress(address);
+     List&lt;Object&gt; providers = new LinkedList&lt;Object&gt;();
+     JwsMultipartClientRequestFilter outFilter = new 
JwsMultipartClientRequestFilter();
+     outFilter.setSupportSinglePartOnly(supportSinglePart);
+     outFilter.setUseJwsJsonSignatureFormat(useJwsJsonSignatureFormat);
+     providers.add(outFilter);
+     JwsMultipartClientResponseFilter inFilter = new 
JwsMultipartClientResponseFilter();
+     inFilter.setSupportSinglePartOnly(supportSinglePart);
+     providers.add(inFilter);
+     providers.add(new JwsDetachedSignatureProvider());
+     bean.setProviders(providers);
+     return bean.create(BookStore.class);
+}</pre>
+</div></div><p>and the relevant server code:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">@Path("/bookstore")
+public class BookStore {
+    
+    @POST
+    @Path("/books")
+    @Produces("multipart/related")
+    @Consumes("multipart/related")
+    @Multipart(type = "application/xml")
+    public Book echoBookMultipart(@Multipart(type = "application/xml") Book 
book) {
+        return book;
+    }
+}</pre>
+</div></div><p>and server configuration:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" 
style="font-size:12px;">&lt;beans 
xmlns="http://www.springframework.org/schema/beans"; 
xmlns:jaxrs="http://cxf.apache.org/jaxrs"&gt;
+    &lt;bean id="serviceBean" 
class="org.apache.cxf.systest.jaxrs.security.jose.BookStore"/&gt;
+    &lt;bean id="jwsInMultipartFilter" 
class="org.apache.cxf.rs.security.jose.jaxrs.multipart.JwsMultipartContainerRequestFilter"/&gt;
+    &lt;bean id="jwsOutMultipartFilter" 
class="org.apache.cxf.rs.security.jose.jaxrs.multipart.JwsMultipartContainerResponseFilter"/&gt;
+    &lt;bean id="jwsDetachedSignatureWriter" 
class="org.apache.cxf.rs.security.jose.jaxrs.JwsDetachedSignatureProvider"/&gt;
+    &lt;jaxrs:server 
address="https://localhost:${testutil.ports.jaxrs-jws-multipart}/jwsjwkhmacSinglePart"&gt;
+        &lt;jaxrs:serviceBeans&gt;
+            &lt;ref bean="serviceBean"/&gt;
+        &lt;/jaxrs:serviceBeans&gt;
+        &lt;jaxrs:providers&gt;
+            &lt;ref bean="jwsInMultipartFilter"/&gt;
+            &lt;ref bean="jwsOutMultipartFilter"/&gt;
+            &lt;ref bean="jwsDetachedSignatureWriter"/&gt;
+        &lt;/jaxrs:providers&gt;
+        &lt;jaxrs:properties&gt;
+            &lt;entry key="rs.security.signature.properties" 
value="org/apache/cxf/systest/jaxrs/security/secret.jwk.properties"/&gt;
+        &lt;/jaxrs:properties&gt;
+    &lt;/jaxrs:server&gt;
+&lt;/beans</pre>
+</div></div><p>the following request is produced on the wire:</p><div 
class="preformatted panel" style="border-width: 1px;"><div 
class="preformattedContent panelContent">
+<pre>ID: 1
+Address: https://localhost:9001/jwsjwkhmacSinglePart/bookstore/books
+Http-Method: POST
+Content-Type: multipart/related; type="application/xml"; 
boundary="uuid:35b4dd32-470d-4f27-b3c2-2c194f924770"; 
start="&lt;root.mess...@cxf.apache.org&gt;"
+Headers: {Accept=[multipart/related], Connection=[Keep-Alive]}
+Payload: 
+--uuid:35b4dd32-470d-4f27-b3c2-2c194f924770
+Content-Type: application/xml
+Content-Transfer-Encoding: binary
+Content-ID: &lt;root.mess...@cxf.apache.org&gt;
+
+&lt;?xml version="1.0" encoding="UTF-8" 
standalone="yes"?&gt;&lt;Book&gt;&lt;id&gt;123&lt;/id&gt;&lt;name&gt;book&lt;/name&gt;&lt;/Book&gt;
+--uuid:35b4dd32-470d-4f27-b3c2-2c194f924770
+Content-Type: application/jose
+Content-Transfer-Encoding: binary
+Content-ID: &lt;signature&gt;
+
+eyJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdLCJhbGciOiJIUzI1NiJ9..LWMjPoronjdGmJFAAIuCc_qh9sI2i5Jc2onBd-fHdMM
+--uuid:35b4dd32-470d-4f27-b3c2-2c194f924770--</pre>
+</div></div><p>with the response being formated identically.</p><p>Enabling a 
JWS JSON format will produce a flattened JWS JSON signature in the last 
part:</p><div class="preformatted panel" style="border-width: 1px;"><div 
class="preformattedContent panelContent">
+<pre>ID: 1
+Address: https://localhost:9001/jwsjwkhmacSinglePartJwsJson/bookstore/books
+Http-Method: POST
+Content-Type: multipart/related; type="application/xml"; 
boundary="uuid:75b37fab-1745-45b7-93ac-15aa9add9b25"; 
start="&lt;root.mess...@cxf.apache.org&gt;"
+Headers: {Accept=[multipart/related], Connection=[Keep-Alive]}
+Payload: 
+--uuid:75b37fab-1745-45b7-93ac-15aa9add9b25
+Content-Type: application/xml
+Content-Transfer-Encoding: binary
+Content-ID: &lt;root.mess...@cxf.apache.org&gt;
+
+&lt;?xml version="1.0" encoding="UTF-8" 
standalone="yes"?&gt;&lt;Book&gt;&lt;id&gt;123&lt;/id&gt;&lt;name&gt;book&lt;/name&gt;&lt;/Book&gt;
+--uuid:75b37fab-1745-45b7-93ac-15aa9add9b25
+Content-Type: application/jose
+Content-Transfer-Encoding: binary
+Content-ID: &lt;signature&gt;
+
+{"protected":"eyJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdLCJhbGciOiJIUzI1NiJ9","signature":"LWMjPoronjdGmJFAAIuCc_qh9sI2i5Jc2onBd-fHdMM"}
+--uuid:75b37fab-1745-45b7-93ac-15aa9add9b25--</pre>
+</div></div><h2 id="JAX-RSJOSE-JWE">JWE</h2><p><a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JweWriterInterceptor.java";
 rel="nofollow">JweWriterInterceptor</a> creates Compact JWE sequences on the 
client or server out directions. For example, if you have the client code 
posting a Book or the server code returning a Book, with this Book 
representation expected to be encrypted, then add&#160;<a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JweWriterInterceptor.java";
 rel="nofollow">JweWriterInterceptor</a> and set the encryption properties on 
the JAX-RS client or server.</p><p><a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/sec
 urity/jose/jaxrs/JweClientResponseFilter.java" 
rel="nofollow">JweClientResponseFilter</a> and <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JweContainerRequestFilter.java";
 rel="nofollow">JweContainerRequestFilter</a> process the incoming client or 
server Compact JWE sequences.</p><p>Here is an example of a plain text "book" 
being encrypted with the A128KW key and A128GCM content encryption (see JWE 
section above), converted into Compact JWE and POSTed to the target 
service:</p><div class="preformatted panel" style="border-width: 1px;"><div 
class="preformattedContent panelContent">
 <pre>Address: https://localhost:9001/jwejwkaeswrap/bookstore/books
 Http-Method: POST
 Content-Type: application/jose
@@ -544,7 +648,7 @@ Payload:
    "ciphertext":"alKm_g",
    "tag":"DkW2pZCd7lhR0KqIGQ69-A"
 }</pre>
-</div></div><p>Note the Base64Url encoded protected headers go first, followed 
by the 'recipients' array, with each element containing the encrypted content 
encryption key which can be decrypted by the recipient private key, with the 
array of recipients followed by the IV, ciphertext and authentication tag 
Base64Url sequences.</p><h2 
id="JAX-RSJOSE-LinkingJWTauthenticationstoJWSorJWEcontent">Linking JWT 
authentications to JWS or JWE content</h2><p>CXF introduced a "JWT" HTTP 
authentication scheme, with a Base64Url encoded JWT token representing a user 
authentication against an IDP capable of issuing JWT assertions (or simply JWT 
tokens). JWT assertion is like SAML assertion except that it is in a JSON 
format. If you'd like to cryptographically bind this JWT token to a data 
secured by JWS and/or JWE processors then simply add <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/secu
 rity/jose/jaxrs/JwtAuthenticationClientFilter.java" 
rel="nofollow">JwtAuthenticationClientFilter</a>on the client side and <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JwtAuthenticationFilter.java";
 rel="nofollow">JwtAuthenticationFilter</a> on the server side. These filters 
link the authentication token with a randomly generated secure value which is 
added to both the token and the body JWS/JWE protected headers.</p><p>This 
approach is more effective compared to the ones where the body hash is 
calculated before it is submitted to a signature creation function, with the 
signature added as HTTP header.</p><p>&#160;</p><p>&#160;</p><h1 
id="JAX-RSJOSE-Configuration">Configuration</h1><p>CXF JOSE configuration 
provides for loading JWS and JWE keys and supporting various processing 
options. Configuration properties can be shared between JWS and JWE processors 
 or in/out only JWS and or JWE properties can be set.</p><p>Typically a secure 
JAX-RS endpoint or client is initialized with JWS and or JWE 
properties.</p><p>For example, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L197";
 rel="nofollow">this endpoint</a> is configured with a <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L207";
 rel="nofollow">single JWS properties file</a> which will apply to both input 
(signature verification) and output (signature creation) JWS operations. <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L210";
 rel="nofollow">This endpoint</a> depends on 
 <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L218";
 rel="nofollow">two JWS properties files</a>, one - for input JWS, another one 
- for output JWS. Similarly, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L153";
 rel="nofollow">this endpoint</a> uses a <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L162";
 rel="nofollow">single JWE properties file</a> for encrypting/decrypting the 
data, while <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.
 xml#L139" rel="nofollow">this endpoint</a> uses <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L139";
 rel="nofollow">two JWE properties files</a>. <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L178";
 rel="nofollow">This endpoint</a> support both JWS and JSON with <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L189";
 rel="nofollow">in/out specific properties</a>. If either JWS or JWE private 
key needs to be loaded from the password-protected storage (JKS, encryped 
JWK)&#160; then a&#160;<a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt
 
/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/common/PrivateKeyPasswordProvider.java"
 rel="nofollow">password provider</a> needs be <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L194";
 rel="nofollow">registered</a> as well, it can be shared between JWS or JWS or 
be in/out specific for either JWS or JWE.</p><p>These configuration propertie 
are of major help when JAX-RS JOSE filters process the in/out payload without 
the application service code being aware of it. While filters can be injected 
with JWS or JWE providers directly, one would usually set the relevant 
properties as part of the endpoint or client set-up and expect the filters load 
the required JWS or JWE providers as needed.&#160;</p><p>If you need to do JWS 
or JWE processing directly in your service or interceptor code then having the 
properties may also b
 e helpful, for example, the following code works because it is indirectly 
supported by the properties indicating which signature or encryption algorithm 
is used, where to get the key if needed, etc:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>Loading JWS and JWE Providers 
</b></div><div class="codeContent panelContent pdl">
+</div></div><p>Note the Base64Url encoded protected headers go first, followed 
by the 'recipients' array, with each element containing the encrypted content 
encryption key which can be decrypted by the recipient private key, with the 
array of recipients followed by the IV, ciphertext and authentication tag 
Base64Url sequences.</p><h2 
id="JAX-RSJOSE-LinkingJWTauthenticationstoJWSorJWEcontent">Linking JWT 
authentications to JWS or JWE content</h2><p>CXF introduced a "JWT" HTTP 
authentication scheme, with a Base64Url encoded JWT token representing a user 
authentication against an IDP capable of issuing JWT assertions (or simply JWT 
tokens). JWT assertion is like SAML assertion except that it is in a JSON 
format. If you'd like to cryptographically bind this JWT token to a data 
secured by JWS and/or JWE processors then simply add <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/secu
 rity/jose/jaxrs/JwtAuthenticationClientFilter.java" 
rel="nofollow">JwtAuthenticationClientFilter</a>on the client side and <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/rt/rs/security/jose-parent/jose-jaxrs/src/main/java/org/apache/cxf/rs/security/jose/jaxrs/JwtAuthenticationFilter.java";
 rel="nofollow">JwtAuthenticationFilter</a> on the server side. These filters 
link the authentication token with a randomly generated secure value which is 
added to both the token and the body JWS/JWE protected headers.</p><p>This 
approach is more effective compared to the ones where the body hash is 
calculated before it is submitted to a signature creation function, with the 
signature added as HTTP header.</p><h2 
id="JAX-RSJOSE-OptionalprotectionofHTTPheaders">Optional protection of HTTP 
headers</h2><p>Starting from CXF 3.1.12 it is possible to use JWS, JWS JSON, 
JWE and JWE JSON filters to protect the selected set of HTTP headers. The JOSE 
payloads produced b
 y these filters guarantee that the JOSE headers are integrity protected. Given 
this, if one enables a 'protectHttpHeaders' boolean property on the request 
filters, then, by default, HTTP Content-Type and Accept header values will be 
registered as JOSE header properties prefixed with "http.", example, 
"http.Accept":"text/plain". The list of the headers to be protected can be 
customized using a 'protectedHttpHeaders' set property.</p><p>These properties 
will be compared against the current HTTP headers on the receiving 
end.</p><p>This approach does not prevent the streaming of the outgoing data 
(which will also be protected by the filters) and offers a way to secure the 
HTTP headers which are really important for the correct processing of the 
incoming payloads</p><h1 id="JAX-RSJOSE-Configuration">Configuration</h1><p>CXF 
JOSE configuration provides for loading JWS and JWE keys and supporting various 
processing options. Configuration properties can be shared between JWS and JWE 
process
 ors or in/out only JWS and or JWE properties can be set.</p><p>Typically a 
secure JAX-RS endpoint or client is initialized with JWS and or JWE 
properties.</p><p>For example, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L197";
 rel="nofollow">this endpoint</a> is configured with a <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L207";
 rel="nofollow">single JWS properties file</a> which will apply to both input 
(signature verification) and output (signature creation) JWS operations. <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L210";
 rel="nofollow">This endpoint</a> depends
  on <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L218";
 rel="nofollow">two JWS properties files</a>, one - for input JWS, another one 
- for output JWS. Similarly, <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L153";
 rel="nofollow">this endpoint</a> uses a <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L162";
 rel="nofollow">single JWE properties file</a> for encrypting/decrypting the 
data, while <a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/ser
 ver.xml#L139" rel="nofollow">this endpoint</a> uses <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L139";
 rel="nofollow">two JWE properties files</a>. <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L178";
 rel="nofollow">This endpoint</a> support both JWS and JSON with <a 
shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L189";
 rel="nofollow">in/out specific properties</a>. If either JWS or JWE private 
key needs to be loaded from the password-protected storage (JKS, encryped 
JWK)&#160; then a&#160;<a shape="rect" class="external-link" 
href="https://github.com/apache/cxf/blob/maste
 
r/rt/rs/security/jose-parent/jose/src/main/java/org/apache/cxf/rs/security/jose/common/PrivateKeyPasswordProvider.java"
 rel="nofollow">password provider</a> needs be <a shape="rect" 
class="external-link" 
href="https://github.com/apache/cxf/blob/master/systests/rs-security/src/test/resources/org/apache/cxf/systest/jaxrs/security/jose/jwejws/server.xml#L194";
 rel="nofollow">registered</a> as well, it can be shared between JWS or JWS or 
be in/out specific for either JWS or JWE.</p><p>These configuration propertie 
are of major help when JAX-RS JOSE filters process the in/out payload without 
the application service code being aware of it. While filters can be injected 
with JWS or JWE providers directly, one would usually set the relevant 
properties as part of the endpoint or client set-up and expect the filters load 
the required JWS or JWE providers as needed.&#160;</p><p>If you need to do JWS 
or JWE processing directly in your service or interceptor code then having the 
properties may al
 so be helpful, for example, the following code works because it is indirectly 
supported by the properties indicating which signature or encryption algorithm 
is used, where to get the key if needed, etc:</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>Loading JWS and JWE Providers 
</b></div><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">JwsSignatureProvider jwsOut = 
JwsUtils.loadSignatureProvider(true);
 JwsSignatureVerifier jwsIn = JwsUtils.loadSignatureVerifier(true);
 


Reply via email to