Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法将Node.js中的IP用于自签名证书_Javascript_Node.js_Https_Openssl_Self Signed - Fatal编程技术网

Javascript 无法将Node.js中的IP用于自签名证书

Javascript 无法将Node.js中的IP用于自签名证书,javascript,node.js,https,openssl,self-signed,Javascript,Node.js,Https,Openssl,Self Signed,我试图在Node.js中使用HTTP自签名证书 我使用我编写的以下脚本生成了证书: 生成.sh #!/bin/bash read -p "FQDN: " FQDN # for easy testing rm ROOT.* rm SERVER.* openssl genrsa 4096 > ROOT.key openssl req -x509 -nodes -sha256 -new -key ROOT.key -days 365 -subj "/C=AU/CN=example" >

我试图在Node.js中使用HTTP自签名证书

我使用我编写的以下脚本生成了证书:

生成.sh

#!/bin/bash
read -p "FQDN: " FQDN

# for easy testing
rm ROOT.*
rm SERVER.*

openssl genrsa 4096 > ROOT.key
openssl req -x509 -nodes -sha256 -new -key ROOT.key -days 365 -subj "/C=AU/CN=example" > ROOT.crt

openssl req -newkey rsa:4096 -nodes -sha256 -keyout SERVER.key -subj "/C=AU/CN=${FQDN}" > SERVER.csr
openssl x509 -days 365 -req -in SERVER.csr -CA ROOT.crt -CAkey ROOT.key -CAcreateserial > SERVER.crt
我尝试使用以下方法测试证书:

test.js

let fs = require('fs')
let https = require('https')

// HTTP server
https.createServer({
  key: fs.readFileSync('SERVER.key'),
  cert: fs.readFileSync('SERVER.crt'),
  ca: fs.readFileSync('ROOT.crt')
}, function (req, res) {
  res.writeHead(200)
  res.end('Hello world')
}).listen(4433)

// HTTP request
let req = https.request({
  hostname: '127.0.0.1',
  port: 4433,
  path: '/',
  method: 'GET',
  ca: fs.readFileSync('ROOT.crt')
}, function (res) {
  res.on('data', function (data) {
    console.log(data.toString())
  })
})
req.end()
但是,在测试时:

> node test.js
Error: Hostname/IP doesn't match certificate's altnames: "IP: 127.0.0.1 is not in the cert's list: "
这似乎很奇怪,因为如果我打印证书证书列表,它表明IP在那里

如果我使用
localhost
作为FQDN和
host
(在请求中),它确实可以工作

我错过了什么

编辑:


curl--cacert ROOT.crthttps://127.0.0.1:4433
无误完成,那么Node.js代码中缺少了什么呢?

我正在IRC上与您交谈,但我会将信息留在这里,以防它对其他人有所帮助

通过node的tls模块的源代码,我们可以看到它希望altnames采用非常特定的格式:

特别是线路:
var option=altname.match(/^(DNS | IP地址| URI):(.*)$/

之后,它决定要检查的主机的格式,如果它是IP地址,它将在从altnames中提取的IP地址中查找它。因此,证书将失败,除非它有一个格式为“IP地址:127.0.0.1”的altname,因为这是节点在稍后识别它正在测试IP地址时将其放入IP列表中检查的唯一方法

我不知道这是否是证书altnames字段格式的canon,但它应该为您提供生成节点将接受的证书的路径

或者,您可以在套接字或http请求的连接选项中提供自己的
checkServerIdentity
函数(应传递到套接字):


这是我以前不得不这样做的,但我相信altname匹配可能比我上次遇到这个问题时更新。

感谢Kris Reeves为我指明了正确的方向

问题如前所述,证书缺少
subjectAltName
s,并且为节点获取兼容格式并不是那么简单(必须与X509v3兼容)

最后的
Makefile
结果如下:

.PHONY: clean default

FQDN ?= 127.0.0.1

default: SERVER.crt
clean:
    rm -f openssl.conf
    rm -f ROOT.*
    rm -f SERVER.*

openssl.conf:
    cat /etc/ssl/openssl.cnf > openssl.conf
    echo "[ san_env ]" >> openssl.conf
    echo "subjectAltName=$$""{ENV::SAN}" >> openssl.conf

ROOT.key:
    openssl genrsa 4096 > ROOT.key

ROOT.crt: ROOT.key
    openssl req \
        -new \
        -x509 \
        -nodes \
        -sha256 \
        -key ROOT.key \
        -days 365 \
        -subj "/C=AU/CN=example" \
        -out ROOT.crt

SERVER.csr: openssl.conf
    SAN=IP:$(FQDN) openssl req \
        -reqexts san_env \
        -config openssl.conf \
        -newkey rsa:4096 \
        -nodes -sha256 \
        -keyout SERVER.key \
        -subj "/C=AU/CN=$(FQDN)" \
        -out SERVER.csr

SERVER.crt: openssl.conf ROOT.key ROOT.crt SERVER.csr
    SAN=IP:$(FQDN) openssl x509 \
        -req \
        -extfile openssl.conf \
        -extensions san_env \
        -days 365 \
        -in SERVER.csr \
        -CA ROOT.crt \
        -CAkey ROOT.key \
        -CAcreateserial \
        -out SERVER.crt
希望这能帮助那些只想使用IP的自签名证书的人


$make FQDN=127.0.0.1

Makefile:7:**缺少分隔符。停止
确保将所有缩进转换为制表符。