- настройка и включение 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-скриптов, упрощающих процесс генерации, подписывания, проверки и отзыва ваших тестовых сертификатов. Вы можете менять их на ваше усмотрение. Подробности смотрите в соответствующих файлах.
Итак, создадим наши сертификаты:
- генерируем закрытые ключи без пароля. При желании их можно защитить паролем, добавив, например, параметр -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
- создаём запросы на сертификацию. Данные для запросов берём из соответствующих файлов:
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
- создаём и подписываем сертификаты:
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
- перекодируем сертификаты в формат 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"
- отзываем один из наших клиентских сертификатов (по желанию). Пересоздаём список отозванных сертификатов:
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
- выводим содержимое сертификатов в файл для удобного чтения:
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
- проверяем действительность наших сертификатов:
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é
- в Портале создаём и настраиваем SSL-конфигурацию с именем %SuperServer:

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

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

увеличить
Далее тестируем SSL-соединение. Если вы сделали всё правильно, то увидите сообщение об успешном установлении безопасного соединения, как на скриншоте.
Примечание: При желании вы можете создать SSL-конфигурацию с именем %TELNET/SSL для поддержки SSL в телнет-соединениях.
Настройка SSL в Apache, встроенном в Caché
Примечание: Полное и подробное описание данного раздела можно найти в документации по mod_ssl. Скачать Apache c поддержкой SSL для Windows можно отсюда
- устанавливаем в папку %СacheHome%\httpd\modules файл mod_ssl.so;
- в файл %С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 ...
- перезапускаем встроенный Apache из командной строки:
httpd.exe -k restart -n CACHEhttpd -c "Listen 8972"
- запускаем из Куба Портал Управления Системой или документацию и удостоверяемся, что для установки защищённого соединения требуется наличие действительного клиентского сертификата, подписанного тем же удостоверяющим центром, что и серверный сертификат.
Чтение данных клиентского сертификата из CSP/ZEN приложений
В CSP-Шлюзе необходимо включить передачу в Caché всех дополнительных переменных окружения CGI:

увеличить
Теперь в веб-приложении можно получить параметры сертификатов в зависимости от типа веб-сервера следующим образом:
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-Шлюзе

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

увеличить
Настройка SSL в ODBC

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

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