Подписание алгоритмом RSA
Для подписания в промышленной среде необходимо использовать RSA-сертификат, выпущенный с помощью сервиса Электронная подпись. Для подписания в тестовой среде необходимо использовать тестовый сертификат и ключ
Для подписания алгоритмом RSA необходимо выполнить следующие шаги:
1
2
3
4
Пример формирования подписи на Java
Пример формирования подписи на Java
1@Override
2public RsaSignResponse sign(RsaSignRequest request) throws Exception {
3 Security.addProvider(new BouncyCastleProvider());
4 BouncyCastleProvider provider = (BouncyCastleProvider) Security.getProvider("BC");
5 PrivateKey key = (PrivateKey) keyStore.getKey(KEYSTORE_ALIAS, KEYSTORE_PWD.toCharArray());
6 X509Certificate cert = (X509Certificate) keyStore.getCertificate(KEYSTORE_ALIAS);
7 CMSTypedData msg = new CMSProcessableByteArray(request.getDataToSign().getBytes());
8 CMSSignedDataGenerator signedDataGen = new CMSSignedDataGenerator();
9 X509CertificateHolder signCert = new X509CertificateHolder(cert.getEncoded());
10 ContentSigner signer = new JcaContentSignerBuilder("sha256WithRSAEncryption")
11 .setProvider(provider)
12 .build(key);
13 signedDataGen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
14 new JcaDigestCalculatorProviderBuilder().setProvider(provider).build()
15 ).setDirectSignature(true).build(signer, signCert));
16 // добавляем сертификат в подпись
17 JcaCertStore certs = new JcaCertStore(Collections.singletonList(cert));
18 signedDataGen.addCertificates(certs);
19 CMSSignedData signedData = signedDataGen.generate(msg, true);
20 byte[] signatureBytes = signedData.getEncoded("DER");
21 MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
22 byte[] hashedString = messageDigest.digest(request.getDataToSign().getBytes());
23 return new RsaSignResponse()
24 .base64Encoded(new String(Base64.getEncoder().encode(signatureBytes)));
25
26}
Пример формирования подписи на PHP
Пример формирования подписи на PHP
1public function sign(string $data, string $password = null): string
2{
3 $key = file_get_contents($this->private_key);
4 $cert = file_get_contents($this->certificate);
5 $privateKey = openssl_pkey_get_private($key, $password ?: $this->private_key_password);
6 $certid = openssl_x509_read($cert);
7 $inputTmpFile = tmpfile();
8 fwrite($inputTmpFile, $data);
9 fseek($inputTmpFile, 0);
10 $outputTmpFile = tmpfile();
11 openssl_pkcs7_sign(
12 stream_get_meta_data($inputTmpFile)['uri'],
13 stream_get_meta_data($outputTmpFile)['uri'],
14 $certid,
15 $privateKey,
16 [],
17 PKCS7_ATTACHED
18 );
19 fseek($outputTmpFile, 0);
20 $signature = fread($outputTmpFile, filesize(stream_get_meta_data($outputTmpFile)['uri']));
21 $signature = trim(explode("\n\n", $signature, 2)[1]);
22 fclose($inputTmpFile);
23 fclose($outputTmpFile);
24 return str_replace("\n", '', $signature);
25}
Подписание алгоритмом ГОСТ с использованием сертификата УКЭП
Для подписания может использоваться сертификат УКЭП, выпущенный в любом аккредитованном УЦ. Если сертификат принадлежит лицу, обладающим правом подписи по уставу компании главе компании, то он самодостаточен. Если сертификат выпущен для уполномоченного лица, обладающего правом подписи по доверенности, то, помимо сертификата, необходимо выпустить машиночитаемую доверенность (МЧД).
-
1.Сформируйте электронную подпись с использованием криптопровайдера КриптоПро CSP.
-
2.Закодируйте полученное значение отсоединённой электронной подписи в формат base64.
-
3.Передайте закодированное значение подписи в параметре
base64EncodedмассиваdigestSignatures.