Skip to content

Commit 13c5d8e

Browse files
committed
tls: add "ca" property to certificate object
The objects returned by getPeerCertificate() now have an additional "ca" boolean property that indicates whether the certificate is a Certificate Authority certificate or not. Fixes: #44905
1 parent 87d2ca9 commit 13c5d8e

File tree

4 files changed

+12
-1
lines changed

4 files changed

+12
-1
lines changed

doc/api/tls.md

+4
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,9 @@ certificate.
11731173

11741174
<!-- YAML
11751175
changes:
1176+
- version: REPLACEME
1177+
pr-url: https://github.com/nodejs/node/pull/12345
1178+
description: Add "ca" property.
11761179
- version:
11771180
- v17.2.0
11781181
- v16.14.0
@@ -1186,6 +1189,7 @@ changes:
11861189
A certificate object has properties corresponding to the fields of the
11871190
certificate.
11881191

1192+
* `ca` {boolean} `true` if a Certificate Authority (CA), `false` otherwise.
11891193
* `raw` {Buffer} The DER encoded X.509 certificate data.
11901194
* `subject` {Object} The certificate subject, described in terms of
11911195
Country (`C`), StateOrProvince (`ST`), Locality (`L`), Organization (`O`),

src/crypto/crypto_common.cc

+5-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ namespace node {
2727
using v8::Array;
2828
using v8::ArrayBuffer;
2929
using v8::BackingStore;
30+
using v8::Boolean;
3031
using v8::Context;
3132
using v8::EscapableHandleScope;
3233
using v8::Integer;
@@ -1266,6 +1267,8 @@ MaybeLocal<Object> X509ToObject(
12661267
BIOPointer bio(BIO_new(BIO_s_mem()));
12671268
CHECK(bio);
12681269

1270+
// X509_check_ca() returns a range of values. Only 1 means "is a CA"
1271+
auto is_ca = Boolean::New(env->isolate(), 1 == X509_check_ca(cert));
12691272
if (!Set<Value>(context,
12701273
info,
12711274
env->subject_string(),
@@ -1281,7 +1284,8 @@ MaybeLocal<Object> X509ToObject(
12811284
!Set<Value>(context,
12821285
info,
12831286
env->infoaccess_string(),
1284-
GetInfoAccessString(env, bio, cert))) {
1287+
GetInfoAccessString(env, bio, cert)) ||
1288+
!Set<Boolean>(context, info, env->ca_string(), is_ca)) {
12851289
return MaybeLocal<Object>();
12861290
}
12871291

src/env_properties.h

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
V(bytes_parsed_string, "bytesParsed") \
6060
V(bytes_read_string, "bytesRead") \
6161
V(bytes_written_string, "bytesWritten") \
62+
V(ca_string, "ca") \
6263
V(cached_data_produced_string, "cachedDataProduced") \
6364
V(cached_data_rejected_string, "cachedDataRejected") \
6465
V(cached_data_string, "cachedData") \

test/parallel/test-tls-peer-certificate.js

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ connect({
5252
debug('peerCert:\n', peerCert);
5353

5454
assert.ok(peerCert.issuerCertificate);
55+
assert.strictEqual(peerCert.ca, false);
56+
assert.strictEqual(peerCert.issuerCertificate.ca, true);
5557
assert.strictEqual(peerCert.subject.emailAddress, '[email protected]');
5658
assert.strictEqual(peerCert.serialNumber, '147D36C1C2F74206DE9FAB5F2226D78ADB00A426');
5759
assert.strictEqual(peerCert.exponent, '0x10001');

0 commit comments

Comments
 (0)