@@ -64,3 +64,156 @@ rm -fv crldir/*
6464cp -v client-cert.crl crldir/` openssl x509 -in client-cert.pem -noout -issuer_hash` .r0
6565
6666rm -rf demoCA
67+
68+ # --- Certificate Chain ---
69+ # These tests are inspired from the following commit from MySQL Server
70+ # https://github.com/mysql/mysql-server/commit/969afef933f1872c5f38ea93047ef05c4509c335
71+ #
72+ # Credits to salman.s.khan@oracle.com
73+ #
74+ # -------------------------------------------------------------------------------------
75+ #
76+ # STEPS TO GENERATE THE FOLLOWING CHAINED CERTIFICATES WHICH IS USED IN THE TEST CASE :
77+ #
78+ # +---------+
79+ # | Root CA |
80+ # +---------+
81+ # |
82+ # /------------+-----------\
83+ # | |
84+ # +------------------+ +------------------+
85+ # | Intermediate CA1 | | Intermediate CA2 |
86+ # +------------------+ +------------------+
87+ # | |
88+ # +-------------+ +-------------+
89+ # | Server | | Client |
90+ # | certificate | | certificate |
91+ # +-------------+ +-------------+
92+
93+ cd cachain
94+
95+ mkdir ca
96+ mkdir server
97+ mkdir clients
98+
99+ mkdir ca/root.certs
100+ touch ca/root.index.txt
101+ touch ca/root.index.txt.attr
102+ echo ' 01' > ca/root.serial
103+
104+ cat > ca/root.cfg << EOF
105+ [ ca ]
106+ default_ca = CA_default
107+ [ CA_default ]
108+ dir = $PWD /ca
109+ certs = \$ dir/certs
110+ database = \$ dir/root.index.txt
111+ serial = \$ dir/root.serial
112+ policy= policy_match
113+ [ policy_match ]
114+ organizationName = match
115+ organizationalUnitName = optional
116+ commonName = supplied
117+ emailAddress = optional
118+ [ v3_ca ]
119+ subjectKeyIdentifier=hash
120+ authorityKeyIdentifier=keyid:always,issuer
121+ basicConstraints = critical,CA:TRUE
122+ keyUsage = critical,keyCertSign,cRLSign
123+ [ v3_ca_intermediate ]
124+ subjectKeyIdentifier=hash
125+ authorityKeyIdentifier=keyid:always,issuer
126+ basicConstraints = critical,CA:TRUE,pathlen:0
127+ keyUsage = critical,keyCertSign,cRLSign
128+ EOF
129+
130+ # Generate Root CA key and cert
131+ openssl genrsa -out ca/root.key 4096
132+ openssl req -new -x509 ' -sha256' -key ca/root.key -out ca/root.crt -days 7200 -subj " /O=MariaDB/OU=MariaDB/CN=Root CA" -config ca/root.cfg -extensions v3_ca
133+
134+ # Generate Intermediate CA1 key and cert
135+ openssl genrsa -out ca/intermediate_ca1.key 4096
136+ openssl req -new ' -sha256' -key ca/intermediate_ca1.key -out ca/intermediate_ca1.csr -subj " /O=MariaDB/OU=MariaDB/CN=Intermediate CA1"
137+
138+ openssl ca -batch -days 7200 -notext -md sha256 -in ca/intermediate_ca1.csr -out ca/intermediate_ca1.crt -keyfile ca/root.key -cert ca/root.crt -outdir ca/root.certs/ -config ca/root.cfg -extensions v3_ca_intermediate
139+
140+ mkdir ca/intermediate_ca1.certs
141+ touch ca/intermediate_ca1.index.txt
142+ touch ca/intermediate_ca1.index.txt.attr
143+ echo ' 01' > ca/intermediate_ca1.serial
144+
145+ cat > ca/intermediate_ca1.cfg << EOF
146+ [ ca ]
147+ default_ca = CA_default
148+ [ CA_default ]
149+ dir = $PWD /ca
150+ certs = \$ dir/intermediate_ca1.certs
151+ database = \$ dir/intermediate_ca1.index.txt
152+ serial = \$ dir/intermediate_ca1.serial
153+ policy= policy_match
154+ [ policy_match ]
155+ commonName = supplied
156+ [ alt_names ]
157+ DNS.1 = localhost
158+ IP.1 = 127.0.0.1
159+ [ server_cert ]
160+ basicConstraints = CA:FALSE
161+ keyUsage = critical,digitalSignature,keyEncipherment
162+ extendedKeyUsage = serverAuth
163+ subjectAltName = @alt_names
164+ EOF
165+
166+ # Generate Server key and cert
167+ openssl genrsa -out server/server.key 4096
168+ openssl req -new ' -sha256' -key server/server.key -out server/server.csr -subj " /CN=localhost"
169+
170+ openssl ca -batch -days 7200 -notext -md sha256 -in server/server.csr -out server/server.crt -keyfile ca/intermediate_ca1.key -cert ca/intermediate_ca1.crt -outdir ca/intermediate_ca1.certs/ -config ca/intermediate_ca1.cfg -extensions server_cert
171+
172+ # Generate Intermediate CA2 key and cert
173+ openssl genrsa -out ca/intermediate_ca2.key 4096
174+
175+ openssl req -new ' -sha256' -key ca/intermediate_ca2.key -out ca/intermediate_ca2.csr -subj " /O=MariaDB/OU=MariaDB/CN=Intermediate CA2"
176+ openssl ca -batch -days 7200 -notext -md sha256 -in ca/intermediate_ca2.csr -out ca/intermediate_ca2.crt -keyfile ca/root.key -cert ca/root.crt -outdir ca/root.certs/ -config ca/root.cfg -extensions v3_ca_intermediate
177+
178+ mkdir ca/intermediate_ca2.certs
179+ touch ca/intermediate_ca2.index.txt
180+ touch ca/intermediate_ca2.index.txt.attr
181+ echo ' 01' > ca/intermediate_ca2.serial
182+
183+ cat > ca/intermediate_ca2.cfg << EOF
184+ [ ca ]
185+ default_ca = CA_default
186+ [ CA_default ]
187+ dir = $PWD /ca
188+ certs = \$ dir/intermediate_ca2.certs
189+ database = \$ dir/intermediate_ca2.index.txt
190+ serial = \$ dir/intermediate_ca2.serial
191+ policy= policy_match
192+ [ policy_match ]
193+ commonName = supplied
194+ [ client_cert ]
195+ basicConstraints = CA:FALSE
196+ keyUsage = critical,digitalSignature,keyEncipherment
197+ extendedKeyUsage = clientAuth
198+ EOF
199+
200+ # Generate Client key and cert
201+ openssl genrsa -out clients/client.key 4096
202+ openssl req -new ' -sha256' -key clients/client.key -out clients/client.csr -subj " /CN=client"
203+
204+ openssl ca -batch -days 7200 -notext -md sha256 -in clients/client.csr -out clients/client.crt -keyfile ca/intermediate_ca2.key -cert ca/intermediate_ca2.crt -outdir ca/intermediate_ca2.certs/ -config ca/intermediate_ca2.cfg -extensions client_cert
205+
206+ cat server/server.crt ca/intermediate_ca1.crt > server/server.cachain
207+
208+ cat clients/client.crt ca/intermediate_ca2.crt > clients/client.cachain
209+
210+ cat ca/root.crt ca/intermediate_ca1.crt > ca/root_intermediate_ca1.crt
211+
212+ # Generate Unrelated Root CA key and cert
213+ openssl genrsa -out ca/unrelated_root.key 4096
214+ openssl req -new -x509 ' -sha256' -key ca/unrelated_root.key -out ca/unrelated_root.crt -days 7200 -subj " /O=MariaDB/OU=MariaDB/CN=Root CA" -config ca/root.cfg -extensions v3_ca
215+
216+ cp -v ca/root.crt ca/root_intermediate_ca1.crt ca/unrelated_root.crt server/server.key server/server.cachain clients/client.key clients/client.cachain ./
217+ rm -rf ca server clients
218+
219+ cd ..
0 commit comments