• url {string | URL}
    • options {Object | string | URL} 接受来自 [http.request()] 的所有 options,但默认值有一些差异:
      • protocol 默认值: 'https:'
      • port 默认值: 443
      • agent 默认值: https.globalAgent
    • callback {Function}

    发送一个请求到一个加密的 Web 服务器。

    以下来自 [tls.connect()] 的额外的 options 也会被接收: cacertciphersclientCertEnginecrldhparamecdhCurvehonorCipherOrderkeypassphrasepfxrejectUnauthorizedsecureOptionssecureProtocolservernamesessionIdContexthighWaterMark

    options 可以是对象、字符串、或 [URL] 对象。 如果 options 是一个字符串, 则会被自动地使用 [new URL()] 解析。 如果是一个 [URL] 对象,则会被自动地转换为一个普通的 options 对象。

    1. const https = require('https');
    2. const options = {
    3. hostname: 'encrypted.google.com',
    4. port: 443,
    5. path: '/',
    6. method: 'GET'
    7. };
    8. const req = https.request(options, (res) => {
    9. console.log('状态码:', res.statusCode);
    10. console.log('请求头:', res.headers);
    11. res.on('data', (d) => {
    12. process.stdout.write(d);
    13. });
    14. });
    15. req.on('error', (e) => {
    16. console.error(e);
    17. });
    18. req.end();

    使用 [tls.connect()] 的选项的示例:

    1. const options = {
    2. hostname: 'encrypted.google.com',
    3. port: 443,
    4. path: '/',
    5. method: 'GET',
    6. key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
    7. cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
    8. };
    9. options.agent = new https.Agent(options);
    10. const req = https.request(options, (res) => {
    11. // ...
    12. });

    或者,不使用 [Agent] 而选择退出连接池。

    1. const options = {
    2. hostname: 'encrypted.google.com',
    3. port: 443,
    4. path: '/',
    5. method: 'GET',
    6. key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
    7. cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
    8. agent: false
    9. };
    10. const req = https.request(options, (res) => {
    11. // ...
    12. });

    使用 [URL] 作为 options 的示例:

    1. const options = new URL('https://abc:xyz@example.com');
    2. const req = https.request(options, (res) => {
    3. // ...
    4. });

    固定证书指纹或公钥(类似于 pin-sha256)的示例:

    1. const tls = require('tls');
    2. const https = require('https');
    3. const crypto = require('crypto');
    4. function sha256(s) {
    5. return crypto.createHash('sha256').update(s).digest('base64');
    6. }
    7. const options = {
    8. hostname: 'github.com',
    9. port: 443,
    10. path: '/',
    11. method: 'GET',
    12. checkServerIdentity: function(host, cert) {
    13. // 确保将证书颁发给所连接的主机。
    14. const err = tls.checkServerIdentity(host, cert);
    15. if (err) {
    16. return err;
    17. }
    18. // 固定公钥,类似于固定的 HPKP pin-sha25。
    19. const pubkey256 = 'pL1+qb9HTMRZJmuC/bB/ZI9d302BYrrqiVuRyW+DGrU=';
    20. if (sha256(cert.pubkey) !== pubkey256) {
    21. const msg = '证书验证错误: ' +
    22. `'${cert.subject.CN}' 的公钥` +
    23. '与固定的指纹不符';
    24. return new Error(msg);
    25. }
    26. // 固定确切的证书,而不是公钥。
    27. const cert256 = '25:FE:39:32:D9:63:8C:8A:FC:A1:9A:29:87:' +
    28. 'D8:3E:4C:1D:98:DB:71:E4:1A:48:03:98:EA:22:6A:BD:8B:93:16';
    29. if (cert.fingerprint256 !== cert256) {
    30. const msg = '证书验证错误: ' +
    31. `'${cert.subject.CN}' 的证书` +
    32. '与固定的指纹不符';
    33. return new Error(msg);
    34. }
    35. // 此循环仅供参考。
    36. // 打印链条中所有证书的证书与公钥指纹。
    37. // 通常,将发行人的公钥固定在公共互联网上,同时将服务的公钥固定在私密的环境中。
    38. do {
    39. console.log('主体的常用名称:', cert.subject.CN);
    40. console.log(' 证书的 SHA256 指纹:', cert.fingerprint256);
    41. hash = crypto.createHash('sha256');
    42. console.log(' 公钥的 ping-sha256:', sha256(cert.pubkey));
    43. lastprint256 = cert.fingerprint256;
    44. cert = cert.issuerCertificate;
    45. } while (cert.fingerprint256 !== lastprint256);
    46. },
    47. };
    48. options.agent = new https.Agent(options);
    49. const req = https.request(options, (res) => {
    50. console.log('一切正常。服务器与固定的证书或公钥相匹配。');
    51. console.log('状态码:', res.statusCode);
    52. // 打印 HPKP 的值。
    53. console.log('请求头:', res.headers['public-key-pins']);
    54. res.on('data', (d) => {});
    55. });
    56. req.on('error', (e) => {
    57. console.error(e.message);
    58. });
    59. req.end();

    示例的输出:

    1. 主体的常用名称: github.com
    2. 证书的 SHA256 指纹: 25:FE:39:32:D9:63:8C:8A:FC:A1:9A:29:87:D8:3E:4C:1D:98:DB:71:E4:1A:48:03:98:EA:22:6A:BD:8B:93:16
    3. 公钥的 ping-sha256: pL1+qb9HTMRZJmuC/bB/ZI9d302BYrrqiVuRyW+DGrU=
    4. 主体的常用名称: DigiCert SHA2 Extended Validation Server CA
    5. 证书的 SHA256 指纹: 40:3E:06:2A:26:53:05:91:13:28:5B:AF:80:A0:D4:AE:42:2C:84:8C:9F:78:FA:D0:1F:C9:4B:C5:B8:7F:EF:1A
    6. 公钥的 ping-sha256: RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho=
    7. 主体的常用名称: DigiCert High Assurance EV Root CA
    8. 证书的 SHA256 指纹: 74:31:E5:F4:C3:C1:CE:46:90:77:4F:0B:61:E0:54:40:88:3B:A9:A0:1E:D0:0B:A6:AB:D7:80:6E:D3:B1:18:CF
    9. 公钥的 ping-sha256: WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=
    10. 一切正常。服务器与固定的证书或公钥相匹配。
    11. 状态码: 200
    12. 请求头: max-age=0; pin-sha256="WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18="; pin-sha256="RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho="; pin-sha256="k2v657xBsOVe1PQRwOsHsw3bsGT2VzIqz5K+59sNQws="; pin-sha256="K87oWBWM9UZfyddvDfoxL+8lpNyoUB2ptGtn0fv6G2Q="; pin-sha256="IQBnNBEiFuhj+8x6X8XLgh01V9Ic5/V3IRQLNFFc7v4="; pin-sha256="iie1VXtL7HzAMF+/PVPR9xzT80kQxdZeJ+zduCB3uj0="; pin-sha256="LvRiGEjRqfzurezaWuj8Wie2gyHMrW5Q06LspMnox7A="; includeSubDomains