Статьи

Драйвер SQL Server для параметров подключения PHP: шифрование

Этот короткий пост добавляет к моей серии по вариантам подключения в драйвере SQL Server для PHP. Я расскажу немного подробнее о параметрах Encrypt и TrustServerCertificate , чем о документации драйвера . Я начну с трех важных моментов, связанных с этими параметрами, а затем расскажу о нескольких гипотетических ситуациях, которые должны пролить больше света на то, что на самом деле делают эти параметры.

Первое, на что следует обратить внимание, это то, что эти две опции, Encrypt и TrustServerCertificate , часто используются вместе. Параметр Encrypt используется для указания того, зашифровано ли соединение с сервером (по умолчанию установлено значение false ). Параметр TrustServerCertificate используется для указания того, следует ли доверять сертификату на экземпляре SQL Server (по умолчанию установлено значение false ).

Примечание . Настройка параметра « Шифрование» не означает, что данные хранятся в зашифрованном виде. Это просто означает, что данные передаются на сервер в зашифрованном виде. Также обратите внимание, что этот параметр не применяется к учетным данным для проверки подлинности, таким как пароль SQL Server — учетные данные для проверки подлинности всегда шифруются. Сведения о хранении зашифрованных данных см. В разделе Иерархия шифрования в документации по SQL Server.

Второе, на что следует обратить внимание, это то, что по умолчанию при установке SQL Server создается самозаверяющий сертификат, который он будет использовать для шифрования соединений. Конечно, самозаверяющие сертификаты не идеальны для безопасных соединений (они уязвимы для атак «человек посередине» ), поэтому лучше заменить этот сертификат сертификатом из центра сертификации (ЦС) .

Третье, что нужно знать, это как использовать эти опции при подключении к SQL Server. Если вы используете API-интерфейс SQLSRV, код вашего подключения может выглядеть примерно так:

$serverName = "serverName";
$connectionInfo = array( "Database"=>"DbName",
                         "UID"=>"UserName",
                         "PWD"=>"Password",
                         "Encrypt"=>true,
                         "TrustServerCertificate"=>false);
$conn = sqlsrv_connect( $serverName, $connectionInfo);

Если вы используете API PDO_SQLSRV, ваш код подключения может выглядеть примерно так:

$serverName = "serverName";
$conn = new PDO("sqlsrv:Server = $serverName;
                 Database = DBName;
                 Encrypt = true;
                 TrustServerCertificate = false",
                 "UserName",
                 "Password");

Теперь, имея в виду эти три вещи, давайте посмотрим на пару примеров. Сначала предположим следующее:

  1. Вы не заменили самоподписанный сертификат, созданный при установке SQL Server.
  2. Вы устанавливаете Encrypt = true.
  3. You set TrustServerCertificate = false.

In this scenario, your connection will fail. When you set TrustServerCertificate = false, you are asking for some 3rd party verification of the certificate. Because this is a self-signed certificate, there is no 3rd party to do the verification. However, if you set TrustServerCertificate = true, then your connection will succeed because you are trusting the certificate. (Note that, as mentioned earlier, this connection would be vulnerable to man-in-the-middle attacks.)

Now consider the following:

  1. You replaced the self-signed certificate created when SQL Server was installed with a certificate from a certificate authority (CA)..
  2. You set Encrypt = true.

In this case (assuming there are no problems with your certificate), regardless of your setting for TrustServerCertificate, your connection will succeed. However, for a more secure connection (one not vulnerable to man-in-the-middle attacks), you should set  TrustServerCertificate = false. Doing so will force third party verification of the certificate.

For information about installing a certificate on SQL Server, see How to: Enable Encrypted Connections to the Database Engine. Note that that topic references setting the Force Encryption option on the database server. Setting this option to Yes on the server does the same thing as setting Encryption = true on the client – it forces the connection to be encrypted using the server’s certificate.

That’s it for today. Thanks.

-Brian