Skip to content

Commit 08970b3

Browse files
davidbenBoringssl LUCI CQ
authored and
Boringssl LUCI CQ
committed
Include the EKU extension in bssl server's self-signed certs.
macOS requires an explicit EKU extension. This fixes connection failing with ERR_CERT_INVALID in Chrome (when the built-in verifier isn't enabled). https://support.apple.com/en-us/HT210176 Change-Id: Ida23391107fe0168a854c1f4ea3ac52db670e7e8 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/51525 Commit-Queue: David Benjamin <[email protected]> Reviewed-by: Adam Langley <[email protected]> Commit-Queue: Adam Langley <[email protected]>
1 parent 0da6b48 commit 08970b3

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

tool/server.cc

+30-14
Original file line numberDiff line numberDiff line change
@@ -132,21 +132,37 @@ static bssl::UniquePtr<EVP_PKEY> MakeKeyPairForSelfSignedCert() {
132132

133133
static bssl::UniquePtr<X509> MakeSelfSignedCert(EVP_PKEY *evp_pkey,
134134
const int valid_days) {
135+
uint64_t serial;
135136
bssl::UniquePtr<X509> x509(X509_new());
136-
uint32_t serial;
137-
RAND_bytes(reinterpret_cast<uint8_t*>(&serial), sizeof(serial));
138-
ASN1_INTEGER_set(X509_get_serialNumber(x509.get()), serial >> 1);
139-
X509_gmtime_adj(X509_get_notBefore(x509.get()), 0);
140-
X509_gmtime_adj(X509_get_notAfter(x509.get()), 60 * 60 * 24 * valid_days);
141-
142-
X509_NAME* subject = X509_get_subject_name(x509.get());
143-
X509_NAME_add_entry_by_txt(subject, "C", MBSTRING_ASC,
144-
reinterpret_cast<const uint8_t *>("US"), -1, -1,
145-
0);
146-
X509_NAME_add_entry_by_txt(subject, "O", MBSTRING_ASC,
147-
reinterpret_cast<const uint8_t *>("BoringSSL"), -1,
148-
-1, 0);
149-
X509_set_issuer_name(x509.get(), subject);
137+
if (!x509 || //
138+
!X509_set_version(x509.get(), X509_VERSION_3) ||
139+
!RAND_bytes(reinterpret_cast<uint8_t *>(&serial), sizeof(serial)) ||
140+
!ASN1_INTEGER_set_uint64(X509_get_serialNumber(x509.get()), serial) ||
141+
!X509_gmtime_adj(X509_get_notBefore(x509.get()), 0) ||
142+
!X509_gmtime_adj(X509_get_notAfter(x509.get()),
143+
60 * 60 * 24 * valid_days)) {
144+
return nullptr;
145+
}
146+
147+
X509_NAME *subject = X509_get_subject_name(x509.get());
148+
if (!X509_NAME_add_entry_by_txt(subject, "C", MBSTRING_ASC,
149+
reinterpret_cast<const uint8_t *>("US"), -1,
150+
-1, 0) ||
151+
!X509_NAME_add_entry_by_txt(
152+
subject, "O", MBSTRING_ASC,
153+
reinterpret_cast<const uint8_t *>("BoringSSL"), -1, -1, 0) ||
154+
!X509_set_issuer_name(x509.get(), subject)) {
155+
return nullptr;
156+
}
157+
158+
// macOS requires an explicit EKU extension.
159+
bssl::UniquePtr<STACK_OF(ASN1_OBJECT)> ekus(sk_ASN1_OBJECT_new_null());
160+
if (!ekus ||
161+
!sk_ASN1_OBJECT_push(ekus.get(), OBJ_nid2obj(NID_server_auth)) ||
162+
!X509_add1_ext_i2d(x509.get(), NID_ext_key_usage, ekus.get(), /*crit=*/1,
163+
/*flags=*/0)) {
164+
return nullptr;
165+
}
150166

151167
if (!X509_set_pubkey(x509.get(), evp_pkey)) {
152168
fprintf(stderr, "Failed to set public key.\n");

0 commit comments

Comments
 (0)