1

SQL Server データベースに接続する必要があるクライアントがあります。その SQL Server マシンの FQDN はdb.client.local、自己署名証明書/有効な暗号化を設定しています。

暗号化フラグが有効になっている Navicat を使用してこのホストに接続すると (hosts ファイルのリモート 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 サーバーの数が多いため、私たちのユース ケースでは、evilDNSDNS オーバーライドを提供するためにも活用する、次のようなものを使用します。

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 に答える