Skip to content

Commit 01aa403

Browse files
committed
Fix backend JWT x5t inconsistencies
1 parent 5b1724f commit 01aa403

File tree

8 files changed

+30
-7
lines changed

8 files changed

+30
-7
lines changed

components/apimgt/org.wso2.carbon.apimgt.common.gateway/src/main/java/org/wso2/carbon/apimgt/common/gateway/dto/JWTConfigurationDto.java

+9
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class JWTConfigurationDto {
4646
private long ttl;
4747

4848
private boolean useKid;
49+
private boolean isEncodeX5tWithoutPadding;
4950

5051
public boolean useKid() {
5152
return useKid;
@@ -200,4 +201,12 @@ public boolean useSHA256Hash() {
200201
public void setUseSHA256Hash(boolean useSHA256Hash) {
201202
this.useSHA256Hash = useSHA256Hash;
202203
}
204+
205+
public boolean isEncodeX5tWithoutPadding() {
206+
return isEncodeX5tWithoutPadding;
207+
}
208+
209+
public void setEncodeX5tWithoutPadding(boolean encodeX5tWithoutPadding) {
210+
isEncodeX5tWithoutPadding = encodeX5tWithoutPadding;
211+
}
203212
}

components/apimgt/org.wso2.carbon.apimgt.common.gateway/src/main/java/org/wso2/carbon/apimgt/common/gateway/jwtgenerator/AbstractAPIMgtGatewayJWTGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ protected String addCertToHeader() throws JWTGeneratorException {
150150
try {
151151
Certificate publicCert = jwtConfigurationDto.getPublicCert();
152152
return JWTUtil.generateHeader(publicCert, signatureAlgorithm, jwtConfigurationDto.useKid(),
153-
useSHA256Hash);
153+
useSHA256Hash, jwtConfigurationDto.isEncodeX5tWithoutPadding());
154154
} catch (Exception e) {
155155
String error = "Error in obtaining keystore";
156156
throw new JWTGeneratorException(error, e);

components/apimgt/org.wso2.carbon.apimgt.common.gateway/src/main/java/org/wso2/carbon/apimgt/common/gateway/util/JWTUtil.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public static String getJWSCompliantAlgorithmCode(String signatureAlgorithm) {
7979

8080
public static String generateHeader(Certificate publicCert, String signatureAlgorithm)
8181
throws JWTGeneratorException {
82-
return generateHeader(publicCert, signatureAlgorithm, false, false);
82+
return generateHeader(publicCert, signatureAlgorithm, false, false, false);
8383
}
8484

8585
/**
@@ -93,7 +93,7 @@ public static String generateHeader(Certificate publicCert, String signatureAlgo
9393
*/
9494

9595
public static String generateHeader(Certificate publicCert, String signatureAlgorithm, boolean useKid,
96-
boolean useSHA256Hash)
96+
boolean useSHA256Hash, boolean encodeX5tWithoutPadding)
9797
throws JWTGeneratorException {
9898

9999
/*
@@ -113,8 +113,13 @@ public static String generateHeader(Certificate publicCert, String signatureAlgo
113113
byte[] digestInBytes = digestValue.digest();
114114
String publicCertThumbprint = hexify(digestInBytes);
115115
String base64UrlEncodedThumbPrint;
116-
base64UrlEncodedThumbPrint = java.util.Base64.getUrlEncoder()
117-
.encodeToString(publicCertThumbprint.getBytes("UTF-8"));
116+
if (encodeX5tWithoutPadding) {
117+
base64UrlEncodedThumbPrint = java.util.Base64.getUrlEncoder().withoutPadding()
118+
.encodeToString(publicCertThumbprint.getBytes("UTF-8"));
119+
} else {
120+
base64UrlEncodedThumbPrint = java.util.Base64.getUrlEncoder()
121+
.encodeToString(publicCertThumbprint.getBytes("UTF-8"));
122+
}
118123

119124
JSONObject jwtHeader = new JSONObject();
120125
jwtHeader.put("typ", "JWT");

components/apimgt/org.wso2.carbon.apimgt.common.gateway/src/test/java/org/wso2/carbon/apimgt/common/gateway/JWTUtilTestCase.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void testJWTHeader() throws Exception {
6464
String signatureAlgorithm = "SHA256withRSA";
6565

6666
//Use SHA-256 as the certificate hashing algorithm
67-
String jwt = JWTUtil.generateHeader(cert, signatureAlgorithm, true, true);
67+
String jwt = JWTUtil.generateHeader(cert, signatureAlgorithm, true, true, false);
6868
Assert.assertNotNull(jwt);
6969
Assert.assertTrue(jwt.contains("kid"));
7070

@@ -74,7 +74,7 @@ public void testJWTHeader() throws Exception {
7474
Assert.assertTrue(jwt.contains("x5t#S256"));
7575

7676
//Use SHA-1 as the certificate hashing algorithm
77-
jwt = JWTUtil.generateHeader(cert, signatureAlgorithm, false, false);
77+
jwt = JWTUtil.generateHeader(cert, signatureAlgorithm, false, false, false);
7878
Assert.assertNotNull(jwt);
7979
Assert.assertFalse(jwt.contains("kid"));
8080

components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConstants.java

+1
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ public final class APIConstants {
465465
public static final String X5T256_PARAMETER = "x5t#S256";
466466
public static final String GATEWAY_JWT_GENERATOR = "GatewayJWTGeneration";
467467
public static final String GATEWAY_JWT_GENERATOR_IMPL = "ImplClass";
468+
public static final String ENCODE_X5T_WITHOUT_PADDING = "EncodeX5tWithoutPadding";
468469
public static final String TOKEN_ISSUERS = "TokenIssuers";
469470
public static final String GATEWAY_JWT_CONFIGURATION = "Configuration";
470471
public static final String GATEWAY_JWT_GENERATOR_CLAIMS = "ExcludedClaims";

components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIManagerConfiguration.java

+6
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,12 @@ private void setJWTConfiguration(OMElement omElement) {
16971697
OMElement configurationElement =
16981698
gatewayJWTConfigurationElement
16991699
.getFirstChildWithName(new QName(APIConstants.GATEWAY_JWT_CONFIGURATION));
1700+
OMElement encodeX5tWithoutPaddingElement = gatewayJWTConfigurationElement
1701+
.getFirstChildWithName(new QName(APIConstants.ENCODE_X5T_WITHOUT_PADDING));
1702+
if (encodeX5tWithoutPaddingElement != null) {
1703+
jwtConfigurationDto.setEncodeX5tWithoutPadding(Boolean.parseBoolean(
1704+
encodeX5tWithoutPaddingElement.getText()));
1705+
}
17001706
if (configurationElement != null) {
17011707
OMElement claimsElement =
17021708
configurationElement

features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/org.wso2.carbon.apimgt.core.default.json

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"apim.jwt.signing_algorithm": "SHA256withRSA",
2929
"apim.jwt.claims_extractor_impl": "org.wso2.carbon.apimgt.impl.token.ExtendedDefaultClaimsRetriever",
3030
"apim.jwt.gateway_generator.impl":"org.wso2.carbon.apimgt.common.gateway.jwtgenerator.APIMgtGatewayJWTGeneratorImpl",
31+
"apim.jwt.encode_x5t_without_padding": false,
3132
"apim.jwt.enable_tenant_based_signing": false,
3233
"apim.jwt.gateway_generator.enable_claim_retrieval": false,
3334
"apim.jwt.binding_federated_user_claims": false,

features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
{% endif %}
8989
<GatewayJWTGeneration>
9090
<ImplClass>{{apim.jwt.gateway_generator.impl}}</ImplClass>
91+
<EncodeX5tWithoutPadding>{{apim.jwt.encode_x5t_without_padding}}</EncodeX5tWithoutPadding>
9192
<Configuration>
9293
<ExcludedClaims>
9394
{%- for claim in apim.jwt.gateway_generator.excluded_claims -%}

0 commit comments

Comments
 (0)