- PVSM.RU - https://www.pvsm.ru -
В данной статье будут рассмотрены лишь некоторые примеры установки безопасного соединения c СУБД Caché на основе SSL, а именно:
Примечание: Другие примеры использования SSL совместно с СУБД Caché — зеркалирование, Telnet, TCP/IP (сокеты), веб-сервисы, Caché Studio и т.д. — вы можете найти в документации [6] или техподдержке [7].
Для начала давайте сгенерируем собственно сами сертификаты: корневой (CA:Certificate Authority), серверный и клиентский.
Процесс генерации/получения сертификатов довольно сложный и выходит за рамки данной статьи, поэтому здесь он не будет подробно описываться.
В интернете можно найти множество материалов на эту тему, например: Электронная подпись [8].
Примечание: Наличие eToken желательно, но необязательно.
Был подготовлен набор bat-скриптов, упрощающих процесс генерации, подписывания, проверки и отзыва ваших тестовых сертификатов. Вы можете менять их на ваше усмотрение. Подробности смотрите в соответствующих файлах.
Итак, создадим наши сертификаты:
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
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:Inetpubwwwrootcrl.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, у кого он есть.
увеличить [9]
Для этого можно воспользоваться соответствующей оснасткой через консоль управления (mmc.exe):
Для этого следует воспользоваться прилагаемым к устройству программным обеспечением.
увеличить [10]
увеличить [11]
увеличить [12]
Далее тестируем SSL-соединение. Если вы сделали всё правильно, то увидите сообщение об успешном установлении безопасного соединения, как на скриншоте.
Примечание: При желании вы можете создать SSL-конфигурацию с именем %TELNET/SSL для поддержки SSL в телнет-соединениях.
Примечание: Полное и подробное описание данного раздела можно найти в документации по mod_ssl. Скачать Apache c поддержкой SSL для Windows можно отсюда [13]
...
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:<hh user=STRENGTH>
SSLOptions +StdEnvVars
...
LoadModule ssl_module modules/mod_ssl.so
...
httpd.exe -k restart -n CACHEhttpd -c "Listen 8972"
В CSP-Шлюзе необходимо включить передачу в Caché всех дополнительных переменных окружения CGI:
увеличить [15]
Теперь в веб-приложении можно получить параметры сертификатов в зависимости от типа веб-сервера следующим образом:
Class sqlru.testpage Extends %ZEN.Component.page
{/// This XML block defines the contents of this page.
XData Contents [ XMLNamespace = "www.intersystems.com/zen" [16] ]
{
<page xmlns="www.intersystems.com/zen" [16] 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
}
}
Таким же образом можно читать и другие атрибуты сертификатов:
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 не вставлен, или все сертификаты недействительны, то соединение будет прервано с ошибкой.
Для начала необходимо добавить наши сертификаты в соответствующие хранилища: доверенный сертификат в truststore, клиентский — в keystore.
В нашем случае в качестве keystore подойдет файл client_pwd.pfx, защищённый паролем “mysecret”.
Корневой сертификат можно вставить либо в отдельный truststore, либо в стандартный cacerts:
keytool -importcert -alias CACHE -file c:SSLKeysca.cer -keystore truststore -storepass mysecret
или
keytool -importcert -alias CACHE -file c:SSLKeysca.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 [17].
Теперь можно подключиться из 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);
}
}
увеличить [18]
Проверим соединение с сервером, всё ли мы правильно настроили:
увеличить [19]
Настройки SSL конфигураций хранятся в реестре: HKEY_CURRENT_USERSoftwareInterSystemsCacheSSLConfigurationsИмя SSL конфигурации
Описание параметров можно найти в классе Security.SSLConfigs [20]
Тестовые настройки можно найти в файле CacheOdbcSSL.reg (см. ниже).
Проверим соединение с сервером, всё ли мы правильно настроили:
Исходные скрипты [21]
Автор: servitRM
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/8279
Ссылки в тексте:
[1] SSL на стороне СУБД Caché: http://docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=GCAS_ssltls#GCAS_ssltls_superserver
[2] подключение из .NET, используя SSL: http://docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=GCAS_ssltls#GCAS_ssltls_dotnetcli
[3] подключение из .Java, используя SSL: http://docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=GCAS_ssltls#GCAS_ssltls_javacli
[4] настройка SSL в CSP-Шлюзе: http://docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=GCAS_ssltls#GCAS_ssltls_cspgateway
[5] настройка SSL в ODBC: http://docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=BGOD_winodbc
[6] документации: http://docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=GCAS_ssltls
[7] техподдержке: https://wrc.intersystems.com/wrc/login.csp
[8] Электронная подпись: http://www.sql.ru/forum/actualthread.aspx?tid=669766#7267246
[9] увеличить: http://db.tt/lZm1Ier3
[10] увеличить: http://db.tt/WR8mCbO6
[11] увеличить: http://db.tt/P02h1vGy
[12] увеличить: http://db.tt/6rs4v230
[13] отсюда: http://www.anindya.com/
[14] встроенный Apache: http://docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=GCGI_intro#GCGI_manprivate
[15] увеличить: http://db.tt/C4fgbDDe
[16] www.intersystems.com/zen": http://www.intersystems.com/zen"
[17] JSSE: http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html
[18] увеличить: http://db.tt/fU9pjohZ
[19] увеличить: http://db.tt/VmPk3uO3
[20] Security.SSLConfigs: http://docs.intersystems.com/cache20121/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Security.SSLConfigs
[21] Исходные скрипты: http://db.tt/s866Phr6
Нажмите здесь для печати.