使用Node.js+MongoDB+TLS场景下如何将.pem证书文件部署到Heroku
Heroku 环境下 Node.js MongoDB 证书配置最优方案
方案1:直接传入证书内容(无需生成临时文件,最推荐)
MongoDB Node.js 驱动原生支持直接传递证书内容,不需要依赖本地文件路径,完全可以跳过你目前想到的写入临时文件的步骤:
- 首先将.pem文件的完整内容直接存入Heroku的Config Vars环境变量,建议命名为
MONGODB_CA_CERT,Heroku的环境变量支持多行内容,无需手动转义换行符 - 初始化
MongoClient时,用tlsCA参数替代原来的tlsCAFile参数,直接传入证书内容转成的Buffer即可
代码示例:
const { MongoClient } = require('mongodb'); const client = new MongoClient(process.env.MONGODB_URI, { tls: true, tlsCA: Buffer.from(process.env.MONGODB_CA_CERT, 'utf8') });
这个方案没有额外的IO操作,也不会产生临时文件,安全性和性能都更好。
方案2:兼容旧版本驱动的临时文件方案
如果你使用的是3.2版本以下不支持tlsCA参数的老旧驱动,再考虑使用运行时写临时文件的方案:
- 证书内容依然存在环境变量中,写入文件时选择Heroku实例的
/tmp目录,该目录是实例独有的可写目录,实例销毁后文件会自动清除,不会泄露 - 写入完成后把文件路径传给
tlsCAFile参数即可
代码示例:
const fs = require('fs'); const path = require('path'); const { MongoClient } = require('mongodb'); const caCertPath = path.join('/tmp', 'mongodb-ca.pem'); fs.writeFileSync(caCertPath, process.env.MONGODB_CA_CERT, 'utf8'); const client = new MongoClient(process.env.MONGODB_URI, { tls: true, tlsCAFile: caCertPath });
内容的提问来源于stack exchange,提问作者bvs
相关产品推荐
相关产品推荐

