如何为HTTPS Node.js服务器使用自签名证书?
我已经开始为一个API编写一个包装器,它要求所有请求都通过HTTPS。我希望在本地运行自己的服务器,模拟响应,而不是在开发和测试时请求实际的API 我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑 我的服务器如下所示:如何为HTTPS Node.js服务器使用自签名证书?,node.js,ssl,https,Node.js,Ssl,Https,我已经开始为一个API编写一个包装器,它要求所有请求都通过HTTPS。我希望在本地运行自己的服务器,模拟响应,而不是在开发和测试时请求实际的API 我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑 我的服务器如下所示: var options = { key: fs.readFileSync('./key.pem'), cert: fs.readFileSync('./cert.pem') }; https.createServer(options, function(
var options = {
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
};
https.createServer(options, function(req, res) {
res.writeHead(200);
res.end('OK\n');
}).listen(8000);
var options = {
host: 'localhost',
port: 8000,
path: '/api/v1/test'
};
https.request(options, function(res) {
res.pipe(process.stdout);
}).end();
pem文件是通过以下方式生成的:
openssl genrsa 1024 > key.pem
openssl req -x509 -new -key key.pem > cert.pem
请求看起来像这样:
var options = {
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
};
https.createServer(options, function(req, res) {
res.writeHead(200);
res.end('OK\n');
}).listen(8000);
var options = {
host: 'localhost',
port: 8000,
path: '/api/v1/test'
};
https.request(options, function(res) {
res.pipe(process.stdout);
}).end();
通过此设置,我得到了错误:深度\u零\u自签名\u证书
,因此我认为需要为请求添加一个ca
选项
因此,我的问题是,我应该如何生成以下内容:
键
证书
ca
var ca = fs.readFileSync('./certificate.pem');
var options = {
host: 'example.com',
path: '/api/v1/test',
ca: ca
};
options.agent = new https.Agent(options);
https.request(options, function(res) {
res.pipe(process.stdout);
}).end();
你的密钥生成看起来不错。您不应该需要ca,因为您没有拒绝未签名的请求
将.toString()添加到readFileSync方法的末尾,以便您实际传递的是字符串,而不是文件对象。尝试将其添加到请求选项中
var options = {
host: 'localhost',
port: 8000,
path: '/api/v1/test',
// These next three lines
rejectUnauthorized: false,
requestCert: true,
agent: false
};
尝试添加
agent: false,
rejectUnauthorized: false
更新(2018年11月):您需要自签名证书吗?
还是真正的证书能让工作做得更好?你考虑过这些吗
- 让我们通过
- 让我们通过
- 本地主机中继服务,例如
- 创建证书
- 运行node.js服务器
- node.js客户端中没有警告或错误
- cURL中没有警告或错误
localhost.greenlock.domains
为例(它指向127.0.0.1):
server.js
client.js
以及生成证书文件的脚本:
make-certs.sh
例如:
bash make-certs.sh 'localhost.greenlock.domains'
希望这能为这件事敲响警钟
还有一些解释:
在iOS Mobile Safari上安装私人证书
您需要创建扩展名为.crt的DER格式的根ca证书副本:
# create DER format crt for iOS Mobile Safari, etc
openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt
然后,您可以简单地使用Web服务器提供该文件。单击该链接时,应询问您是否要安装证书
例如,您可以尝试安装麻省理工学院的证书颁发机构:
相关实例
-
- (同一台服务器上有多个具有SSL的虚拟主机)
-
- (获取您今天可以用于在本地主机上进行测试的真正SSL证书)
ca.cnf
文件用作配置快捷方式:
wgethttps://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf
openssl-req-new-x509-days 9999-config ca.cnf-keyout ca-key.pem-out ca-cert.pem
ca-key.pem
和ca-cert.pem
中拥有了证书颁发机构,让我们为服务器生成一个私钥:
openssl genrsa-out key.pem 4096
server.cnf
文件用作配置快捷方式:
wgethttps://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf
openssl-req-new-config server.cnf-key-key.pem-out csr.pem
openssl x509-req-extfile server.cnf-999天-passin“pass:password”-在csr.pem-CA-cert.pem-CAkey CA-key.pem-CAcreateserial-out cert.pem中
我找到了此过程以及有关如何使用这些证书的更多信息。在最新版本的Node中,rejectUnauthorized选项默认设置为true,因此请求将被拒绝。toString是不必要的,因为readFileSync在未指定编码时返回缓冲区,而ca、cert和key选项接受缓冲区或字符串。这是否意味着您将reject unsigned requests设置为false,并且它正常工作?是的,我可以这样做,但这不是我想要的。我正在使用的API为我提供了一个CA证书,我可以使用它进行授权,我想在本地镜像这个设置。遗憾的是,这似乎还不够。加载WebSocket,然后尝试从Safari访问。即使我提供了证书,我也会收到一条消息,询问我是否要安装证书,但安装后,安全WebSocket失败。你在使用自签名证书+safari iOS方面有什么进展吗?@gman:如果你想在safari中使用它,你需要添加你的根ca。我用iOS部分更新了教程。如果你需要获取你调用的服务器的ca pem,请使用此命令(这是输出中的最后一个证书)
openssl s_客户端-showcerts-connect www.example.com:443您的答案值得一篇文章,非常有用!这与@Loourr的建议没有什么不同。我可以在生产中使用这种方法吗?
# create DER format crt for iOS Mobile Safari, etc
openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt