mirror of
https://github.com/nodejs/node.git
synced 2025-05-01 17:03:34 +00:00

PR-URL: https://github.com/nodejs/node/pull/54399 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
755 lines
21 KiB
Markdown
755 lines
21 KiB
Markdown
# HTTPS
|
|
|
|
<!--introduced_in=v0.10.0-->
|
|
|
|
> Stability: 2 - Stable
|
|
|
|
<!-- source_link=lib/https.js -->
|
|
|
|
HTTPS is the HTTP protocol over TLS/SSL. In Node.js this is implemented as a
|
|
separate module.
|
|
|
|
## Determining if crypto support is unavailable
|
|
|
|
It is possible for Node.js to be built without including support for the
|
|
`node:crypto` module. In such cases, attempting to `import` from `https` or
|
|
calling `require('node:https')` will result in an error being thrown.
|
|
|
|
When using CommonJS, the error thrown can be caught using try/catch:
|
|
|
|
```cjs
|
|
let https;
|
|
try {
|
|
https = require('node:https');
|
|
} catch (err) {
|
|
console.error('https support is disabled!');
|
|
}
|
|
```
|
|
|
|
When using the lexical ESM `import` keyword, the error can only be
|
|
caught if a handler for `process.on('uncaughtException')` is registered
|
|
_before_ any attempt to load the module is made (using, for instance,
|
|
a preload module).
|
|
|
|
When using ESM, if there is a chance that the code may be run on a build
|
|
of Node.js where crypto support is not enabled, consider using the
|
|
[`import()`][] function instead of the lexical `import` keyword:
|
|
|
|
```mjs
|
|
let https;
|
|
try {
|
|
https = await import('node:https');
|
|
} catch (err) {
|
|
console.error('https support is disabled!');
|
|
}
|
|
```
|
|
|
|
## Class: `https.Agent`
|
|
|
|
<!-- YAML
|
|
added: v0.4.5
|
|
changes:
|
|
- version: v5.3.0
|
|
pr-url: https://github.com/nodejs/node/pull/4252
|
|
description: support `0` `maxCachedSessions` to disable TLS session caching.
|
|
- version: v2.5.0
|
|
pr-url: https://github.com/nodejs/node/pull/2228
|
|
description: parameter `maxCachedSessions` added to `options` for TLS
|
|
sessions reuse.
|
|
-->
|
|
|
|
An [`Agent`][] object for HTTPS similar to [`http.Agent`][]. See
|
|
[`https.request()`][] for more information.
|
|
|
|
### `new Agent([options])`
|
|
|
|
<!-- YAML
|
|
changes:
|
|
- version: v12.5.0
|
|
pr-url: https://github.com/nodejs/node/pull/28209
|
|
description: do not automatically set servername if the target host was
|
|
specified using an IP address.
|
|
-->
|
|
|
|
* `options` {Object} Set of configurable options to set on the agent.
|
|
Can have the same fields as for [`http.Agent(options)`][], and
|
|
* `maxCachedSessions` {number} maximum number of TLS cached sessions.
|
|
Use `0` to disable TLS session caching. **Default:** `100`.
|
|
* `servername` {string} the value of
|
|
[Server Name Indication extension][sni wiki] to be sent to the server. Use
|
|
empty string `''` to disable sending the extension.
|
|
**Default:** host name of the target server, unless the target server
|
|
is specified using an IP address, in which case the default is `''` (no
|
|
extension).
|
|
|
|
See [`Session Resumption`][] for information about TLS session reuse.
|
|
|
|
#### Event: `'keylog'`
|
|
|
|
<!-- YAML
|
|
added:
|
|
- v13.2.0
|
|
- v12.16.0
|
|
-->
|
|
|
|
* `line` {Buffer} Line of ASCII text, in NSS `SSLKEYLOGFILE` format.
|
|
* `tlsSocket` {tls.TLSSocket} The `tls.TLSSocket` instance on which it was
|
|
generated.
|
|
|
|
The `keylog` event is emitted when key material is generated or received by a
|
|
connection managed by this agent (typically before handshake has completed, but
|
|
not necessarily). This keying material can be stored for debugging, as it
|
|
allows captured TLS traffic to be decrypted. It may be emitted multiple times
|
|
for each socket.
|
|
|
|
A typical use case is to append received lines to a common text file, which is
|
|
later used by software (such as Wireshark) to decrypt the traffic:
|
|
|
|
```js
|
|
// ...
|
|
https.globalAgent.on('keylog', (line, tlsSocket) => {
|
|
fs.appendFileSync('/tmp/ssl-keys.log', line, { mode: 0o600 });
|
|
});
|
|
```
|
|
|
|
## Class: `https.Server`
|
|
|
|
<!-- YAML
|
|
added: v0.3.4
|
|
-->
|
|
|
|
* Extends: {tls.Server}
|
|
|
|
See [`http.Server`][] for more information.
|
|
|
|
### `server.close([callback])`
|
|
|
|
<!-- YAML
|
|
added: v0.1.90
|
|
-->
|
|
|
|
* `callback` {Function}
|
|
* Returns: {https.Server}
|
|
|
|
See [`server.close()`][] in the `node:http` module.
|
|
|
|
### `server[Symbol.asyncDispose]()`
|
|
|
|
<!-- YAML
|
|
added: v20.4.0
|
|
-->
|
|
|
|
> Stability: 1 - Experimental
|
|
|
|
Calls [`server.close()`][httpsServerClose] and returns a promise that
|
|
fulfills when the server has closed.
|
|
|
|
### `server.closeAllConnections()`
|
|
|
|
<!-- YAML
|
|
added: v18.2.0
|
|
-->
|
|
|
|
See [`server.closeAllConnections()`][] in the `node:http` module.
|
|
|
|
### `server.closeIdleConnections()`
|
|
|
|
<!-- YAML
|
|
added: v18.2.0
|
|
-->
|
|
|
|
See [`server.closeIdleConnections()`][] in the `node:http` module.
|
|
|
|
### `server.headersTimeout`
|
|
|
|
<!-- YAML
|
|
added: v11.3.0
|
|
-->
|
|
|
|
* {number} **Default:** `60000`
|
|
|
|
See [`server.headersTimeout`][] in the `node:http` module.
|
|
|
|
### `server.listen()`
|
|
|
|
Starts the HTTPS server listening for encrypted connections.
|
|
This method is identical to [`server.listen()`][] from [`net.Server`][].
|
|
|
|
### `server.maxHeadersCount`
|
|
|
|
* {number} **Default:** `2000`
|
|
|
|
See [`server.maxHeadersCount`][] in the `node:http` module.
|
|
|
|
### `server.requestTimeout`
|
|
|
|
<!-- YAML
|
|
added: v14.11.0
|
|
changes:
|
|
- version: v18.0.0
|
|
pr-url: https://github.com/nodejs/node/pull/41263
|
|
description: The default request timeout changed
|
|
from no timeout to 300s (5 minutes).
|
|
-->
|
|
|
|
* {number} **Default:** `300000`
|
|
|
|
See [`server.requestTimeout`][] in the `node:http` module.
|
|
|
|
### `server.setTimeout([msecs][, callback])`
|
|
|
|
<!-- YAML
|
|
added: v0.11.2
|
|
-->
|
|
|
|
* `msecs` {number} **Default:** `120000` (2 minutes)
|
|
* `callback` {Function}
|
|
* Returns: {https.Server}
|
|
|
|
See [`server.setTimeout()`][] in the `node:http` module.
|
|
|
|
### `server.timeout`
|
|
|
|
<!-- YAML
|
|
added: v0.11.2
|
|
changes:
|
|
- version: v13.0.0
|
|
pr-url: https://github.com/nodejs/node/pull/27558
|
|
description: The default timeout changed from 120s to 0 (no timeout).
|
|
-->
|
|
|
|
* {number} **Default:** 0 (no timeout)
|
|
|
|
See [`server.timeout`][] in the `node:http` module.
|
|
|
|
### `server.keepAliveTimeout`
|
|
|
|
<!-- YAML
|
|
added: v8.0.0
|
|
-->
|
|
|
|
* {number} **Default:** `5000` (5 seconds)
|
|
|
|
See [`server.keepAliveTimeout`][] in the `node:http` module.
|
|
|
|
## `https.createServer([options][, requestListener])`
|
|
|
|
<!-- YAML
|
|
added: v0.3.4
|
|
-->
|
|
|
|
* `options` {Object} Accepts `options` from [`tls.createServer()`][],
|
|
[`tls.createSecureContext()`][] and [`http.createServer()`][].
|
|
* `requestListener` {Function} A listener to be added to the `'request'` event.
|
|
* Returns: {https.Server}
|
|
|
|
```mjs
|
|
// curl -k https://localhost:8000/
|
|
import { createServer } from 'node:https';
|
|
import { readFileSync } from 'node:fs';
|
|
|
|
const options = {
|
|
key: readFileSync('private-key.pem'),
|
|
cert: readFileSync('certificate.pem'),
|
|
};
|
|
|
|
createServer(options, (req, res) => {
|
|
res.writeHead(200);
|
|
res.end('hello world\n');
|
|
}).listen(8000);
|
|
```
|
|
|
|
```cjs
|
|
// curl -k https://localhost:8000/
|
|
const https = require('node:https');
|
|
const fs = require('node:fs');
|
|
|
|
const options = {
|
|
key: fs.readFileSync('private-key.pem'),
|
|
cert: fs.readFileSync('certificate.pem'),
|
|
};
|
|
|
|
https.createServer(options, (req, res) => {
|
|
res.writeHead(200);
|
|
res.end('hello world\n');
|
|
}).listen(8000);
|
|
```
|
|
|
|
Or
|
|
|
|
```mjs
|
|
import { createServer } from 'node:https';
|
|
import { readFileSync } from 'node:fs';
|
|
|
|
const options = {
|
|
pfx: readFileSync('test_cert.pfx'),
|
|
passphrase: 'sample',
|
|
};
|
|
|
|
createServer(options, (req, res) => {
|
|
res.writeHead(200);
|
|
res.end('hello world\n');
|
|
}).listen(8000);
|
|
```
|
|
|
|
```cjs
|
|
const https = require('node:https');
|
|
const fs = require('node:fs');
|
|
|
|
const options = {
|
|
pfx: fs.readFileSync('test_cert.pfx'),
|
|
passphrase: 'sample',
|
|
};
|
|
|
|
https.createServer(options, (req, res) => {
|
|
res.writeHead(200);
|
|
res.end('hello world\n');
|
|
}).listen(8000);
|
|
```
|
|
|
|
To generate the certificate and key for this example, run:
|
|
|
|
```bash
|
|
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
|
|
-keyout private-key.pem -out certificate.pem
|
|
```
|
|
|
|
Then, to generate the `pfx` certificate for this example, run:
|
|
|
|
```bash
|
|
openssl pkcs12 -certpbe AES-256-CBC -export -out test_cert.pfx \
|
|
-inkey private-key.pem -in certificate.pem -passout pass:sample
|
|
```
|
|
|
|
## `https.get(options[, callback])`
|
|
|
|
## `https.get(url[, options][, callback])`
|
|
|
|
<!-- YAML
|
|
added: v0.3.6
|
|
changes:
|
|
- version: v10.9.0
|
|
pr-url: https://github.com/nodejs/node/pull/21616
|
|
description: The `url` parameter can now be passed along with a separate
|
|
`options` object.
|
|
- version: v7.5.0
|
|
pr-url: https://github.com/nodejs/node/pull/10638
|
|
description: The `options` parameter can be a WHATWG `URL` object.
|
|
-->
|
|
|
|
* `url` {string | URL}
|
|
* `options` {Object | string | URL} Accepts the same `options` as
|
|
[`https.request()`][], with the method set to GET by default.
|
|
* `callback` {Function}
|
|
|
|
Like [`http.get()`][] but for HTTPS.
|
|
|
|
`options` can be an object, a string, or a [`URL`][] object. If `options` is a
|
|
string, it is automatically parsed with [`new URL()`][]. If it is a [`URL`][]
|
|
object, it will be automatically converted to an ordinary `options` object.
|
|
|
|
```mjs
|
|
import { get } from 'node:https';
|
|
import process from 'node:process';
|
|
|
|
get('https://encrypted.google.com/', (res) => {
|
|
console.log('statusCode:', res.statusCode);
|
|
console.log('headers:', res.headers);
|
|
|
|
res.on('data', (d) => {
|
|
process.stdout.write(d);
|
|
});
|
|
|
|
}).on('error', (e) => {
|
|
console.error(e);
|
|
});
|
|
```
|
|
|
|
```cjs
|
|
const https = require('node:https');
|
|
|
|
https.get('https://encrypted.google.com/', (res) => {
|
|
console.log('statusCode:', res.statusCode);
|
|
console.log('headers:', res.headers);
|
|
|
|
res.on('data', (d) => {
|
|
process.stdout.write(d);
|
|
});
|
|
|
|
}).on('error', (e) => {
|
|
console.error(e);
|
|
});
|
|
```
|
|
|
|
## `https.globalAgent`
|
|
|
|
<!-- YAML
|
|
added: v0.5.9
|
|
changes:
|
|
- version:
|
|
- v19.0.0
|
|
pr-url: https://github.com/nodejs/node/pull/43522
|
|
description: The agent now uses HTTP Keep-Alive and a 5 second timeout by
|
|
default.
|
|
-->
|
|
|
|
Global instance of [`https.Agent`][] for all HTTPS client requests. Diverges
|
|
from a default [`https.Agent`][] configuration by having `keepAlive` enabled and
|
|
a `timeout` of 5 seconds.
|
|
|
|
## `https.request(options[, callback])`
|
|
|
|
## `https.request(url[, options][, callback])`
|
|
|
|
<!-- YAML
|
|
added: v0.3.6
|
|
changes:
|
|
- version:
|
|
- v22.4.0
|
|
- v20.16.0
|
|
pr-url: https://github.com/nodejs/node/pull/53329
|
|
description: The `clientCertEngine` option depends on custom engine
|
|
support in OpenSSL which is deprecated in OpenSSL 3.
|
|
- version:
|
|
- v16.7.0
|
|
- v14.18.0
|
|
pr-url: https://github.com/nodejs/node/pull/39310
|
|
description: When using a `URL` object parsed username
|
|
and password will now be properly URI decoded.
|
|
- version:
|
|
- v14.1.0
|
|
- v13.14.0
|
|
pr-url: https://github.com/nodejs/node/pull/32786
|
|
description: The `highWaterMark` option is accepted now.
|
|
- version: v10.9.0
|
|
pr-url: https://github.com/nodejs/node/pull/21616
|
|
description: The `url` parameter can now be passed along with a separate
|
|
`options` object.
|
|
- version: v9.3.0
|
|
pr-url: https://github.com/nodejs/node/pull/14903
|
|
description: The `options` parameter can now include `clientCertEngine`.
|
|
- version: v7.5.0
|
|
pr-url: https://github.com/nodejs/node/pull/10638
|
|
description: The `options` parameter can be a WHATWG `URL` object.
|
|
-->
|
|
|
|
* `url` {string | URL}
|
|
* `options` {Object | string | URL} Accepts all `options` from
|
|
[`http.request()`][], with some differences in default values:
|
|
* `protocol` **Default:** `'https:'`
|
|
* `port` **Default:** `443`
|
|
* `agent` **Default:** `https.globalAgent`
|
|
* `callback` {Function}
|
|
* Returns: {http.ClientRequest}
|
|
|
|
Makes a request to a secure web server.
|
|
|
|
The following additional `options` from [`tls.connect()`][] are also accepted:
|
|
`ca`, `cert`, `ciphers`, `clientCertEngine` (deprecated), `crl`, `dhparam`, `ecdhCurve`,
|
|
`honorCipherOrder`, `key`, `passphrase`, `pfx`, `rejectUnauthorized`,
|
|
`secureOptions`, `secureProtocol`, `servername`, `sessionIdContext`,
|
|
`highWaterMark`.
|
|
|
|
`options` can be an object, a string, or a [`URL`][] object. If `options` is a
|
|
string, it is automatically parsed with [`new URL()`][]. If it is a [`URL`][]
|
|
object, it will be automatically converted to an ordinary `options` object.
|
|
|
|
`https.request()` returns an instance of the [`http.ClientRequest`][]
|
|
class. The `ClientRequest` instance is a writable stream. If one needs to
|
|
upload a file with a POST request, then write to the `ClientRequest` object.
|
|
|
|
```mjs
|
|
import { request } from 'node:https';
|
|
import process from 'node:process';
|
|
|
|
const options = {
|
|
hostname: 'encrypted.google.com',
|
|
port: 443,
|
|
path: '/',
|
|
method: 'GET',
|
|
};
|
|
|
|
const req = request(options, (res) => {
|
|
console.log('statusCode:', res.statusCode);
|
|
console.log('headers:', res.headers);
|
|
|
|
res.on('data', (d) => {
|
|
process.stdout.write(d);
|
|
});
|
|
});
|
|
|
|
req.on('error', (e) => {
|
|
console.error(e);
|
|
});
|
|
req.end();
|
|
```
|
|
|
|
```cjs
|
|
const https = require('node:https');
|
|
|
|
const options = {
|
|
hostname: 'encrypted.google.com',
|
|
port: 443,
|
|
path: '/',
|
|
method: 'GET',
|
|
};
|
|
|
|
const req = https.request(options, (res) => {
|
|
console.log('statusCode:', res.statusCode);
|
|
console.log('headers:', res.headers);
|
|
|
|
res.on('data', (d) => {
|
|
process.stdout.write(d);
|
|
});
|
|
});
|
|
|
|
req.on('error', (e) => {
|
|
console.error(e);
|
|
});
|
|
req.end();
|
|
```
|
|
|
|
Example using options from [`tls.connect()`][]:
|
|
|
|
```js
|
|
const options = {
|
|
hostname: 'encrypted.google.com',
|
|
port: 443,
|
|
path: '/',
|
|
method: 'GET',
|
|
key: fs.readFileSync('private-key.pem'),
|
|
cert: fs.readFileSync('certificate.pem'),
|
|
};
|
|
options.agent = new https.Agent(options);
|
|
|
|
const req = https.request(options, (res) => {
|
|
// ...
|
|
});
|
|
```
|
|
|
|
Alternatively, opt out of connection pooling by not using an [`Agent`][].
|
|
|
|
```js
|
|
const options = {
|
|
hostname: 'encrypted.google.com',
|
|
port: 443,
|
|
path: '/',
|
|
method: 'GET',
|
|
key: fs.readFileSync('private-key.pem'),
|
|
cert: fs.readFileSync('certificate.pem'),
|
|
agent: false,
|
|
};
|
|
|
|
const req = https.request(options, (res) => {
|
|
// ...
|
|
});
|
|
```
|
|
|
|
Example using a [`URL`][] as `options`:
|
|
|
|
```js
|
|
const options = new URL('https://abc:xyz@example.com');
|
|
|
|
const req = https.request(options, (res) => {
|
|
// ...
|
|
});
|
|
```
|
|
|
|
Example pinning on certificate fingerprint, or the public key (similar to
|
|
`pin-sha256`):
|
|
|
|
```mjs
|
|
import { checkServerIdentity } from 'node:tls';
|
|
import { Agent, request } from 'node:https';
|
|
import { createHash } from 'node:crypto';
|
|
|
|
function sha256(s) {
|
|
return createHash('sha256').update(s).digest('base64');
|
|
}
|
|
const options = {
|
|
hostname: 'github.com',
|
|
port: 443,
|
|
path: '/',
|
|
method: 'GET',
|
|
checkServerIdentity: function(host, cert) {
|
|
// Make sure the certificate is issued to the host we are connected to
|
|
const err = checkServerIdentity(host, cert);
|
|
if (err) {
|
|
return err;
|
|
}
|
|
|
|
// Pin the public key, similar to HPKP pin-sha256 pinning
|
|
const pubkey256 = 'SIXvRyDmBJSgatgTQRGbInBaAK+hZOQ18UmrSwnDlK8=';
|
|
if (sha256(cert.pubkey) !== pubkey256) {
|
|
const msg = 'Certificate verification error: ' +
|
|
`The public key of '${cert.subject.CN}' ` +
|
|
'does not match our pinned fingerprint';
|
|
return new Error(msg);
|
|
}
|
|
|
|
// Pin the exact certificate, rather than the pub key
|
|
const cert256 = 'FD:6E:9B:0E:F3:98:BC:D9:04:C3:B2:EC:16:7A:7B:' +
|
|
'0F:DA:72:01:C9:03:C5:3A:6A:6A:E5:D0:41:43:63:EF:65';
|
|
if (cert.fingerprint256 !== cert256) {
|
|
const msg = 'Certificate verification error: ' +
|
|
`The certificate of '${cert.subject.CN}' ` +
|
|
'does not match our pinned fingerprint';
|
|
return new Error(msg);
|
|
}
|
|
|
|
// This loop is informational only.
|
|
// Print the certificate and public key fingerprints of all certs in the
|
|
// chain. Its common to pin the public key of the issuer on the public
|
|
// internet, while pinning the public key of the service in sensitive
|
|
// environments.
|
|
let lastprint256;
|
|
do {
|
|
console.log('Subject Common Name:', cert.subject.CN);
|
|
console.log(' Certificate SHA256 fingerprint:', cert.fingerprint256);
|
|
|
|
const hash = createHash('sha256');
|
|
console.log(' Public key ping-sha256:', sha256(cert.pubkey));
|
|
|
|
lastprint256 = cert.fingerprint256;
|
|
cert = cert.issuerCertificate;
|
|
} while (cert.fingerprint256 !== lastprint256);
|
|
|
|
},
|
|
};
|
|
|
|
options.agent = new Agent(options);
|
|
const req = request(options, (res) => {
|
|
console.log('All OK. Server matched our pinned cert or public key');
|
|
console.log('statusCode:', res.statusCode);
|
|
|
|
res.on('data', (d) => {});
|
|
});
|
|
|
|
req.on('error', (e) => {
|
|
console.error(e.message);
|
|
});
|
|
req.end();
|
|
```
|
|
|
|
```cjs
|
|
const tls = require('node:tls');
|
|
const https = require('node:https');
|
|
const crypto = require('node:crypto');
|
|
|
|
function sha256(s) {
|
|
return crypto.createHash('sha256').update(s).digest('base64');
|
|
}
|
|
const options = {
|
|
hostname: 'github.com',
|
|
port: 443,
|
|
path: '/',
|
|
method: 'GET',
|
|
checkServerIdentity: function(host, cert) {
|
|
// Make sure the certificate is issued to the host we are connected to
|
|
const err = tls.checkServerIdentity(host, cert);
|
|
if (err) {
|
|
return err;
|
|
}
|
|
|
|
// Pin the public key, similar to HPKP pin-sha256 pinning
|
|
const pubkey256 = 'SIXvRyDmBJSgatgTQRGbInBaAK+hZOQ18UmrSwnDlK8=';
|
|
if (sha256(cert.pubkey) !== pubkey256) {
|
|
const msg = 'Certificate verification error: ' +
|
|
`The public key of '${cert.subject.CN}' ` +
|
|
'does not match our pinned fingerprint';
|
|
return new Error(msg);
|
|
}
|
|
|
|
// Pin the exact certificate, rather than the pub key
|
|
const cert256 = 'FD:6E:9B:0E:F3:98:BC:D9:04:C3:B2:EC:16:7A:7B:' +
|
|
'0F:DA:72:01:C9:03:C5:3A:6A:6A:E5:D0:41:43:63:EF:65';
|
|
if (cert.fingerprint256 !== cert256) {
|
|
const msg = 'Certificate verification error: ' +
|
|
`The certificate of '${cert.subject.CN}' ` +
|
|
'does not match our pinned fingerprint';
|
|
return new Error(msg);
|
|
}
|
|
|
|
// This loop is informational only.
|
|
// Print the certificate and public key fingerprints of all certs in the
|
|
// chain. Its common to pin the public key of the issuer on the public
|
|
// internet, while pinning the public key of the service in sensitive
|
|
// environments.
|
|
do {
|
|
console.log('Subject Common Name:', cert.subject.CN);
|
|
console.log(' Certificate SHA256 fingerprint:', cert.fingerprint256);
|
|
|
|
hash = crypto.createHash('sha256');
|
|
console.log(' Public key ping-sha256:', sha256(cert.pubkey));
|
|
|
|
lastprint256 = cert.fingerprint256;
|
|
cert = cert.issuerCertificate;
|
|
} while (cert.fingerprint256 !== lastprint256);
|
|
|
|
},
|
|
};
|
|
|
|
options.agent = new https.Agent(options);
|
|
const req = https.request(options, (res) => {
|
|
console.log('All OK. Server matched our pinned cert or public key');
|
|
console.log('statusCode:', res.statusCode);
|
|
|
|
res.on('data', (d) => {});
|
|
});
|
|
|
|
req.on('error', (e) => {
|
|
console.error(e.message);
|
|
});
|
|
req.end();
|
|
```
|
|
|
|
Outputs for example:
|
|
|
|
```text
|
|
Subject Common Name: github.com
|
|
Certificate SHA256 fingerprint: FD:6E:9B:0E:F3:98:BC:D9:04:C3:B2:EC:16:7A:7B:0F:DA:72:01:C9:03:C5:3A:6A:6A:E5:D0:41:43:63:EF:65
|
|
Public key ping-sha256: SIXvRyDmBJSgatgTQRGbInBaAK+hZOQ18UmrSwnDlK8=
|
|
Subject Common Name: Sectigo ECC Domain Validation Secure Server CA
|
|
Certificate SHA256 fingerprint: 61:E9:73:75:E9:F6:DA:98:2F:F5:C1:9E:2F:94:E6:6C:4E:35:B6:83:7C:E3:B9:14:D2:24:5C:7F:5F:65:82:5F
|
|
Public key ping-sha256: Eep0p/AsSa9lFUH6KT2UY+9s1Z8v7voAPkQ4fGknZ2g=
|
|
Subject Common Name: USERTrust ECC Certification Authority
|
|
Certificate SHA256 fingerprint: A6:CF:64:DB:B4:C8:D5:FD:19:CE:48:89:60:68:DB:03:B5:33:A8:D1:33:6C:62:56:A8:7D:00:CB:B3:DE:F3:EA
|
|
Public key ping-sha256: UJM2FOhG9aTNY0Pg4hgqjNzZ/lQBiMGRxPD5Y2/e0bw=
|
|
Subject Common Name: AAA Certificate Services
|
|
Certificate SHA256 fingerprint: D7:A7:A0:FB:5D:7E:27:31:D7:71:E9:48:4E:BC:DE:F7:1D:5F:0C:3E:0A:29:48:78:2B:C8:3E:E0:EA:69:9E:F4
|
|
Public key ping-sha256: vRU+17BDT2iGsXvOi76E7TQMcTLXAqj0+jGPdW7L1vM=
|
|
All OK. Server matched our pinned cert or public key
|
|
statusCode: 200
|
|
```
|
|
|
|
[`Agent`]: #class-httpsagent
|
|
[`Session Resumption`]: tls.md#session-resumption
|
|
[`URL`]: url.md#the-whatwg-url-api
|
|
[`http.Agent(options)`]: http.md#new-agentoptions
|
|
[`http.Agent`]: http.md#class-httpagent
|
|
[`http.ClientRequest`]: http.md#class-httpclientrequest
|
|
[`http.Server`]: http.md#class-httpserver
|
|
[`http.createServer()`]: http.md#httpcreateserveroptions-requestlistener
|
|
[`http.get()`]: http.md#httpgetoptions-callback
|
|
[`http.request()`]: http.md#httprequestoptions-callback
|
|
[`https.Agent`]: #class-httpsagent
|
|
[`https.request()`]: #httpsrequestoptions-callback
|
|
[`import()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import
|
|
[`net.Server`]: net.md#class-netserver
|
|
[`new URL()`]: url.md#new-urlinput-base
|
|
[`server.close()`]: http.md#serverclosecallback
|
|
[`server.closeAllConnections()`]: http.md#servercloseallconnections
|
|
[`server.closeIdleConnections()`]: http.md#servercloseidleconnections
|
|
[`server.headersTimeout`]: http.md#serverheaderstimeout
|
|
[`server.keepAliveTimeout`]: http.md#serverkeepalivetimeout
|
|
[`server.listen()`]: net.md#serverlisten
|
|
[`server.maxHeadersCount`]: http.md#servermaxheaderscount
|
|
[`server.requestTimeout`]: http.md#serverrequesttimeout
|
|
[`server.setTimeout()`]: http.md#serversettimeoutmsecs-callback
|
|
[`server.timeout`]: http.md#servertimeout
|
|
[`tls.connect()`]: tls.md#tlsconnectoptions-callback
|
|
[`tls.createSecureContext()`]: tls.md#tlscreatesecurecontextoptions
|
|
[`tls.createServer()`]: tls.md#tlscreateserveroptions-secureconnectionlistener
|
|
[httpsServerClose]: #serverclosecallback
|
|
[sni wiki]: https://en.wikipedia.org/wiki/Server_Name_Indication
|