RFR: 8295068: SSLEngine throws NPE parsing CertificateRequests

Kevin Driver kdriver at openjdk.org
Thu Jul 6 15:45:57 UTC 2023


On Thu, 6 Jul 2023 07:05:46 GMT, Xue-Lei Andrew Fan <xuelei at openjdk.org> wrote:

>> JDK-8295068: an NPE is thrown when an invalid `id` is found to match up a `ClientCertificateType`; rather than throwing the `NPE`, we now throw an `IllegalArgumentException`. This does not seem to be a scenario where recovery is possible or desired, so the `IAE` should be the proper behavior.
>
> src/java.base/share/classes/sun/security/ssl/CertificateRequest.java line 134:
> 
>> 132:                     throw new IllegalArgumentException(id + " was " +
>> 133:                             "not a valid ClientCertificateType id");
>> 134:                 }
> 
> It may not comply to TLS specification if throwing exception here.  Unknown types should be ignored for compatibility.
> 
> - if (cct.isAvailable) {
> + if (cct != null && cct.isAvailable) {

@XueleiFan It looks like the relevant bit of the RFC (as you point out) is this: 


For historical reasons, the names of some client certificate types
      include the algorithm used to sign the certificate.  For example,
      in earlier versions of TLS, rsa_fixed_dh meant a certificate
      signed with RSA and containing a static DH key.  In TLS 1.2, this
      functionality has been obsoleted by the
      supported_signature_algorithms, and the certificate type no longer
      restricts the algorithm used to sign the certificate.  For
      example, if the server sends dss_fixed_dh certificate type and
      {{sha1, dsa}, {sha1, rsa}} signature types, the client MAY reply
      with a certificate containing a static DH key, signed with RSA-
      SHA1.


I had noticed the comments beginning on line 757 in CertificateRequest:


// For TLS 1.2, we no longer use the certificate_types field
// from the CertificateRequest message to directly determine
// the SSLPossession.  Instead, the choosePossession method
// will use the accepted signature schemes in the message to
// determine the set of acceptable certificate types to select from.


I noted that the id byte generated by the test case was 0x72, and this is definitely not a recognized/supported type in JSSE ["Values in the range 64-223 (decimal) inclusive are assigned via Specification Required"].

I chose `IllegalArgumentException` because it seemed values so far "out of range" would be undesirable, and perhaps I misinterpreted the commented paragraph above as implying that the `id` value needed to be one of the set of "acceptable certificate types". 

After referring back to the RFC, I agree that your proposed fix seems more in line with the intent of the RFC.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/14778#discussion_r1254616765


More information about the security-dev mailing list