| #!/bin/sh |
| |
| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # This script generates two chains of test certificates: |
| # |
| # 1. A (end-entity) -> B -> C -> D (self-signed root) |
| # 2. A (end-entity) -> B -> C2 -> E (self-signed root) |
| # |
| # C and C2 have the same subject and keypair. |
| # |
| # We use these cert chains in CertVerifyProcChromeOSTest |
| # to ensure that multiple verification paths are properly handled. |
| |
| try () { |
| echo "$@" |
| "$@" || exit 1 |
| } |
| |
| try rm -rf out |
| try mkdir out |
| |
| echo Create the serial number files. |
| serial=1000 |
| for i in B C C2 D E |
| do |
| try /bin/sh -c "echo $serial > out/$i-serial" |
| serial=$(expr $serial + 1) |
| done |
| |
| echo Generate the keys. |
| try openssl genrsa -out out/A.key 2048 |
| try openssl genrsa -out out/B.key 2048 |
| try openssl genrsa -out out/C.key 2048 |
| try openssl genrsa -out out/D.key 2048 |
| try openssl genrsa -out out/E.key 2048 |
| |
| echo Generate the D CSR. |
| CA_COMMON_NAME="D Root CA" \ |
| CERTIFICATE=D \ |
| try openssl req \ |
| -new \ |
| -key out/D.key \ |
| -out out/D.csr \ |
| -config redundant-ca.cnf |
| |
| echo D signs itself. |
| CA_COMMON_NAME="D Root CA" \ |
| try openssl x509 \ |
| -req -days 3650 \ |
| -in out/D.csr \ |
| -extensions ca_cert \ |
| -extfile redundant-ca.cnf \ |
| -signkey out/D.key \ |
| -out out/D.pem \ |
| -text |
| |
| echo Generate the E CSR. |
| CA_COMMON_NAME="E Root CA" \ |
| CERTIFICATE=E \ |
| try openssl req \ |
| -new \ |
| -key out/E.key \ |
| -out out/E.csr \ |
| -config redundant-ca.cnf |
| |
| echo E signs itself. |
| CA_COMMON_NAME="E Root CA" \ |
| try openssl x509 \ |
| -req -days 3650 \ |
| -in out/E.csr \ |
| -extensions ca_cert \ |
| -extfile redundant-ca.cnf \ |
| -signkey out/E.key \ |
| -out out/E.pem \ |
| -text |
| |
| echo Generate the C2 intermediary CSR. |
| CA_COMMON_NAME="C CA" \ |
| CERTIFICATE=C2 \ |
| try openssl req \ |
| -new \ |
| -key out/C.key \ |
| -out out/C2.csr \ |
| -config redundant-ca.cnf |
| |
| echo Generate the B and C intermediaries\' CSRs. |
| for i in B C |
| do |
| CA_COMMON_NAME="$i CA" \ |
| CERTIFICATE="$i" \ |
| try openssl req \ |
| -new \ |
| -key "out/$i.key" \ |
| -out "out/$i.csr" \ |
| -config redundant-ca.cnf |
| done |
| |
| echo D signs the C intermediate. |
| # Make sure the signer's DB file exists. |
| touch out/D-index.txt |
| CA_COMMON_NAME="D Root CA" \ |
| CERTIFICATE=D \ |
| try openssl ca \ |
| -batch \ |
| -extensions ca_cert \ |
| -in out/C.csr \ |
| -out out/C.pem \ |
| -config redundant-ca.cnf |
| |
| echo E signs the C2 intermediate. |
| # Make sure the signer's DB file exists. |
| touch out/E-index.txt |
| CA_COMMON_NAME="E Root CA" \ |
| CERTIFICATE=E \ |
| try openssl ca \ |
| -batch \ |
| -extensions ca_cert \ |
| -in out/C2.csr \ |
| -out out/C2.pem \ |
| -config redundant-ca.cnf |
| |
| echo C signs the B intermediate. |
| touch out/C-index.txt |
| CA_COMMON_NAME="C CA" \ |
| CERTIFICATE=C \ |
| try openssl ca \ |
| -batch \ |
| -extensions ca_cert \ |
| -in out/B.csr \ |
| -out out/B.pem \ |
| -config redundant-ca.cnf |
| |
| echo Generate the A end-entity CSR. |
| try openssl req \ |
| -new \ |
| -key out/A.key \ |
| -out out/A.csr \ |
| -config ee.cnf |
| |
| echo B signs A. |
| touch out/B-index.txt |
| CA_COMMON_NAME="B CA" \ |
| CERTIFICATE=B \ |
| try openssl ca \ |
| -batch \ |
| -extensions user_cert \ |
| -in out/A.csr \ |
| -out out/A.pem \ |
| -config redundant-ca.cnf |
| |
| echo Create multi-root-chain1.pem |
| try /bin/sh -c "cat out/A.key out/A.pem out/B.pem out/C.pem out/D.pem \ |
| > ../certificates/multi-root-chain1.pem" |
| |
| echo Create multi-root-chain2.pem |
| try /bin/sh -c "cat out/A.key out/A.pem out/B.pem out/C2.pem out/E.pem \ |
| > ../certificates/multi-root-chain2.pem" |
| |