1

我有一个需要连接到其 SQL Server 数据库的客户端。该 SQL Server 机器的 FQDN 是db.client.local并且他们设置了自签名证书/启用加密。

如果我使用 Navicat 连接到这个主机(在我的主机文件中添加一个远程 IP 条目),并使用加密标记为启用,它会拒绝连接,因为 CA 不受信任,这是我所期望的。

在节点使用中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'
)
*/
4

1 回答 1

1

在回答问题时,此功能不受支持。Tedious 现在在其当前的 master 分支中具有此功能,而不是在已发布的分支中。

发布更新后,以下示例将启用证书验证:

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(
    ...
);
于 2016-08-12T10:57:27.940 回答