Блог

    Caché (Кашэ́) — промышленная высокопроизводительная, объектная система управления базами данных, интегрированная с технологией разработки веб-приложений. Единая архитектура данных Caché позволяет разработчикам использовать одновременно объектный, реляционный (SQL) и прямой (NoSQL) доступ к одним и тем же данным, хранение которых обеспечивается ориентированным на транзакции многомерным ядром СУБД.

    http://www.intersystems.ru/cache/

Последние записи


Теги

Информация

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

добавлено: 27 апр 12
понравилось:0
просмотров: 2354
комментов: 0

теги:

Автор: servit

Этот же пост доступен и на хабре.

В данной статье будут рассмотрены лишь некоторые примеры установки безопасного соединения c СУБД Caché на основе SSL, а именно:
  • настройка и включение SSL на стороне СУБД Caché;
  • настройка SSL в Apache, встроенном в СУБД Caché;
  • чтение данных из клиентского сертификата в веб-приложениях CSP/ZEN;
  • подключение из .NET, используя SSL;
  • подключение из .Java, используя SSL;
  • настройка SSL в CSP-Шлюзе для установки безопасного соединения между веб-сервером и СУБД Caché;
  • настройка SSL в ODBC.
Примечание:
Другие примеры использования 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

Картинка с другого сайта.

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

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

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

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

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

Картинка с другого сайта.

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

Картинка с другого сайта.

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

Картинка с другого сайта.

Далее тестируем 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:

Картинка с другого сайта.

Теперь в веб-приложении можно получить параметры сертификатов в зависимости от типа веб-сервера следующим образом:

Class sqlru.testpage Extends %ZEN.Component.page
{

/// This XML block defines the contents of this page.
XData 
Contents [ XMLNamespace "http://www.intersystems.com/zen" ]
{
<
page xmlns="http://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-Шлюзе

Картинка с другого сайта.

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

Картинка с другого сайта.


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

Картинка с другого сайта.

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

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

Картинка с другого сайта.


Исходные скрипты

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии