Hello,

We have been looking into supporting RSASSA-PSS signature algorithms within the 
chain of an end-entity certificate used for TLS 1.2. The EE certificate itself 
is not signed with RSASSA-PSS.


As mentioned in JDK-8146293<https://bugs.openjdk.java.net/browse/JDK-8146293>, 
we run into the exception: java.security.cert.CertificateException: 
Certificates does not conform to algorithm constraints


Upon closer inspection we believe there are 2 workarounds for this issue:


1) Update 
sun.security.provider.certpath.AlgorithmChecker#check(java.security.cert.Certificate,
 java.util.Collection<java.lang.String>) to call getSigAlgName from the 
provided certificate (var1), instead of the converted 
sun.security.x509.X509CertImpl (var3).


Looking at the code in question:


    public void check(Certificate var1, Collection<String> var2) throws 
CertPathValidatorException {
        if(var1 instanceof X509Certificate && this.constraints != null) {
            X509CertImpl var3 = null;

            try {
                var3 = X509CertImpl.toImpl((X509Certificate)var1);
            } catch (CertificateException var15) {
                throw new CertPathValidatorException(var15);
            }

            PublicKey var4 = var3.getPublicKey();
            String var5 = var3.getSigAlgName();
            AlgorithmId var6 = null;

            try {
                var6 = (AlgorithmId)var3.get("x509.algorithm");
            } catch (CertificateException var14) {
                throw new CertPathValidatorException(var14);
            }

            AlgorithmParameters var7 = var6.getParameters();
            if(!this.constraints.permits(SIGNATURE_PRIMITIVE_SET, var5, var7)) {
                throw new CertPathValidatorException("Algorithm constraints 
check failed: " + var5, (Throwable)null, (CertPath)null, -1, 
BasicReason.ALGORITHM_CONSTRAINED);
            } else {
            ....

The problem is that the sun.security.x509.X509CertImpl cannot convert the 
RSASSA-PSS algorithm OID to its friendly name when var3.getSigAlgName() is 
called:

[cid:6a0141b3-a283-46ca-9db8-115cafc77a07]
NOTE: In this case var1 is a instance of 
org.bouncycastle.jce.provider.X509CertificateObject

In our tests, making this change results in a successful TLS connection without 
further changes:

- String var5 = var3.getSigAlgName();
+ String var5 = ((X509Certificate)var1).getSigAlgName();


2) Update sun.security.x509.AlgorithmId to properly map the RSASSA-PSS 
algorithm OID to its friendly name. We have not experimented with this option, 
but believe it would have the same outcome, but with more code to change.


Any thoughts from the community on which approach would be accepted into the 
JDK, or alternative suggestions not mentioned here, are appreciated.


Thanks,

Chris Fox

Senior Software Engineer @ MobileIron

Reply via email to