#mysql #ssl #jdbc #client-certificates #sslsocketfactory
#mysql #ssl #jdbc #клиентские сертификаты #sslsocketfactory
Вопрос:
Google Cloud SQL (MySQL) поддерживает клиентские сертификаты SSL для защиты соединений. Я получил их, работая с клиентом mysql CLI и с MySQL-python без каких-либо проблем, но модель драйвера JDBC в Java кажется значительно менее гибкой. Я смог заставить его работать, импортировав необходимые ключи и сертификаты в мое хранилище ключей, но, похоже, я не могу легко предоставить конкретный сертификат для использования для определенного соединения во время выполнения.
Для моего использования хранение всех сертификатов в одном хранилище ключей для каждой JVM не сработает, у нас многопользовательская среда с десятками изолированных клиентских сертификатов. В документации PostgreSQL JDBC небрежно упоминается, что это должно быть возможно путем реализации вашего собственного SSLSocketFactory (исходный код):
Информация о том, как на самом деле реализовать такой класс, выходит за рамки этой документации. Где следует обратиться за помощью, так это в справочном руководстве по JSSE и в источнике NonValidatingFactory, предоставляемом драйвером JDBC.
Java SSL API не очень хорошо известен разработчикам драйверов JDBC, и мы были бы заинтересованы в любых интересных и в целом полезных расширениях, которые вы реализовали с использованием этого механизма. В частности, было бы неплохо иметь возможность предоставлять клиентские сертификаты для проверки сервером.
Единственная реализация, которую я видел, — это GoogleCloudPlatform / cloud-sql-mysql-socket-factory, которая на лету запрашивает облачные API Google для восстановления клиентских сертификатов emphemeral ssl. Это то, с чего я начинаю, но я разочарован тем фактом, что некоторые базовые свойства сокета (в частности, ConnectTimeout и socketTimeout) в настоящее время не реализованы.
Существуют ли другие реализации SSLSocketFactory, о которых я должен знать? Похоже, что общая реализация была бы полезна для нескольких драйверов JDBC (MySQL connector / J, PostgreSQL PgJDBC и Oracle предлагают некоторую поддержку клиентских сертификатов). Таким образом, строки подключения JDBC могли бы поддерживать клиентские сертификаты в качестве параметров стандартизации (в кодировке base64?) точно так же, как имена пользователей и пароли в настоящее время включены.