所以,今天早些时候我遇到了一个问题,我的客户机是用node
写的,因为我连接到的服务器使用了自签名证书,所以出现了呕吐.所以,我像任何不知情的开发人员一样,在tls.connect
命令中添加了选项rejectUnauthorized: false
.
我现在的问题是,这对我意味着什么?我的TLS连接只是一个普通的TCP连接,也可能是TLS连接吗?把它写成TLS流完全没用吗?
更重要的是,那个服务器,你知道那个有自签名证书的吗?这里和那里之间的流真的加密了吗?
所以,今天早些时候我遇到了一个问题,我的客户机是用node
写的,因为我连接到的服务器使用了自签名证书,所以出现了呕吐.所以,我像任何不知情的开发人员一样,在tls.connect
命令中添加了选项rejectUnauthorized: false
.
我现在的问题是,这对我意味着什么?我的TLS连接只是一个普通的TCP连接,也可能是TLS连接吗?把它写成TLS流完全没用吗?
更重要的是,那个服务器,你知道那个有自签名证书的吗?这里和那里之间的流真的加密了吗?
如documentation中所述:
rejectUnauthorized
:如果是true
,则根据提供的CA列表验证服务器证书.如果验证失败,则发出error
事件;err.code
包含OpenSSL错误代码.默认值:true
.由于您使用的是自签名证书,显然与内置CA不匹配,因此默认情况下,连接将被拒绝,因为它无法验证服务器是他们所说的服务器.
设置为rejectUnauthorized: false
表示"我不在乎是否无法验证服务器的身份."显然,这不是一个好的解决方案,因为它使您容易受到MITM攻击.
对于自签名证书,更好的解决方案是在连接客户端时为自定义CA设置适当的ca
值.此外,请确保host
值与服务器自签名证书的通用名称匹配.例如:
var socket = tls.connect({
host: 'MyTLSServer',
port: 1337,
ca: [ fs.readFileSync('CA.pem') ],
}, function() {
// Connected!
});
// ...
无论使用rejectUnauthorized: false
还是设置ca
,连接都是加密的.