Работа с SSL/TLS в СУБД Caché

    В данной статье будут рассмотрены лишь некоторые примеры установки безопасного соединения c СУБД Caché на основе SSL, а именно:


    Примечание: Другие примеры использования SSL совместно с СУБД Caché — зеркалирование, Telnet, TCP/IP (сокеты), веб-сервисы, Caché Studio и т.д. — вы можете найти в документации или техподдержке.
    Для начала давайте сгенерируем собственно сами сертификаты: корневой (CA:Certificate Authority), серверный и клиентский.
    Процесс генерации/получения сертификатов довольно сложный и выходит за рамки данной статьи, поэтому здесь он не будет подробно описываться.
    В интернете можно найти множество материалов на эту тему, например: Электронная подпись.
    Примечание: Наличие eToken желательно, но необязательно.

    Генерация комплекта тестовых цифровых сертификатов


    Был подготовлен набор bat-скриптов, упрощающих процесс генерации, подписывания, проверки и отзыва ваших тестовых сертификатов. Вы можете менять их на ваше усмотрение. Подробности смотрите в соответствующих файлах.

    Итак, создадим наши сертификаты:
    1. генерируем закрытые ключи без пароля. При желании их можно защитить паролем, добавив, например, параметр -aes256:
      openssl genrsa -out cakey.pem -rand randfile 4096 
      openssl genrsa -out serverkey.pem -rand randfile 2048 
      openssl genrsa -out clientkey.pem -rand randfile 2048

    2. создаём запросы на сертификацию. Данные для запросов берём из соответствующих файлов:
      openssl req -new -key cakey.pem -config cfgCA.txt -out cacsr.pem 
      openssl req -new -key serverkey.pem -config cfgServer.txt -out servercsr.pem
      openssl req -new -key clientkey.pem -config cfgClient.txt -out clientcsr.pem

    3. создаём и подписываем сертификаты:
      openssl x509 -req -signkey cakey.pem -in cacsr.pem -extfile cfgCA.txt -extensions v3_req -out cacrt.pem -days 365 
      openssl ca -config ca.config -extensions v3_server -in servercsr.pem -out servercrt.pem -batch 
      openssl ca -config ca.config -extensions v3_client -in clientcsr.pem -out clientcrt.pem -batch

    4. перекодируем сертификаты в формат DER пригодный для .NET, eToken, хранилища сертификатов в Windows. Пароль для экспорта можно оставить пустым:
      openssl x509 -inform PEM -in cacrt.pem -outform DER -out ca.cer
      openssl x509 -inform PEM -in servercrt.pem -outform DER -out server.cer
      openssl x509 -inform PEM -in clientcrt.pem -outform DER -out client.cer
      
      openssl pkcs12 -export -in cacrt.pem -inkey cakey.pem -out ca.pfx -name "CA certificate CACHE"
      openssl pkcs12 -export -in servercrt.pem -inkey serverkey.pem -out server.pfx -name "Server certificate CACHE"
      openssl pkcs12 -export -in clientcrt.pem -inkey clientkey.pem -out client.pfx -name "Client certificate CACHE"

    5. отзываем один из наших клиентских сертификатов (по желанию). Пересоздаём список отозванных сертификатов:
      rem openssl ca -config ca.config -revoke clientcrt.pem 
      openssl ca -config ca.config -gencrl -out crl.pem 
      openssl crl -outform DER -in crl.pem -out crl.crl -CAfile cacrt.pem 
      copy crl.crl C:\Inetpub\wwwroot\crl.crl

    6. выводим содержимое сертификатов в файл для удобного чтения:
      openssl x509 -in cacrt.pem -noout -text >ca.log 
      openssl x509 -in servercrt.pem -noout -text >server.log 
      openssl x509 -in clientcrt.pem -noout -text >client.log 
      openssl crl -in crl.pem -text -noout

    7. проверяем действительность наших сертификатов:
      openssl verify -CAfile cacrt.pem servercrt.pem clientcrt.pem

    Содержимое файла ca.config:
    [ca]
    default_ca=CA_CLIENT
    [CA_CLIENT]
    dir=./db
    certs             = $dir/certs
    new_certs_dir     = $dir/newcerts
    database          = $dir/index.txt
    serial            = $dir/serial
    certificate       = ./cacrt.pem
    private_key       = ./cakey.pem
    default_days      = 365
    default_crl_hours = 4
    default_md        = sha1
    policy            = policy_anything # Название секции с описанием
    
    [policy_anything]
    countryName            = optional
    stateOrProvinceName    = optional
    localityName           = optional
    organizationName       = optional
    organizationalUnitName = optional
    commonName             = supplied
    emailAddress           = optional
    serialNumber           = optional
    
    [v3_server]
    basicConstraints      = critical,CA:false
    nsComment             = "Server certificate CACHE"
    nsCertType            = server
    keyUsage              = critical,digitalSignature, nonRepudiation, keyEncipherment, keyAgreement
    crlDistributionPoints = URI:http://localhost/crl.crl
    
    [v3_client]
    subjectAltName        = email:copy
    basicConstraints      = critical,CA:false
    nsComment             = "Client certificate CACHE"
    nsCertType            = client, email, objsign
    keyUsage              = critical,digitalSignature, nonRepudiation, keyEncipherment, keyAgreement
    crlDistributionPoints = URI:http://localhost/crl.crl

    Содержимое файла cfgCA.txt:
    # Секция основных опций 
    [req]
    distinguished_name   = req_distinguished_name
    prompt		       = no
    extensions	     = v3_req
    [req_distinguished_name]
    # Страна
    C=MD
    # Область
    ST=Moldova
    # Город
    L=Chisinau
    # Название организации
    O=abc
    # Название отделения
    OU=zxc
    # Имя для сертификата(персоны, получающей сертификат)
    CN=CACHE
    # Мыло организации
    emailAddress=support@abc.md
    
    [v3_req]
    subjectAltName        = email:copy
    keyUsage              = critical, keyCertSign, cRLSign
    basicConstraints      = critical, CA:TRUE, pathlen:0
    nsComment             = "CA certificate CACHE"
    nsCertType            = sslCA, emailCA
    crlDistributionPoints = URI:http://localhost/crl.crl

    Содержимое файла cfgServer.txt:
    # Секция основных опций
    [req]
    distinguished_name   = distinguished_name
    prompt		       = no
    
    [distinguished_name]
    C=MD
    ST=Moldova
    L=Chisinau
    O=abc
    OU=zxc
    CN=localhost

    Содержимое файла cfgClient.txt:
    # Секция основных опций
    [req]
    distinguished_name   = distinguished_name
    prompt		       = no
    
    [distinguished_name]
    serialNumber=987654321
    CN=superuser
    emailAddress=my@abc.md

    Теперь у Вас есть тестовые сертификаты. Далее их следует прописать в Caché, Apache, хранилище сертификатов и при необходимости установить на eToken, у кого он есть.

    Установка сертификатов в хранилище сертификатов Windows


    image
    увеличить

    Для этого можно воспользоваться соответствующей оснасткой через консоль управления (mmc.exe):
    • ca.cer следует установить в доверенные корневые центры сертификации локального компьютера;
    • server.pfx следует установить в личные сертификаты локального компьютера (требуется для настройки IIS);
    • client.pfx следует установить в личные сертификаты текущего пользователя. Обладатели eToken могут этот пункт пропустить.

    Установка сертификатов на eToken


    Для этого следует воспользоваться прилагаемым к устройству программным обеспечением.

    Настройка SSL-конфигурации в Caché


    1. в Портале создаём и настраиваем SSL-конфигурацию с именем %SuperServer:

      image
      увеличить

    2. включаем поддержку SSL/TLS супер-сервером Caché:

      image
      увеличить

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

      image
      увеличить

      Далее тестируем SSL-соединение. Если вы сделали всё правильно, то увидите сообщение об успешном установлении безопасного соединения, как на скриншоте.
      Примечание: При желании вы можете создать SSL-конфигурацию с именем %TELNET/SSL для поддержки SSL в телнет-соединениях.

    Настройка SSL в Apache, встроенном в Caché


    Примечание: Полное и подробное описание данного раздела можно найти в документации по mod_ssl. Скачать Apache c поддержкой SSL для Windows можно отсюда

    1. устанавливаем в папку %СacheHome%\httpd\modules файл mod_ssl.so;
    2. в файл %СacheHome%\httpd\conf\httpd.conf добавляем следующие строчки:
      ...
      UseCanonicalName Off
      SSLEngine on
      SSLCertificateFile    C:/SSLKeys/servercrt.pem
      SSLCertificateKeyFile C:/SSLKeys/serverkey.pem
      SSLCACertificateFile  C:/SSLKeys/cacrt.pem
      SSLVerifyClient require
      SSLVerifyDepth  10
      SSLCipherSuite  TLSv1:SSLv3:!ADH:!LOW:!EXP:@STRENGTH
      SSLOptions +StdEnvVars
      ...
      LoadModule ssl_module modules/mod_ssl.so
      ...

    3. перезапускаем встроенный Apache из командной строки:
      httpd.exe -k restart -n CACHEhttpd -c "Listen 8972"

    4. запускаем из Куба Портал Управления Системой или документацию и удостоверяемся, что для установки защищённого соединения требуется наличие действительного клиентского сертификата, подписанного тем же удостоверяющим центром, что и серверный сертификат.

    Чтение данных клиентского сертификата из CSP/ZEN приложений


    В CSP-Шлюзе необходимо включить передачу в Caché всех дополнительных переменных окружения CGI:

    image
    увеличить

    Теперь в веб-приложении можно получить параметры сертификатов в зависимости от типа веб-сервера следующим образом:
    Class sqlru.testpage Extends %ZEN.Component.page
    {

    /// This XML block defines the contents of this page.
    XData
    Contents [ XMLNamespace = "www.intersystems.com/zen" ]
    {
    <
    page xmlns="www.intersystems.com/zen" title="">
      <
    textarea id="ta" value="test" rows="10" cols="50"/>
    </
    page>
    }

    Method %OnAfterCreatePage() As %Status
    {
      
    if %request.CgiEnvs("SERVER_SOFTWARE")["Apache" {
        
    set a = %request.CgiEnvs("SSL_CLIENT_S_DN")
      
    }else{
        
    set a = %request.CgiEnvs("CERT_SUBJECT")
      
    }
      
      
    do ..%SetValueById("ta",a)
      
    Quit $$$OK
    }
    }

    Таким же образом можно читать и другие атрибуты сертификатов:
    • SSL_CLIENT_I_DN;
    • SSL_SERVER_I_DN;
    • SSL_SERVER_S_DN;
    • ...

    Подключение из .NET к Caché, используя SSL


    var db = new CacheConnection("Server = localhost; Port = 1972; Namespace = SAMPLES; Password = SYS; User ID = _SYSTEM; SSL=true;");
    if (db.State == ConnectionState.Closed)
    {
      db.Open();
      textBox1.Text = db.ServerZV;
    }
    db.Close();

    Будет использоваться первый действительный сертификат из хранилища личных сертификатов. Если сертификат находится на eToken, то будет запрошен PIN-код.
    Если хранилище пустое, например eToken не вставлен, или все сертификаты недействительны, то соединение будет прервано с ошибкой.

    Подключение из Java к Caché, используя SSL


    Для начала необходимо добавить наши сертификаты в соответствующие хранилища: доверенный сертификат в truststore, клиентский — в keystore.
    В нашем случае в качестве keystore подойдет файл client_pwd.pfx, защищённый паролем “mysecret”.
    Корневой сертификат можно вставить либо в отдельный truststore, либо в стандартный cacerts:

    keytool -importcert -alias CACHE -file c:\SSLKeys\ca.cer -keystore truststore -storepass mysecret
    или
    keytool -importcert -alias CACHE -file c:\SSLKeys\ca.cer -keystore cacerts -storepass changeit

    Далее необходимо создать клиентский файл конфигурации SSLConfig.Properties:
    protocol=SSLv3
    keyStore=C:/SSLKeys/client_pwd.pfx
    keyStoreType=PKCS12
    keyStorePassword=mysecret
    keyRecoveryPassword=mysecret
    
    # Если ca сертификат уже есть в cacerts, то следующие строки необязательны
    trustStore=C:/SSLKeys/truststore
    trustStoreType=JKS
    trustStorePassword=mysecret

    Примечание: Более детальную информацию можно найти в документации по JSSE.

    Теперь можно подключиться из java-приложений, используя SSL, следующим образом:
    package test;
    
    import java.sql.Connection;
    
    import com.intersys.jdbc.CacheDataSource;
    
    public class Test {
    
      public static void main(String[] args) throws Throwable {
        String url = "jdbc:Cache://localhost:1972/USER";
        String username = "_SYSTEM";
        String password = "SYS";
    
        System.setProperty("com.intersys.SSLConfigFile", "C:/SSLKeys/SSLConfig.Properties");
    
        CacheDataSource cs = new CacheDataSource();
        cs.setURL(url);
        cs.setUser(username);
        cs.setPassword(password);
        cs.setConnectionSecurityLevel(10);
    
        Connection cn = cs.getConnection();
        System.out.println("Подключение прошло успешно!");
        //Database db = CacheDatabase.getDatabase(cn);
      }
    }

    Настройка SSL в CSP-Шлюзе


    image
    увеличить

    Проверим соединение с сервером, всё ли мы правильно настроили:

    image
    увеличить

    Настройка SSL в ODBC


    image

    Настройки SSL конфигураций хранятся в реестре: HKEY_CURRENT_USER\Software\InterSystems\Cache\SSLConfigurations\Имя SSL конфигурации
    Описание параметров можно найти в классе Security.SSLConfigs
    Тестовые настройки можно найти в файле CacheOdbcSSL.reg (см. ниже).

    Проверим соединение с сервером, всё ли мы правильно настроили:

    image

    Исходные скрипты
    InterSystems
    87,00
    Вендор: СУБД Caché, OLAP DeepSee, шина Ensemble
    Поделиться публикацией

    Похожие публикации

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое