Changeset c8aca62d


Ignore:
Timestamp:
Dec 11, 2015 10:36:40 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
3a4e82f
Parents:
8b9bcbc
Message:

Crypto: Blacklist Verisign G1 roots
match by CN or OU

File:
1 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/crypto/KeyStoreUtil.java

    r8b9bcbc rc8aca62d  
    5555        // serial number is actually negative; hex string as reported by certtool below
    5656        //new BigInteger("a4:4c:38:47:f8:ee:71:80:43:4d:b1:80:b9:a7:e9:62".replace(":", ""), 16)
    57         new BigInteger("-5b:b3:c7:b8:07:11:8e:7f:bc:b2:4e:7f:46:58:16:9e".replace(":", ""), 16)
     57        new BigInteger("-5b:b3:c7:b8:07:11:8e:7f:bc:b2:4e:7f:46:58:16:9e".replace(":", ""), 16),
     58        // Verisign G1 Roots
     59        // https://googleonlinesecurity.blogspot.com/2015/12/proactive-measures-in-digital.html
     60        // https://knowledge.symantec.com/support/ssl-certificates-support/index?page=content&id=ALERT1941
     61        // SHA-1
     62        new BigInteger("3c:91:31:cb:1f:f6:d0:1b:0e:9a:b8:d0:44:bf:12:be".replace(":", ""), 16),
     63        // MD2
     64        new BigInteger("70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf".replace(":", ""), 16)
    5865    };
    5966
     
    6168     *  Corresponding issuer CN for the serial number.
    6269     *  Must be same number of entries as BLACKLIST_SERIAL.
    63      *  See removeBlacklistedCerts() below for alternatives if we want
    64      *  to blacklist a cert without an issuer CN.
     70     *  Either CN or OU must be non-null
    6571     */
    6672    private static final String[] BLACKLIST_ISSUER_CN = new String[] {
     
    6975        "Superfish, Inc.",
    7076        "eDellRoot",
    71         "DSDTestProvider"
     77        "DSDTestProvider",
     78        null,
     79        null
    7280    };
     81
     82    /**
     83     *  Corresponding issuer OU for the serial number.
     84     *  Must be same number of entries as BLACKLIST_SERIAL.
     85     *  Either CN or OU must be non-null
     86     */
     87    private static final String[] BLACKLIST_ISSUER_OU = new String[] {
     88        null,
     89        null,
     90        null,
     91        null,
     92        null,
     93        "Class 3 Public Primary Certification Authority",
     94        "Class 3 Public Primary Certification Authority"
     95    };
     96
    7397
    7498    /**
     
    228252     */
    229253    private static int removeBlacklistedCerts(KeyStore ks) {
    230         // This matches on the CN in the issuer,
     254        // This matches on the CN or OU in the issuer,
    231255        // and we can't do that on Android.
    232         // We could just match the whole string, and we will have to
    233         // if we want do it on Android or match a cert that has an issuer without a CN.
    234         // Or, most certs that don't have a CN have an OU, that could be a fallback.
    235         // Or do sha1hash(cert.getEncoded()) but that would be slower.
     256        // Alternative is sha1hash(cert.getEncoded()) but that would be slower,
     257        // unless the blacklist gets a little longer.
    236258        if (SystemVersion.isAndroid())
    237259            return 0;
     
    245267                        X509Certificate xc = (X509Certificate) c;
    246268                        BigInteger serial = xc.getSerialNumber();
     269                        // debug:
     270                        //String xname = CertUtil.getIssuerValue(xc, "CN");
     271                        //info("Found \"" + xname + "\" s/n: " + serial.toString(16));
     272                        //if (xname == null)
     273                        //    info("name is null, full issuer: " + xc.getIssuerX500Principal().getName());
    247274                        for (int i = 0; i < BLACKLIST_SERIAL.length; i++) {
    248                             // debug:
    249                             //String xname = CertUtil.getIssuerValue(xc, "CN");
    250                             //info("Found \"" + xname + "\" s/n: " + serial.toString(16));
    251                             //if (xname == null)
    252                             //    info("name is null, full issuer: " + xc.getIssuerX500Principal().getName());
    253275                            if (BLACKLIST_SERIAL[i].equals(serial)) {
    254                                 String name = CertUtil.getIssuerValue(xc, "CN");
    255                                 if (BLACKLIST_ISSUER_CN[i].equals(name)) {
    256                                     ks.deleteEntry(alias);
    257                                     count++;
    258                                     if (!_blacklistLogged) {
    259                                         // should this be a logAlways?
    260                                         warn("Ignoring blacklisted certificate \"" + alias +
    261                                              "\" issued by: \"" + name +
    262                                              "\" s/n: " + serial.toString(16), null);
     276                                if (BLACKLIST_ISSUER_CN[i] != null) {
     277                                    String name = CertUtil.getIssuerValue(xc, "CN");
     278                                    if (BLACKLIST_ISSUER_CN[i].equals(name)) {
     279                                        ks.deleteEntry(alias);
     280                                        count++;
     281                                        if (!_blacklistLogged) {
     282                                            // should this be a logAlways?
     283                                            warn("Ignoring blacklisted certificate \"" + alias +
     284                                                 "\" CN: \"" + name +
     285                                                 "\" s/n: " + serial.toString(16), null);
     286                                        }
     287                                        break;
     288                                    }
     289                                }
     290                                if (BLACKLIST_ISSUER_OU[i] != null) {
     291                                    String name = CertUtil.getIssuerValue(xc, "OU");
     292                                    if (BLACKLIST_ISSUER_OU[i].equals(name)) {
     293                                        ks.deleteEntry(alias);
     294                                        count++;
     295                                        if (!_blacklistLogged) {
     296                                            // should this be a logAlways?
     297                                            warn("Ignoring blacklisted certificate \"" + alias +
     298                                                 "\" OU: \"" + name +
     299                                                 "\" s/n: " + serial.toString(16), null);
     300                                        }
     301                                        break;
    263302                                    }
    264303                                }
     
    594633    }
    595634
     635    /**
     636     *   Usage: KeyStoreUtil (loads from system keystore)
     637     *          KeyStoreUtil foo.ks (loads from system keystore, and from foo.ks keystore if exists, else creates empty)
     638     *          KeyStoreUtil certDir (loads from system keystore and all certs in certDir if exists)
     639     */
    596640/****
    597641    public static void main(String[] args) {
Note: See TracChangeset for help on using the changeset viewer.