1*6777b538SAndroid Build Coastguard Worker#!/bin/sh 2*6777b538SAndroid Build Coastguard Worker 3*6777b538SAndroid Build Coastguard Worker# Copyright 2012 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# This script generates two chains of test certificates: 8*6777b538SAndroid Build Coastguard Worker# 9*6777b538SAndroid Build Coastguard Worker# 1. A (end-entity) -> B -> C -> D (self-signed root) 10*6777b538SAndroid Build Coastguard Worker# 2. A (end-entity) -> B -> C2 (self-signed root) 11*6777b538SAndroid Build Coastguard Worker# 12*6777b538SAndroid Build Coastguard Worker# in which A, B, C, and D have distinct keypairs. C2 is a self-signed root 13*6777b538SAndroid Build Coastguard Worker# certificate that uses the same keypair as C. 14*6777b538SAndroid Build Coastguard Worker# 15*6777b538SAndroid Build Coastguard Worker# We use these cert chains in 16*6777b538SAndroid Build Coastguard Worker# SSLClientSocketTest.VerifyReturnChainProperlyOrdered to ensure that 17*6777b538SAndroid Build Coastguard Worker# SSLInfo objects see the certificate chain as validated rather than as 18*6777b538SAndroid Build Coastguard Worker# served by the server. The server serves chain 1. The client has C2, NOT D, 19*6777b538SAndroid Build Coastguard Worker# installed as a trusted root. Therefore, the chain will validate as chain 20*6777b538SAndroid Build Coastguard Worker# 2, even though the server served chain 1. 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Workertry () { 23*6777b538SAndroid Build Coastguard Worker echo "$@" 24*6777b538SAndroid Build Coastguard Worker "$@" || exit 1 25*6777b538SAndroid Build Coastguard Worker} 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Workertry rm -rf out 28*6777b538SAndroid Build Coastguard Workertry mkdir out 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Workerecho Create the serial number files. 31*6777b538SAndroid Build Coastguard Workerserial=1000 32*6777b538SAndroid Build Coastguard Workerfor i in B C C2 D 33*6777b538SAndroid Build Coastguard Workerdo 34*6777b538SAndroid Build Coastguard Worker try /bin/sh -c "echo $serial > out/$i-serial" 35*6777b538SAndroid Build Coastguard Worker serial=$(expr $serial + 1) 36*6777b538SAndroid Build Coastguard Workerdone 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Workerecho Generate the keys. 39*6777b538SAndroid Build Coastguard Workertry openssl genrsa -out out/A.key 2048 40*6777b538SAndroid Build Coastguard Workertry openssl genrsa -out out/B.key 2048 41*6777b538SAndroid Build Coastguard Workertry openssl genrsa -out out/C.key 2048 42*6777b538SAndroid Build Coastguard Workertry openssl genrsa -out out/D.key 2048 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Workerecho Generate the D CSR. 45*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="D Root CA" \ 46*6777b538SAndroid Build Coastguard Worker CERTIFICATE=D \ 47*6777b538SAndroid Build Coastguard Worker try openssl req \ 48*6777b538SAndroid Build Coastguard Worker -new \ 49*6777b538SAndroid Build Coastguard Worker -key out/D.key \ 50*6777b538SAndroid Build Coastguard Worker -out out/D.csr \ 51*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Workerecho D signs itself. 54*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="D Root CA" \ 55*6777b538SAndroid Build Coastguard Worker try openssl x509 \ 56*6777b538SAndroid Build Coastguard Worker -req -days 3650 \ 57*6777b538SAndroid Build Coastguard Worker -in out/D.csr \ 58*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 59*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 60*6777b538SAndroid Build Coastguard Worker -signkey out/D.key \ 61*6777b538SAndroid Build Coastguard Worker -out out/D.pem \ 62*6777b538SAndroid Build Coastguard Worker -text 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Workerecho Generate the C2 root CSR. 65*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="C CA" \ 66*6777b538SAndroid Build Coastguard Worker CERTIFICATE=C2 \ 67*6777b538SAndroid Build Coastguard Worker try openssl req \ 68*6777b538SAndroid Build Coastguard Worker -new \ 69*6777b538SAndroid Build Coastguard Worker -key out/C.key \ 70*6777b538SAndroid Build Coastguard Worker -out out/C2.csr \ 71*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Workerecho C2 signs itself. 74*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="C CA" \ 75*6777b538SAndroid Build Coastguard Worker try openssl x509 \ 76*6777b538SAndroid Build Coastguard Worker -req -days 3650 \ 77*6777b538SAndroid Build Coastguard Worker -in out/C2.csr \ 78*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 79*6777b538SAndroid Build Coastguard Worker -extfile redundant-ca.cnf \ 80*6777b538SAndroid Build Coastguard Worker -signkey out/C.key \ 81*6777b538SAndroid Build Coastguard Worker -out out/C2.pem \ 82*6777b538SAndroid Build Coastguard Worker -text 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Workerecho Generate the B and C intermediaries\' CSRs. 85*6777b538SAndroid Build Coastguard Workerfor i in B C 86*6777b538SAndroid Build Coastguard Workerdo 87*6777b538SAndroid Build Coastguard Worker name="$i Intermediate CA" 88*6777b538SAndroid Build Coastguard Worker CA_COMMON_NAME="$i CA" \ 89*6777b538SAndroid Build Coastguard Worker CERTIFICATE=$i \ 90*6777b538SAndroid Build Coastguard Worker try openssl req \ 91*6777b538SAndroid Build Coastguard Worker -new \ 92*6777b538SAndroid Build Coastguard Worker -key out/$i.key \ 93*6777b538SAndroid Build Coastguard Worker -out out/$i.csr \ 94*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf 95*6777b538SAndroid Build Coastguard Workerdone 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Workerecho D signs the C intermediate. 98*6777b538SAndroid Build Coastguard Worker# Make sure the signer's DB file exists. 99*6777b538SAndroid Build Coastguard Workertouch out/D-index.txt 100*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="D Root CA" \ 101*6777b538SAndroid Build Coastguard Worker CERTIFICATE=D \ 102*6777b538SAndroid Build Coastguard Worker try openssl ca \ 103*6777b538SAndroid Build Coastguard Worker -batch \ 104*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 105*6777b538SAndroid Build Coastguard Worker -in out/C.csr \ 106*6777b538SAndroid Build Coastguard Worker -out out/C.pem \ 107*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Workerecho C signs the B intermediate. 110*6777b538SAndroid Build Coastguard Workertouch out/C-index.txt 111*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="C CA" \ 112*6777b538SAndroid Build Coastguard Worker CERTIFICATE=C \ 113*6777b538SAndroid Build Coastguard Worker try openssl ca \ 114*6777b538SAndroid Build Coastguard Worker -batch \ 115*6777b538SAndroid Build Coastguard Worker -extensions ca_cert \ 116*6777b538SAndroid Build Coastguard Worker -in out/B.csr \ 117*6777b538SAndroid Build Coastguard Worker -out out/B.pem \ 118*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Workerecho Generate the A end-entity CSR. 121*6777b538SAndroid Build Coastguard Workertry openssl req \ 122*6777b538SAndroid Build Coastguard Worker -new \ 123*6777b538SAndroid Build Coastguard Worker -key out/A.key \ 124*6777b538SAndroid Build Coastguard Worker -out out/A.csr \ 125*6777b538SAndroid Build Coastguard Worker -config ee.cnf 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Workerecho B signs A. 128*6777b538SAndroid Build Coastguard Workertouch out/B-index.txt 129*6777b538SAndroid Build Coastguard WorkerCA_COMMON_NAME="B CA" \ 130*6777b538SAndroid Build Coastguard Worker CERTIFICATE=B \ 131*6777b538SAndroid Build Coastguard Worker try openssl ca \ 132*6777b538SAndroid Build Coastguard Worker -batch \ 133*6777b538SAndroid Build Coastguard Worker -extensions user_cert \ 134*6777b538SAndroid Build Coastguard Worker -in out/A.csr \ 135*6777b538SAndroid Build Coastguard Worker -out out/A.pem \ 136*6777b538SAndroid Build Coastguard Worker -config redundant-ca.cnf 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker# EmbeddedTestServer only supports PKCS#8 format. 139*6777b538SAndroid Build Coastguard Workertry openssl pkcs8 -topk8 -nocrypt -in out/A.key -out out/A-pkcs8.key 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Workerecho Create redundant-server-chain.pem 142*6777b538SAndroid Build Coastguard Workertry /bin/sh -c "cat out/A-pkcs8.key out/A.pem out/B.pem out/C.pem out/D.pem \ 143*6777b538SAndroid Build Coastguard Worker > ../certificates/redundant-server-chain.pem" 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Workerecho Create redundant-validated-chain.pem 146*6777b538SAndroid Build Coastguard Workertry /bin/sh -c "cat out/A-pkcs8.key out/A.pem out/B.pem out/C2.pem \ 147*6777b538SAndroid Build Coastguard Worker > ../certificates/redundant-validated-chain.pem" 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Workerecho Create redundant-validated-chain-root.pem 150*6777b538SAndroid Build Coastguard Workertry cp out/C2.pem ../certificates/redundant-validated-chain-root.pem 151*6777b538SAndroid Build Coastguard Worker 152