1*6777b538SAndroid Build Coastguard Worker#!/bin/sh 2*6777b538SAndroid Build Coastguard Worker 3*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors 4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker# The following documentation uses the annotation approach from RFC 4158. 8*6777b538SAndroid Build Coastguard Worker# CAs (entities that share the same name and public key) are denoted in boxes, 9*6777b538SAndroid Build Coastguard Worker# while the indication that a CA Foo signed a certificate for CA Bar is denoted 10*6777b538SAndroid Build Coastguard Worker# by directed arrows. 11*6777b538SAndroid Build Coastguard Worker# 12*6777b538SAndroid Build Coastguard Worker# +---+ +-----+ 13*6777b538SAndroid Build Coastguard Worker# | D | | E | 14*6777b538SAndroid Build Coastguard Worker# +---+ +-----+ 15*6777b538SAndroid Build Coastguard Worker# | | | 16*6777b538SAndroid Build Coastguard Worker# +--v v--+ | 17*6777b538SAndroid Build Coastguard Worker# +---+ +---+ 18*6777b538SAndroid Build Coastguard Worker# | C | | F | 19*6777b538SAndroid Build Coastguard Worker# +---+ +---+ 20*6777b538SAndroid Build Coastguard Worker# | | 21*6777b538SAndroid Build Coastguard Worker# v v---+ 22*6777b538SAndroid Build Coastguard Worker# +-----+ 23*6777b538SAndroid Build Coastguard Worker# | B | 24*6777b538SAndroid Build Coastguard Worker# +-----+ 25*6777b538SAndroid Build Coastguard Worker# | 26*6777b538SAndroid Build Coastguard Worker# v 27*6777b538SAndroid Build Coastguard Worker# +---+ 28*6777b538SAndroid Build Coastguard Worker# | A | 29*6777b538SAndroid Build Coastguard Worker# +---+ 30*6777b538SAndroid Build Coastguard Worker# 31*6777b538SAndroid Build Coastguard Worker# To validate A, there are several possible paths, using A(B) to indicate 32*6777b538SAndroid Build Coastguard Worker# the certificate A signed by B: 33*6777b538SAndroid Build Coastguard Worker# 34*6777b538SAndroid Build Coastguard Worker# 1. A(B) -> B(C) -> C(D) -> D(D) 35*6777b538SAndroid Build Coastguard Worker# 3. A(B) -> B(C) -> C(E) -> E(E) 36*6777b538SAndroid Build Coastguard Worker# 4. A(B) -> B(F) -> F(E) -> E(E) 37*6777b538SAndroid Build Coastguard Worker# 38*6777b538SAndroid Build Coastguard Worker# That is, there are two different versions of C (signed by D and E) and 39*6777b538SAndroid Build Coastguard Worker# two versions of B (signed by C and F). Possible trust anchors are D and E, 40*6777b538SAndroid Build Coastguard Worker# which are both self-signed. 41*6777b538SAndroid Build Coastguard Worker# 42*6777b538SAndroid Build Coastguard Worker# The goal is to ensure that, as long as at least one of C or F is still valid, 43*6777b538SAndroid Build Coastguard Worker# clients are able to successfully build a valid path. 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker# Exit script as soon a something fails. 46*6777b538SAndroid Build Coastguard Workerset -e 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Workerrm -rf out 49*6777b538SAndroid Build Coastguard Workermkdir out 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Workerecho Create the serial and index number files. 52*6777b538SAndroid Build Coastguard Workerfor i in B C D E F 53*6777b538SAndroid Build Coastguard Workerdo 54*6777b538SAndroid Build Coastguard Worker openssl rand -hex -out "out/${i}-serial" 16 55*6777b538SAndroid Build Coastguard Worker touch "out/${i}-index.txt" 56*6777b538SAndroid Build Coastguard Workerdone 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Workerecho Generate the keys. 59*6777b538SAndroid Build Coastguard Workerfor i in A B C D E F 60*6777b538SAndroid Build Coastguard Workerdo 61*6777b538SAndroid Build Coastguard Worker openssl genrsa -out "out/${i}.key" 2048 62*6777b538SAndroid Build Coastguard Workerdone 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Workerecho "Generating the self-signed roots" 65*6777b538SAndroid Build Coastguard Workerfor i in D E 66*6777b538SAndroid Build Coastguard Workerdo 67*6777b538SAndroid Build Coastguard Worker echo "Generating CSR ${i}" 68*6777b538SAndroid Build Coastguard Worker CA_COMMON_NAME="${i} Root CA - Multi-root" \ 69*6777b538SAndroid Build Coastguard Worker CERTIFICATE="${i}" \ 70*6777b538SAndroid Build Coastguard Worker openssl req \ 71*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 72*6777b538SAndroid Build Coastguard Worker -new \ 73*6777b538SAndroid Build Coastguard Worker -key "out/${i}.key" \ 74*6777b538SAndroid Build Coastguard Worker -out "out/${i}.csr" 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker echo "Generating self-signed ${i}" 77*6777b538SAndroid Build Coastguard Worker CA_COMMON_NAME="${i} Root CA - Multi-root" \ 78*6777b538SAndroid Build Coastguard Worker CERTIFICATE="${i}" \ 79*6777b538SAndroid Build Coastguard Worker openssl ca \ 80*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 81*6777b538SAndroid Build Coastguard Worker -batch \ 82*6777b538SAndroid Build Coastguard Worker -startdate 160102000000Z \ 83*6777b538SAndroid Build Coastguard Worker -enddate 260102000000Z \ 84*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 85*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 86*6777b538SAndroid Build Coastguard Worker -selfsign \ 87*6777b538SAndroid Build Coastguard Worker -in "out/${i}.csr" \ 88*6777b538SAndroid Build Coastguard Worker -out "out/${i}.pem" 89*6777b538SAndroid Build Coastguard Workerdone 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Workerecho "Generating intermediate CSRs" 92*6777b538SAndroid Build Coastguard Workerfor i in B C F 93*6777b538SAndroid Build Coastguard Workerdo 94*6777b538SAndroid Build Coastguard Worker echo "Generating CSR ${i}" 95*6777b538SAndroid Build Coastguard Worker CA_COMMON_NAME="${i} CA - Multi-root" \ 96*6777b538SAndroid Build Coastguard Worker CERTIFICATE="${i}" \ 97*6777b538SAndroid Build Coastguard Worker openssl req \ 98*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 99*6777b538SAndroid Build Coastguard Worker -new \ 100*6777b538SAndroid Build Coastguard Worker -key "out/${i}.key" \ 101*6777b538SAndroid Build Coastguard Worker -out "out/${i}.csr" 102*6777b538SAndroid Build Coastguard Workerdone 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Workerecho D signs C 105*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="D CA - Multi-root" \ 106*6777b538SAndroid Build Coastguard WorkerCERTIFICATE=D \ 107*6777b538SAndroid Build Coastguard Workeropenssl ca \ 108*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 109*6777b538SAndroid Build Coastguard Worker -batch \ 110*6777b538SAndroid Build Coastguard Worker -startdate 160103000000Z \ 111*6777b538SAndroid Build Coastguard Worker -enddate 260102000000Z \ 112*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 113*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 114*6777b538SAndroid Build Coastguard Worker -in out/C.csr \ 115*6777b538SAndroid Build Coastguard Worker -out out/C.pem 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Workerecho C signs B 118*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="C CA - Multi-root" \ 119*6777b538SAndroid Build Coastguard WorkerCERTIFICATE=C \ 120*6777b538SAndroid Build Coastguard Workeropenssl ca \ 121*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 122*6777b538SAndroid Build Coastguard Worker -batch \ 123*6777b538SAndroid Build Coastguard Worker -startdate 160104000000Z \ 124*6777b538SAndroid Build Coastguard Worker -enddate 260102000000Z \ 125*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 126*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 127*6777b538SAndroid Build Coastguard Worker -in out/B.csr \ 128*6777b538SAndroid Build Coastguard Worker -out out/B.pem 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Workerecho E signs C2 131*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="E CA - Multi-root" \ 132*6777b538SAndroid Build Coastguard WorkerCERTIFICATE=E \ 133*6777b538SAndroid Build Coastguard Workeropenssl ca \ 134*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 135*6777b538SAndroid Build Coastguard Worker -batch \ 136*6777b538SAndroid Build Coastguard Worker -startdate 160105000000Z \ 137*6777b538SAndroid Build Coastguard Worker -enddate 260102000000Z \ 138*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 139*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 140*6777b538SAndroid Build Coastguard Worker -in out/C.csr \ 141*6777b538SAndroid Build Coastguard Worker -out out/C2.pem 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Workerecho E signs F 144*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="E CA - Multi-root" \ 145*6777b538SAndroid Build Coastguard WorkerCERTIFICATE=E \ 146*6777b538SAndroid Build Coastguard Workeropenssl ca \ 147*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 148*6777b538SAndroid Build Coastguard Worker -batch \ 149*6777b538SAndroid Build Coastguard Worker -startdate 160102000000Z \ 150*6777b538SAndroid Build Coastguard Worker -enddate 260102000000Z \ 151*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 152*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 153*6777b538SAndroid Build Coastguard Worker -in out/F.csr \ 154*6777b538SAndroid Build Coastguard Worker -out out/F.pem 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker# Note: The startdate for B-by-F MUST be different than that of B-by-C; to make 157*6777b538SAndroid Build Coastguard Worker# B-by-F more preferable, the startdate is chosen to be GREATER (later) than 158*6777b538SAndroid Build Coastguard Worker# B-by-C. 159*6777b538SAndroid Build Coastguard Workerecho F signs B2 160*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="F CA - Multi-root" \ 161*6777b538SAndroid Build Coastguard WorkerCERTIFICATE=F \ 162*6777b538SAndroid Build Coastguard Workeropenssl ca \ 163*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 164*6777b538SAndroid Build Coastguard Worker -batch \ 165*6777b538SAndroid Build Coastguard Worker -startdate 160105000000Z \ 166*6777b538SAndroid Build Coastguard Worker -enddate 260102000000Z \ 167*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 168*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 169*6777b538SAndroid Build Coastguard Worker -in out/B.csr \ 170*6777b538SAndroid Build Coastguard Worker -out out/B2.pem 171*6777b538SAndroid Build Coastguard Worker 172*6777b538SAndroid Build Coastguard Workerecho "Generating leaf CSRs" 173*6777b538SAndroid Build Coastguard Workerfor i in A 174*6777b538SAndroid Build Coastguard Workerdo 175*6777b538SAndroid Build Coastguard Worker echo "Generating leaf ${i}" 176*6777b538SAndroid Build Coastguard Worker openssl req \ 177*6777b538SAndroid Build Coastguard Worker -config ee.cnf \ 178*6777b538SAndroid Build Coastguard Worker -new \ 179*6777b538SAndroid Build Coastguard Worker -key "out/${i}.key" \ 180*6777b538SAndroid Build Coastguard Worker -out "out/${i}.csr" 181*6777b538SAndroid Build Coastguard Workerdone 182*6777b538SAndroid Build Coastguard Worker 183*6777b538SAndroid Build Coastguard Workerecho "Signing leaves" 184*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="B CA - Multi-root" \ 185*6777b538SAndroid Build Coastguard WorkerCERTIFICATE=B \ 186*6777b538SAndroid Build Coastguard Workeropenssl ca \ 187*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf \ 188*6777b538SAndroid Build Coastguard Worker -batch \ 189*6777b538SAndroid Build Coastguard Worker -days 3650 \ 190*6777b538SAndroid Build Coastguard Worker -extensions user_cert \ 191*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 192*6777b538SAndroid Build Coastguard Worker -in out/A.csr \ 193*6777b538SAndroid Build Coastguard Worker -out out/A.pem 194*6777b538SAndroid Build Coastguard Worker 195*6777b538SAndroid Build Coastguard Workerecho "Copying outputs" 196*6777b538SAndroid Build Coastguard Worker/bin/sh -c "cat out/A.key out/A.pem > ../certificates/multi-root-A-by-B.pem" 197*6777b538SAndroid Build Coastguard Worker/bin/sh -c "cat out/A.pem out/B.pem out/C.pem out/D.pem \ 198*6777b538SAndroid Build Coastguard Worker > ../certificates/multi-root-chain1.pem" 199*6777b538SAndroid Build Coastguard Worker/bin/sh -c "cat out/A.pem out/B.pem out/C2.pem out/E.pem \ 200*6777b538SAndroid Build Coastguard Worker > ../certificates/multi-root-chain2.pem" 201*6777b538SAndroid Build Coastguard Workercp out/B.pem ../certificates/multi-root-B-by-C.pem 202*6777b538SAndroid Build Coastguard Workercp out/B2.pem ../certificates/multi-root-B-by-F.pem 203*6777b538SAndroid Build Coastguard Workercp out/C.pem ../certificates/multi-root-C-by-D.pem 204*6777b538SAndroid Build Coastguard Workercp out/C2.pem ../certificates/multi-root-C-by-E.pem 205*6777b538SAndroid Build Coastguard Workercp out/F.pem ../certificates/multi-root-F-by-E.pem 206*6777b538SAndroid Build Coastguard Workercp out/D.pem ../certificates/multi-root-D-by-D.pem 207*6777b538SAndroid Build Coastguard Workercp out/E.pem ../certificates/multi-root-E-by-E.pem 208*6777b538SAndroid Build Coastguard Worker 209*6777b538SAndroid Build Coastguard Workerecho "Generating CRLSets" 210*6777b538SAndroid Build Coastguard Worker# Block D and E by SPKI; invalidates all paths. 211*6777b538SAndroid Build Coastguard Workerpython crlsetutil.py -o ../certificates/multi-root-crlset-D-and-E.raw \ 212*6777b538SAndroid Build Coastguard Worker<<CRLSETDOCBLOCK 213*6777b538SAndroid Build Coastguard Worker{ 214*6777b538SAndroid Build Coastguard Worker "BlockedBySPKI": [ 215*6777b538SAndroid Build Coastguard Worker "out/D.pem", 216*6777b538SAndroid Build Coastguard Worker "out/E.pem" 217*6777b538SAndroid Build Coastguard Worker ] 218*6777b538SAndroid Build Coastguard Worker} 219*6777b538SAndroid Build Coastguard WorkerCRLSETDOCBLOCK 220*6777b538SAndroid Build Coastguard Worker 221*6777b538SAndroid Build Coastguard Worker# Block E by SPKI. 222*6777b538SAndroid Build Coastguard Workerpython crlsetutil.py -o ../certificates/multi-root-crlset-E.raw \ 223*6777b538SAndroid Build Coastguard Worker<<CRLSETDOCBLOCK 224*6777b538SAndroid Build Coastguard Worker{ 225*6777b538SAndroid Build Coastguard Worker "BlockedBySPKI": [ 226*6777b538SAndroid Build Coastguard Worker "out/E.pem" 227*6777b538SAndroid Build Coastguard Worker ] 228*6777b538SAndroid Build Coastguard Worker} 229*6777b538SAndroid Build Coastguard WorkerCRLSETDOCBLOCK 230*6777b538SAndroid Build Coastguard Worker 231*6777b538SAndroid Build Coastguard Worker# Block C-by-D and F-by-E by way of serial number. 232*6777b538SAndroid Build Coastguard Workerpython crlsetutil.py -o ../certificates/multi-root-crlset-CD-and-FE.raw \ 233*6777b538SAndroid Build Coastguard Worker<<CRLSETDOCBLOCK 234*6777b538SAndroid Build Coastguard Worker{ 235*6777b538SAndroid Build Coastguard Worker "BlockedByHash": { 236*6777b538SAndroid Build Coastguard Worker "out/D.pem": ["out/C.pem"], 237*6777b538SAndroid Build Coastguard Worker "out/E.pem": ["out/F.pem"] 238*6777b538SAndroid Build Coastguard Worker } 239*6777b538SAndroid Build Coastguard Worker} 240*6777b538SAndroid Build Coastguard WorkerCRLSETDOCBLOCK 241*6777b538SAndroid Build Coastguard Worker 242*6777b538SAndroid Build Coastguard Worker# Block C (all versions) by way of SPKI 243*6777b538SAndroid Build Coastguard Workerpython crlsetutil.py -o ../certificates/multi-root-crlset-C.raw \ 244*6777b538SAndroid Build Coastguard Worker<<CRLSETDOCBLOCK 245*6777b538SAndroid Build Coastguard Worker{ 246*6777b538SAndroid Build Coastguard Worker "BlockedBySPKI": [ "out/C.pem" ] 247*6777b538SAndroid Build Coastguard Worker} 248*6777b538SAndroid Build Coastguard WorkerCRLSETDOCBLOCK 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Worker# Block an unrelated/unissued serial (D, not issued by E) to enable all paths. 251*6777b538SAndroid Build Coastguard Workerpython crlsetutil.py -o ../certificates/multi-root-crlset-unrelated.raw \ 252*6777b538SAndroid Build Coastguard Worker<<CRLSETDOCBLOCK 253*6777b538SAndroid Build Coastguard Worker{ 254*6777b538SAndroid Build Coastguard Worker "BlockedByHash": { 255*6777b538SAndroid Build Coastguard Worker "out/E.pem": ["out/D.pem"] 256*6777b538SAndroid Build Coastguard Worker } 257*6777b538SAndroid Build Coastguard Worker} 258*6777b538SAndroid Build Coastguard WorkerCRLSETDOCBLOCK 259