【推荐阅读】在PayPal如何改善Node.js的SSL性能

【推荐阅读】在PayPal如何改善Node.js的SSL性能

PayPal的工程师写的:

翻译版本

来自InfoQ

2 回复

【推荐阅读】在PayPal如何改善Node.js的SSL性能

PayPal的工程师分享了他们在提升Node.js应用中的SSL性能方面的经验。这些改进不仅提高了安全性,还显著提升了应用的响应速度。以下是一些关键的优化措施及其代码示例。

1. 使用更高效的加密套件

选择安全且高效的加密套件可以显著提高SSL性能。默认情况下,Node.js使用的是相对保守的加密套件。可以通过配置服务器来指定更高效的套件。

const https = require('https');
const fs = require('fs');

const options = {
    key: fs.readFileSync('/path/to/private-key.pem'),
    cert: fs.readFileSync('/path/to/certificate.pem'),
    ciphers: 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256',
    honorCipherOrder: true,
};

https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end('Hello World\n');
}).listen(8000);

在这个例子中,我们通过ciphers选项指定了一个包含高效加密套件的列表,并设置了honorCipherOrdertrue以确保优先使用指定的套件。

2. 启用OCSP Stapling

在线证书状态协议(OCSP)允许客户端验证证书的有效性。OCSP Stapling是一种优化技术,服务器会预先获取OCSP响应并将其提供给客户端,从而减少客户端与OCSP服务器之间的额外网络请求。

const tls = require('tls');
const fs = require('fs');

const options = {
    key: fs.readFileSync('/path/to/private-key.pem'),
    cert: fs.readFileSync('/path/to/certificate.pem'),
    ca: fs.readFileSync('/path/to/ca-certificate.pem'),
    requestCert: true,
    rejectUnauthorized: false,
    enable_ocsp_stapling: true,
};

tls.createServer(options, (socket) => {
    socket.on('secureConnect', () => {
        if (socket.authorized) {
            console.log('Client authorized.');
        } else {
            console.log('Client not authorized.');
        }
    });
}).listen(8001);

在这个例子中,我们通过设置enable_ocsp_staplingtrue来启用OCSP Stapling功能。

3. 优化会话缓存

SSL/TLS会话缓存可以显著减少握手时间,提高性能。可以通过配置会话缓存大小和超时时间来优化这一过程。

const https = require('https');
const fs = require('fs');

const options = {
    key: fs.readFileSync('/path/to/private-key.pem'),
    cert: fs.readFileSync('/path/to/certificate.pem'),
    sessionTimeout: 300, // 设置会话超时时间为300秒
    maxSessionSize: 1024, // 设置最大会话大小为1024字节
};

https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end('Hello World\n');
}).listen(8002);

在这个例子中,我们通过sessionTimeoutmaxSessionSize选项来优化会话缓存。

以上是几个有效的优化措施,可以帮助你在Node.js应用中显著提升SSL性能。希望这些示例代码能对你有所帮助!


在PayPal的文章中,他们分享了如何通过优化Node.js应用中的SSL性能来提升整体系统性能的经验。以下是几个关键点以及一些示例代码,帮助你在项目中实施这些优化策略。

1. 使用更高效的加密算法

默认情况下,Node.js可能会使用相对较慢的加密算法。通过指定更高效的加密套件(cipher suites),可以显著提高性能。例如,你可以使用像tls.createSecureContext()方法来设置特定的加密套件:

const tls = require('tls');
const fs = require('fs');

// 创建一个安全上下文并指定加密套件
const options = {
  ca: fs.readFileSync('./path/to/ca.pem'),
  cert: fs.readFileSync('./path/to/cert.pem'),
  key: fs.readFileSync('./path/to/key.pem'),
  ciphers: 'ECDHE-RSA-AES128-GCM-SHA256',
};

const server = tls.createServer(options, (socket) => {
  socket.end('encrypted data');
}).listen(8000);

2. 启用硬件加速

如果服务器支持硬件加速(如Intel QuickAssist技术),可以通过配置操作系统或使用特定的库来启用它。虽然这通常需要底层系统级别的配置,但一旦启用,可以在处理大量SSL流量时显著提升性能。

3. 调整SSL/TLS会话缓存

为了减少重复握手的开销,合理配置SSL/TLS会话缓存非常重要。Node.js提供了对TLS会话缓存的内置支持。通过调整会话缓存大小和超时时间,可以有效降低CPU使用率并提高响应速度。

const tls = require('tls');
const http = require('http');

const options = {
  // 其他配置项...
  maxVersion: 'TLSv1.2',
  minVersion: 'TLSv1.2',
  requestCert: true,
  rejectUnauthorized: false,
  secureOptions: require('constants').SSL_OP_NO_SSLv3 | require('constants').SSL_OP_NO_TLSv1 | require('constants').SSL_OP_NO_TLSv1_1,
  sessionTimeout: 60 * 60 * 1000, // 会话超时时间为1小时
  ticketKeys: Buffer.from('sessionTicketKey')
};

const server = tls.createServer(options, (socket) => {
  socket.end('encrypted data');
});

server.listen(8000);

以上是一些基本的优化策略。实际部署时,根据具体的应用场景和硬件条件,可能还需要进一步调整。希望这些示例对你有所帮助!

回到顶部