src/java.base/share/classes/sun/security/validator/CADistrustPolicy.java
author mullan
Tue, 22 Jan 2019 09:27:19 -0500
changeset 53428 f443de1cee05
parent 52948 04c9b7111aac
permissions -rw-r--r--
8216280: Allow later Symantec Policy distrust date for two Apple SubCAs Reviewed-by: coffeys
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52948
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     1
/*
53428
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
52948
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     4
 *
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    10
 *
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    15
 * accompanied this code).
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    16
 *
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    20
 *
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    23
 * questions.
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    24
 */
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    25
package sun.security.validator;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    26
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    27
import java.security.AccessController;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    28
import java.security.PrivilegedAction;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    29
import java.security.Security;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    30
import java.security.cert.X509Certificate;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    31
import java.util.EnumSet;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    32
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    33
import sun.security.util.Debug;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    34
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    35
/**
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    36
 * Policies for distrusting a certificate authority (CA). See the
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    37
 * jdk.security.caDistrustPolicies security property for more information.
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    38
 */
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    39
enum CADistrustPolicy {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    40
    /**
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    41
     * Distrust TLS Server certificates anchored by a Symantec root CA and
53428
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    42
     * issued after April 16, 2019 (with exceptions for a couple of subordinate
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    43
     * CAs, see the jdk.security.caDistrustPolicies definition in the
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    44
     * java.security file for more details). If enabled, this policy is
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    45
     * currently enforced by the PKIX and SunX509 TrustManager implementations
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    46
     * of the SunJSSE provider implementation.
52948
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    47
     */
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    48
    SYMANTEC_TLS {
53428
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    49
        void checkDistrust(String variant, X509Certificate[] chain)
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    50
                           throws ValidatorException {
52948
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    51
            if (!variant.equals(Validator.VAR_TLS_SERVER)) {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    52
                return;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    53
            }
53428
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    54
            SymantecTLSPolicy.checkDistrust(chain);
52948
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    55
        }
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    56
    };
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    57
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    58
    /**
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    59
     * Checks if the end-entity certificate is distrusted.
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    60
     *
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    61
     * @param variant the type of certificate being checked
53428
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    62
     * @param chain the end-entity's certificate chain. The end entity cert
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    63
     *              is at index 0, the trust anchor at index n-1.
52948
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    64
     * @throws ValidatorException if the end-entity certificate is distrusted
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    65
     */
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    66
    abstract void checkDistrust(String variant,
53428
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    67
                                X509Certificate[] chain)
f443de1cee05 8216280: Allow later Symantec Policy distrust date for two Apple SubCAs
mullan
parents: 52948
diff changeset
    68
                                throws ValidatorException;
52948
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    69
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    70
    // The policies set in the jdk.security.caDistrustPolicies property.
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    71
    static final EnumSet<CADistrustPolicy> POLICIES = parseProperty();
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    72
    private static EnumSet<CADistrustPolicy> parseProperty() {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    73
        String property = AccessController.doPrivileged(
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    74
            new PrivilegedAction<>() {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    75
                @Override
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    76
                public String run() {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    77
                    return Security.getProperty(
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    78
                        "jdk.security.caDistrustPolicies");
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    79
                }
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    80
            });
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    81
        EnumSet<CADistrustPolicy> set = EnumSet.noneOf(CADistrustPolicy.class);
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    82
        // if property is null or empty, the restrictions are not enforced
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    83
        if (property == null || property.isEmpty()) {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    84
            return set;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    85
        }
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    86
        String[] policies = property.split(",");
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    87
        for (String policy : policies) {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    88
            policy = policy.trim();
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    89
            try {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    90
                CADistrustPolicy caPolicy =
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    91
                    Enum.valueOf(CADistrustPolicy.class, policy);
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    92
                set.add(caPolicy);
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    93
            } catch (IllegalArgumentException iae) {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    94
                // ignore unknown values but log it
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    95
                Debug debug = Debug.getInstance("certpath");
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    96
                if (debug != null) {
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    97
                    debug.println("Unknown value for the " +
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    98
                                  "jdk.security.caDistrustPolicies property: "
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
    99
                                  + policy);
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
   100
                }
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
   101
            }
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
   102
        }
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
   103
        return set;
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
   104
    }
04c9b7111aac 8207258: Distrust TLS server certificates anchored by Symantec Root CAs
mullan
parents:
diff changeset
   105
}