从节点

时间:2016-06-23 09:38:00

标签: sql-server node.js ssl node-mssql tedious

我有一个客户端需要连接的SQL Server数据库。该SQL Server计算机的FQDN为db.client.local,并且它们已设置自签名证书/启用加密。

如果我使用加密标记为已启用的Navicat连接到此主机(在我的hosts文件中向远程IP添加条目),则由于CA不受信任而拒绝该连接为不受信任,这正是我所期望的。 / p>

在使用node-mssqltedious的节点中,我能够连接并查询服务器,但似乎没有验证。如何让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'
)
*/

1 个答案:

答案 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(
    ...
);