我有一个客户端需要连接的SQL Server数据库。该SQL Server计算机的FQDN为db.client.local
,并且它们已设置自签名证书/启用加密。
如果我使用加密标记为已启用的Navicat连接到此主机(在我的hosts文件中向远程IP添加条目),则由于CA不受信任而拒绝该连接为不受信任,这正是我所期望的。 / p>
在使用node-mssql
和tedious
的节点中,我能够连接并查询服务器,但似乎没有验证。如何让node-mssql
验证证书?在这种情况下,我需要能够提供自定义CA证书。
到目前为止,这是我的代码
var sql = require( 'mssql' ),
evilDns = require( 'evil-dns' );
// Set up the mapping so that I can access via their local dns
evilDns.add( 'db.client.local' , '1.2.3.4' );
// Works without erroring
new sql.connect({
user: 'user',
password: 'password',
server: 'db.client.local',
database: 'my-test-database',
port: 1234,
options: {
encrypt: true // seems decorative, connection encrypts without this
}
}).then(
function( connection ) {
return new sql.Request( connection )
.query( `SELECT * FROM TableWithStuffIn` )
.then( function( response ) {
console.log( response );
return connection.close();
} );
},
function( err ) {
console.log( err );
return Promise.reject();
}
)
// This also works without erroring
/*
new sql.connect(
'mssql://user:password@db.client.local:1234/my-test-database?Encrypt=true&TrustServerCertificate=false'
)
*/
答案 0 :(得分:1)
在回答问题时,此功能不受支持。 Tedious现在在其当前的主分支中具有此功能,而不是在已发布的分支中。
更新发布后,以下示例启用证书验证:
new sql.connect({
user: 'user',
password: 'password',
server: 'db.client.local',
database: 'my-test-database',
port: 1234,
options: {
encrypt: true,
trustServerCertificate: false
}
}).then(
...
);
在我们的使用案例中,由于具有仅内部FQDN和自签名证书的SQL服务器的数量,我使用了类似于以下内容的东西,它还利用evilDNS
提供DNS覆盖
require( 'evil-dns' ).add( 'db.client.local' , '11.22.33.44' );
new sql.connect({
user: 'user',
password: 'password',
server: 'db.client.local',
database: 'my-test-database',
port: 1234,
options: {
encrypt: true,
trustServerCertificate: false,
cryptoCredentialsDetails: {
ca: 'PEM Encoded self-signed certificate authority certificate goes here'
}
}
}).then(
...
);