Как сформировать нужную для ЕСИА подпсиь по алгоритму ГОСТ 2012?
Для интеграции с ЕСИА требуется подпись в формате PKCS#7 detached signature формирую подпись, используя алгоритм ГОСТ 2012.
но при переходе на URL авторизации вот такая ошибка: error_description: ESIA-007005: The client is not authorized to request an access token using this method.
Всего скорей неправильно формируется client_secret (т.е. некорректная подпись)
ВОПРОС: как сформировать нужную для ЕСИА подпсиь по алгоритму ГОСТ 2012?
Может есть тестовые сертификаты и примеры подписи для них? Чтоб сверить подпись для нижеприведенного алгоритма на JAVA. SIGNATURE_ALGORITHM = GOST3411-2012-256withECGOST3410-2012-256
public String signMessage(String message) throws Exception {
ks = loadKeyStore();
CMSSignedDataGenerator gen = getDataGenerator(ks);
byte[] bytes = signString(message, gen);
String res = new String(Base64.encode(bytes));
return res;
}
private KeyStore loadKeyStore() throws Exception {
InputStream stream = getClass().getClassLoader().getResourceAsStream(keyStorePath);
Security.addProvider(new BouncyCastleProvider());
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
keyStore.load(stream, KEYSTORE_PASSWORD.toCharArray());
return keyStore;
}
private Key getKeyByKeyStore(KeyStore ks) throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException {
String alias = ks.aliases().nextElement();
return ks.getKey(alias, KEYSTORE_PASSWORD.toCharArray());
}
private CMSSignedDataGenerator getDataGenerator(KeyStore ks) throws Exception {
String alias = ks.aliases().nextElement();
java.security.cert.Certificate [] certs = ks.getCertificateChain(alias);
List<java.security.cert.Certificate> certList = new ArrayList<>();
for (int i = 0, length = certs == null ? 0 : certs.length; i < length; i++) {
certList.add(certs[i]);
}
Store certstore = new JcaCertStore(certList);
X509Certificate cert = (X509Certificate) ks.getCertificate(alias);
PrivateKey privateKey = (PrivateKey) getKeyByKeyStore(ks);
ContentSigner signer = new JcaContentSignerBuilder(SIGNATURE_ALGORITHM)
.setProvider("BC")
.build(privateKey);
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
DigestCalculatorProvider bc = new JcaDigestCalculatorProviderBuilder().setProvider("BC").build();
generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(bc).build(signer, cert));
generator.addCertificates(certstore);
return generator;
}
private byte[] signBytes(final byte[] content, final CMSSignedDataGenerator generator) throws Exception {
CMSTypedData cmsdata = new CMSProcessableByteArray(content);
CMSSignedData signeddata = generator.generate(cmsdata, true);
return signeddata.getEncoded();
}
private byte[] signString(String content, final CMSSignedDataGenerator generator) throws Exception {
return signBytes(content.getBytes("UTF-8"), generator);
}