Подробная инструкция запроса TLS сертификата
1. Требования к сертификату
Чтобы обеспечить проверку системы партнера на основе сертификата, в subject сертификата предусмотрены обязательные поля:
Global Subject
CountryName - Название страны партнера
Country - Страна, в виде двухсимвольного ISO-кода. Для России: RU
OrganizationName - Название организации
CommonName - ФИО представителя организации
EmailAddress - Электронный адрес для обратной связи
В зависимости от правовой формы указать одно из нижеперечисленных полей:
Variable Subject
Для юридических лиц в России:
INN = 1.2.643.3.131.1.1
Для физических лиц в России:
SNILS = 1.2.643.100.3
Для иностранных партнеров:
FOREIGNID = 1.3.6.1.4.1.16745.100.1
*При указании электронного адреса необходимо помнить о том, что этот адрес будет использоваться при рассылке событий по сертификату (истечение срока, аннулирование и т.д.), поэтому рекомендуем указывать служебный адрес, а не персональный.
При использовании кириллицы просьба явно выставить кодировку UTF-8, в противном случае при подписании сертификата содержимое поля будет нечитаемым. Для командной строки windows - chcp 65001.
2. Порядок первичного выпуска сертификата
Партнер посредством любого крипто-приложения создает закрытый ключ. Простейший вариант, в OpenSSL:
На основе созданного ключа партнер генерирует запрос сертификата (CSR) с приватным ключом RSA (на выходе будет получен PEM-формат)
Партнер передает запрос на сертификат через команду Банка, отвечающую за взаимодействие с партнером alfa_api@alfabank.ru
Закрытый ключ партнер строго хранит у себя и несет ответственность за его компрометацию!
Со стороны банка Администратор на основе запроса выполняет выпуск сертификата, подписанного нашим CA и передает сертификат по оговоренным каналам связи в формате pem и pfx. Срок действия сертификата 375 дней.
3. Порядок повторного выпуска сертификата
Партнер, не ранее чем за месяц и не позднее, чем за неделю до истечения действия сертификата, формирует и направляет запрос на сертификат в Альфа-Банк по заранее согласованному каналу связи. Альфа-Банк обязуется в течение одной недели сформировать подписанный сертификат и направить его Партнеру. Контроль за сохранностью и сроками действия сертификатов возлагается на Партнера. В случае, если Партнер по каким-либо причинам, утратил сертификат, не предоставил запрос на сертификат или не выполнил установку нового сертификата на своей стороне, в том числе и в настройках приложения на портале, то вся ответственность по простою из-за утраты доступа к сервисам Альфа-Банка возлагается на партнера. В целях минимизации рисков просрочки сроков выпуска, предусмотрено автоматическое оповещение об истечении сроков действия сертификата. Также возможны индивидуальные условия по срокам выпуска и действия сертификата, достигнутые в рамках договора между Партнером и Альфа-Банком.
4. Пример CURL с использованием сертификата
curl -v --cert ./apidevelopers.cer: \
--key ./ apidevelopers.key \
--cacert ./ca.cer \
--request GET --url https://wsintest.alfabank.ru/alfabank/... /C... \
--header 'accept: application/json' \
--header 'content-type: application/json' \
Также можно использовать для тестирования работы любое приложение, поддерживающее формирование REST запросов, например, postman.
5. Пример генерации запроса на сертификат с помощью OpenSSL
5.1. Подготовка конфигурационного файла.
При подготовке конфигурационного файла необходимо учесть один момент. Если OpenSSL уже поддерживает OID ИНН и СНИЛС, то достаточно использовать конфигурацию из примера. Если же OpenSSL выдаст ошибку, что не знает таких OID, то необходимо будет дополнительно в глобальную секцию прописать эти поля:
openssl.config
# Individual insurance number (Numeric String)
INN = 1.2.643.3.131.1.1
SNILS = 1.2.643.100.3
Чтобы не утратить дефолтный конфигурационный файл, на случай ошибок при корректировке, лучше сохранить как отдельный файл с другим именем и его указывать при вызове через опцию -config.
Сохраняем копию файла openssl_INN.cnf и заменяем полностью содержимое из примера ниже.
openssl_INN.cnf Развернуть исходный код
## OpenSSL example configuration file.# This is mostly being used for generation of certificate requests.# # Note that you can include other files from the main configuration# file using the .include directive.#.include filename # This definition stops the following lines choking if HOME isn't# defined.HOME = . # Extra OBJECT IDENTIFIER info:#oid_file = $ENV::HOME/.oidoid_section = new_oids # To use this configuration file with the "-extfile" option of the# "openssl x509" utility, name here the section containing the# X.509v3 extensions to use:# extensions =# (Alternatively, use a configuration file that has only# X.509v3 extensions in its main [= default] section.) [ new_oids ] # We can add new OIDs in here for use by 'ca', 'req' and 'ts'.# Add a simple OID like this:# testoid1=1.2.3.4# Or use config file substitution like this:# testoid2=${testoid1}.5.6 # Policies used by the TSA examples.tsa_policy1 = 1.2.3.4.1tsa_policy2 = 1.2.3.4.5.6tsa_policy3 = 1.2.3.4.5.7 #INN = 1.2.643.3.131.1.1#SNILS = 1.2.643.100.3FOREIGNID=1.3.6.1.4.1.16745.100.1 ####################################################################[ ca ]default_ca = CA_default # The default ca section ####################################################################[ CA_default ] dir = ./demoCA # Where everything is keptcerts = $dir/certs # Where the issued certs are keptcrl_dir = $dir/crl # Where the issued crl are keptdatabase = $dir/index.txt # database index file.#unique_subject = no # Set to 'no' to allow creation of# several certs with same subject.new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificateserial = $dir/serial # The current serial numbercrlnumber = $dir/crlnumber # the current crl number# must be commented out to leave a V1 CRLcrl = $dir/crl.pem # The current CRLprivate_key = $dir/private/cakey.pem# The private key x509_extensions = usr_cert # The extensions to add to the cert # Comment out the following two lines for the "traditional"# (and highly broken) format.name_opt = ca_default # Subject Name optionscert_opt = ca_default # Certificate field options # Extension copying option: use with caution.# copy_extensions = copy # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs# so this is commented out by default to leave a V1 CRL.# crlnumber must also be commented out to leave a V1 CRL.# crl_extensions = crl_ext default_days = 365 # how long to certify fordefault_crl_days= 30 # how long before next CRLdefault_md = default # use public key default MDpreserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look# For type CA, the listed attributes must be the same, and the optional# and supplied fields are just that :-)policy = policy_match # For the CA policy# For the CA policy[ policy_match ]countryName = optionalstateOrProvinceName = optionalorganizationName = optional#organizationalUnitName = optionalcommonName = suppliedemailAddress = optionalINN = optionalSNILS = optionalFOREIGNID = optional # For the 'anything' policy# At this point in time, you must list all acceptable 'object'# types.[ policy_anything ]countryName = optional#stateOrProvinceName = optionallocalityName = optionalorganizationName = optional#organizationalUnitName = optionalcommonName = suppliedemailAddress = optionalINN = optionalSNILS = optionalFOREIGNID = optional ####################################################################[ req ]default_bits = 2048default_md = sha256default_keyfile = privkey.pemdistinguished_name = req_distinguished_nameattributes = req_attributesx509_extensions = v3_ca # The extentions to add to the self signed certreq_extensions = v3_reqx509_extensions = usr_cert # Passwords for private keys if not present they will be prompted for# input_password = secret# output_password = secret # This sets a mask for permitted string types. There are several options.# default: PrintableString, T61String, BMPString.# pkix : PrintableString, BMPString (PKIX recommendation before 2004)# utf8only: only UTF8Strings (PKIX recommendation after 2004).# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).# MASK:XXXX a literal mask value.# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.string_mask = utf8onlyutf8 = yes# req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ]countryName = countryNamecountryName_default = RUcountryName_min = 2countryName_max = 2 #stateOrProvinceName = State or Province Name (full name)#stateOrProvinceName_default = MSK localityName = localityNamelocalityName_default = Moscow 0.organizationName = organizationName#0.organizationName_default = AO Alfa-Bank # we can do this but it is not needed normally :-)#1.organizationName = Second Organization Name (eg, company)#1.organizationName_default = World Wide Web Pty Ltd #organizationalUnitName = Organizational Unit Name (eg, section)#organizationalUnitName_default = Corporate Products commonName = Common Name (e.g. server FQDN or YOUR name)commonName_max = 64 emailAddress = Email AddressemailAddress_max = 64 # SET-ex3 = SET extension number 3 INN = INNINN_def=0 [ req_attributes ]challengePassword = A challenge passwordchallengePassword_min = 4challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software# requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted# the certificate can be used for anything *except* object signing. # This is OK for an SSL server.# nsCertType = server # For an object signing certificate this would be used.# nsCertType = objsign # For normal client use this is typical# nsCertType = client, email # and for everything including object signing:# nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate.# keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox.nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates.subjectKeyIdentifier=hashauthorityKeyIdentifier=keyid,issuer # This stuff is for subjectAltName and issuerAltname.# Import the email address.# subjectAltName=email:copy# An alternative to produce certificates that aren't# deprecated according to PKIX.# subjectAltName=email:move # Copy subject details# issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem#nsBaseUrl#nsRevocationUrl#nsRenewalUrl#nsCaPolicyUrl#nsSslServerName # This is required for TSA certificates.# extendedKeyUsage = critical,timeStamping [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEncipherment [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = critical,CA:true # Key usage: this is typical for a CA certificate. However since it will# prevent it being used as an test self-signed certificate it is best# left out by default.# keyUsage = cRLSign, keyCertSign # Some might want this also# nsCertType = sslCA, emailCA # Include email address in subject alt name: another PKIX recommendation# subjectAltName=email:copy# Copy issuer details# issuerAltName=issuer:copy # DER hex encoding of an extension: beware experts only!# obj=DER:02:03# Where 'obj' is a standard or added object# You can even override a supported extension:# basicConstraints= critical, DER:30:03:01:01:FF [ crl_ext ] # CRL extensions.# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # issuerAltName=issuer:copyauthorityKeyIdentifier=keyid:always [ proxy_cert_ext ]# These extensions should be added when creating a proxy certificate # This goes against PKIX guidelines but some CAs do it and some software# requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted# the certificate can be used for anything *except* object signing. # This is OK for an SSL server.# nsCertType = server # For an object signing certificate this would be used.# nsCertType = objsign # For normal client use this is typical# nsCertType = client, email # and for everything including object signing:# nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate.# keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox.nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates.subjectKeyIdentifier=hashauthorityKeyIdentifier=keyid,issuer # This stuff is for subjectAltName and issuerAltname.# Import the email address.# subjectAltName=email:copy# An alternative to produce certificates that aren't# deprecated according to PKIX.# subjectAltName=email:move # Copy subject details# issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem#nsBaseUrl#nsRevocationUrl#nsRenewalUrl#nsCaPolicyUrl#nsSslServerName # This really needs to be in place for it to be a proxy certificate.proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo ####################################################################[ tsa ] default_tsa = tsa_config1 # the default TSA section [ tsa_config1 ] # These are used by the TSA reply generation only.dir = ./demoCA # TSA root directoryserial = $dir/tsaserial # The current serial number (mandatory)crypto_device = builtin # OpenSSL engine to use for signingsigner_cert = $dir/tsacert.pem # The TSA signing certificate# (optional)certs = $dir/cacert.pem # Certificate chain to include in reply# (optional)signer_key = $dir/private/tsakey.pem # The TSA private key (optional)signer_digest = sha256 # Signing digest to use. (Optional)default_policy = tsa_policy1 # Policy if request did not specify it# (optional)other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory)accuracy = secs:1, millisecs:500, microsecs:100 # (optional)clock_precision_digits = 0 # number of digits after dot. (optional)ordering = yes # Is ordering defined for timestamps?# (optional, default: no)tsa_name = yes # Must the TSA name be included in the reply?# (optional, default: no)ess_cert_id_chain = no # Must the ESS cert id chain be included?# (optional, default: no)ess_cert_id_alg = sha1 # algorithm to compute certificate# identifier (optional, default: sha1)
-
5.2. Генерация закрытого ключа
openssl genrsa -out Company.key 2048
Пример:
5.3. Генерация запроса на сертификат
openssl req -utf8 -config openssl_INN.cnf -key Company.key -new -sha256 -out Company.csr
В процессе генерации интерактивная форма в консоли будет выводить запросы
Пример:
5.4. Проверка запроса
openssl req -config openssl_INN.cnf -noout -text -in Company.csr
Пример:
5.5. Отправка полученного Company.csr по почте alfa_api@alfabank.ru
5.6. Получение подписанного сертификата и его установка.
5.6.1. Сборка файла контейнера pfx. Для сборки необходимы будут открытый и закрытый ключ и два сертификата УЦ. Ниже пример команды для сборки файла:
openssl pkcs12 -export -out Company.pfx -inkey Company.key -in Company.cer -certfile keys\root_apica_2022.cer -certfile keys\sub_root_apica_2022.cer
В процессе сборки консоль потребует вам ввести пароль для вашего контейнера pfx, придумываете пароль.
Пример:
5.6.2 Установка контейнера в системе.
Сформированный контейнер теперь можно установить. Установка практически во всех системах возможна простым запуском файла. Примеры из интернета: {+}https://support.globalsign.com/digital-certificates/digital-certificate-installation/install-pkcs12-file-linux-ubuntu-using-firefox+
{+}https://serverfault.com/questions/1003517/how-do-i-install-a-pfx-certificate-file-into-ubuntu-so-curl-trusts-it+