В описании подключения к облачному сервису PostgreSQL от яндекс.облака есть информация, которая меня несколько запутала. При настройке подключения Яндекс явно говорит, что требует SSL подключения (то есть, шифрования) при подключении к его облачной СУБД извне, то есть, из интернета. Что, в общем-то вполне логично :)

Далее, в справке пишут про установку SSL сертификата для установки шифрованного соединения. Вот цитата оттуда: “PostgreSQL-хосты с публичным доступом поддерживают только шифрованные соединения. Чтобы использовать их, получите SSL-сертификат:

Ради интереса, я попробовал подключиться снаружи без установки данного сертификата, и на моё удивление соединение установилось. Более того, оно было зашифрованным.

В чем же причина подобного? Дело в том, что фраза из справки не совсем корректна, и я объясню почему. За шифрование соединения к PostgreSQL отвечает параметр sslmode. По умолчанию его значение prefer. Это означает, что psql попытается подключиться используя шифрование, а если не получится, то попытается подключиться без шифрования. С этим значением, если все-таки сервер поддерживает шифрование, подключение не будет верифицированным. Таким образом, обмен данными будет шифрованным, но мы не будем уверены в том, что нам отвечает именно тот сервер, к которому мы подключаемся.

Сертификат, который предлагает скачать и установить нам Яндекс - это рутовый сертификат Яндекса, задача которого не шифровать соединение, а валидировать сертификат, который будет использоваться при шифровании, подтверждая, что сервер, к которому мы подключаемся, действительно тот самый сервер.

Я смог подключиться к облачной СУБД Яндекса извне без использования сертификата, который предлагается Яндексом в справке, потому что он не нужен для сертификации, но нужен для верификации сервера. Получается, по умолчанию при подключении клиент psql пытается установить шифрованное соединение используя один SSL сертификат сервера. Но чтобы заработала более полная защита, нужно также верифицировать сервер, а для этого нужен второй сертификат, отвечающий за верификацию первого SSL сертификата, который используется для шифрования. И именно этот второй сертификат и предлагает скачать Яндекс.

Итак, чтобы соединение было защищенным и проходила верификация сервера, нужно сделать две вещи:

  1. скачать и установить сертификат согласно инструкции в справке Яндекса
  2. задать явно, что мы хотим проверить сертификат для шифрования соединения. Это делается через установку значенияverify-full для параметра sslmode при подключении.