Skip to content

Commit d2bd543

Browse files
Merge pull request #18713 from enj/enj/i/serial_file_start
Automatic merge from submit-queue. Guarantee that SerialFileGenerator starts at 2 This changes makes it so that SerialFileGenerator never returns a value less than 2 for a call to Next. This guarantees that certificates generated using it do not have a serial number that conflicts with the CA's serial number of 1. This behavior was lost in 266aa46. Signed-off-by: Monis Khan <[email protected]> /kind bug /assign @liggitt Supersedes #18710 @openshift/sig-security
2 parents 6639410 + 95e2620 commit d2bd543

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

pkg/cmd/server/crypto/crypto.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,10 +327,22 @@ func NewSerialFileGenerator(serialFile string) (*SerialFileGenerator, error) {
327327
return nil, err
328328
}
329329

330-
return &SerialFileGenerator{
330+
generator := &SerialFileGenerator{
331331
Serial: serial,
332332
SerialFile: serialFile,
333-
}, nil
333+
}
334+
335+
// 0 is unused and 1 is reserved for the CA itself
336+
// Thus we need to guarantee that the first external call to SerialFileGenerator.Next returns 2+
337+
// meaning that SerialFileGenerator.Serial must not be less than 1 (it is guaranteed to be non-negative)
338+
if generator.Serial < 1 {
339+
// fake a call to Next so the file stays in sync and Serial is incremented
340+
if _, err := generator.Next(&x509.Certificate{}); err != nil {
341+
return nil, err
342+
}
343+
}
344+
345+
return generator, nil
334346
}
335347

336348
// Next returns a unique, monotonically increasing serial number and ensures the CA on disk records that value.

test/cmd/certs.sh

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ os::cmd::expect_success_and_not_text \
1818
--overwrite=true" \
1919
'WARNING: .* is greater than 5 years'
2020

21-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '00'
21+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '01'
2222
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
2323

2424
expected_year="$(TZ=GMT date -d "+$((365*5)) days" +'%Y')"
@@ -38,7 +38,7 @@ os::cmd::expect_success \
3838
--signer-key='${CERT_DIR}/ca.key' \
3939
--signer-serial='${CERT_DIR}/ca.serial.txt'"
4040

41-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '01'
41+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '02'
4242
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
4343

4444
# oc adm ca create-signer-cert should generate certificate with specified number of days and show warning
@@ -50,7 +50,7 @@ os::cmd::expect_success_and_text \
5050
--expire-days=$((365*6))" \
5151
'WARNING: .* is greater than 5 years'
5252

53-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '00'
53+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '01'
5454
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
5555

5656
expected_year="$(TZ=GMT date -d "+$((365*6)) days" +'%Y')"
@@ -78,7 +78,7 @@ os::cmd::expect_success_and_not_text \
7878
--signer-serial='${CERT_DIR}/ca.serial.txt'" \
7979
'WARNING: .* is greater than 2 years'
8080

81-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '02'
81+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '03'
8282
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
8383

8484
expected_year="$(TZ=GMT date -d "+$((365*2)) days" +'%Y')"
@@ -107,7 +107,7 @@ os::cmd::expect_success_and_text \
107107
--expire-days=$((365*3))" \
108108
'WARNING: .* is greater than 2 years'
109109

110-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '04'
110+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '05'
111111
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
112112

113113
expected_year="$(TZ=GMT date -d "+$((365*3)) days" +'%Y')"
@@ -133,7 +133,7 @@ os::cmd::expect_success_and_not_text \
133133
'WARNING: .* is greater than 2 years'
134134

135135

136-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '05'
136+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '06'
137137
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
138138

139139
expected_year="$(TZ=GMT date -d "+$((365*2)) days" +'%Y')"
@@ -155,7 +155,7 @@ os::cmd::expect_success_and_text \
155155
--expire-days=$((365*3))" \
156156
'WARNING: .* is greater than 2 years'
157157

158-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '06'
158+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '07'
159159
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
160160

161161
expected_year="$(TZ=GMT date -d "+$((365*3)) days" +'%Y')"
@@ -176,7 +176,7 @@ os::cmd::expect_success_and_not_text \
176176
--key='${CERT_DIR}/example.org.key'" \
177177
'WARNING: .* is greater than 2 years'
178178

179-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '07'
179+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '08'
180180
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
181181

182182
expected_year="$(TZ=GMT date -d "+$((365*2)) days" +'%Y')"
@@ -197,7 +197,7 @@ os::cmd::expect_success_and_text \
197197
--expire-days=$((365*3))" \
198198
'WARNING: .* is greater than 2 years'
199199

200-
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '08'
200+
os::cmd::expect_success_and_text "cat '${CERT_DIR}/ca.serial.txt'" '09'
201201
os::cmd::expect_success_and_text "tail -c 1 '${CERT_DIR}/ca.serial.txt' | wc -l" '1' # check for newline at end
202202

203203
expected_year="$(TZ=GMT date -d "+$((365*3)) days" +'%Y')"

0 commit comments

Comments
 (0)