Статус: Участник
Группы: Участники
Зарегистрирован: 11.05.2021(UTC) Сообщений: 10 Сказал(а) «Спасибо»: 1 раз
|
Пытаемся подписать хэш сообщения следующим кодом, тут проверку проходит. Код:fun signHashData(hashData: String, hashAlg: String): String? {
Logger.log("Load key container to sign data.")
// Тип контейнера по умолчанию.
val keyStoreType: String = KeyStoreType.currentType()
Logger.log("Default container type: $keyStoreType")
// Загрузка ключа и сертификата.
load(
askPinInDialog, keyStoreType,
currentAlias,
null
)
if (privateKey == null) {
Logger.log("Private key is null.")
return null
}
// Формируем подпись.
val chain = mutableListOf<X509Certificate>()
if (certificates != null) {
for (cert in certificates!!) {
chain.add(cert as X509Certificate)
}
} else {
chain.add(certificate!!)
}
var cAdESSignature = CAdESSignature(true, true) //Отсоединенная, подписываем хэш
cAdESSignature.certificateStore =
CollectionStore(mutableListOf(X509CertificateHolder(certificate!!.encoded)))
Logger.log(
"Single signature type: " +
if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
)
Logger.log(
"Add one signer: " +
certificate!!.subjectDN+"\n public key Alg "+certificate!!.publicKey.algorithm
)
if (cAdESType == CAdESType.CAdES_BES) {
cAdESSignature.addSigner(
JCSP.PROVIDER_NAME, null,
null, privateKey, chain, cAdESType, null, false, null, null, null, true
)
}
else {
cAdESSignature.addSigner(
JCSP.PROVIDER_NAME, null,
null, privateKey, chain, cAdESType, CAdESSignVerifyPresenter.TSA_DEFAULT,
false
)
}
val signatureStream = ByteArrayOutputStream()
Logger.log(
"Compute signature for hash '" +
hashData + "\n" +
hashAlg
)
cAdESSignature.open(signatureStream)
cAdESSignature.update(hashData.toByteArray()) //Возможно вот сюда нужно что-то другое вставлять?
cAdESSignature.close()
signatureStream.close()
val sign = signatureStream.toByteArray()
Logger.log(sign, true)
Logger.log(sign.toString())
// Проверяем подпись.
Logger.log(
"Verify CAdES signature of type: " +
if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
)
cAdESSignature = CAdESSignature(sign, hashData.toByteArray(), cAdESType, true)
cAdESSignature.verify(chain)
Logger.log("CAdES signature has been created and verified (OK)")
return toBase64(sign)
}
При попытке проверить через код Код:
fun verify(
dataInBase64: String?,
signatureDataInBase64: String,
isAttached: Boolean
): String {
// Проверяем подпись.
Logger.log(
"Verify CAdES signature of type: " +
if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
)
val keyStoreType: String = KeyStoreType.currentType()
load(
askPinInDialog, keyStoreType,
currentAlias,
null
)
if (privateKey == null) {
Logger.log("Private key is null.")
return "null"
}
val chain = mutableListOf<X509Certificate>()
if (certificates != null) {
for (cert in certificates!!) {
chain.add(cert as X509Certificate)
}
} else {
chain.add(certificate!!)
}
val sign = signatureDataInBase64.replace("\n", "")
val decodedSignature = Base64.getDecoder().decode(sign)
val data =if (!isAttached) Base64.getDecoder().decode(dataInBase64) else null
val cAdESSignature = CAdESSignature(decodedSignature, data, cAdESType)
cAdESSignature.verify(chain)
Logger.log("CAdES signature has been created and verified (OK)")
return "true"
}
подпись проверку не проходит. Так же не проходит проверку через инструменты КриптоПро - неверный хэш. Не понятно как указать тип хэша для сертификата с открытым ключом ГОСТ Р 34.10-2012 256 бит (512 бит) Как реализовать что-то подобное https://docs.cryptopro.r...-samples-cades-sign-hashПросто отделенная подпись бинарных данных работает с тестовым сертификатом. Код:fun signData(dataInBase64: String, isAttached: Boolean): String? {
Logger.log("Load key container to sign data.")
// Тип контейнера по умолчанию.
val keyStoreType: String = KeyStoreType.currentType()
Logger.log("Default container type: $keyStoreType")
// Загрузка ключа и сертификата.
load(
askPinInDialog, keyStoreType,
currentAlias, null
)
if (privateKey == null) {
Logger.log("Private key is null.")
return null
} // if
// Формируем подпись.
val chain = mutableListOf<X509Certificate>()
val installedTrustCerts=InstallCAdESTestTrustCertExample(mcontext!!).getTrustCerts()
//chain.add(installedTrustCerts.last())
if (certificates != null) {
for (cert in certificates!!) {
chain.add(cert as X509Certificate)
}
} else {
chain.add(certificate!!)
}
var cAdESSignature = CAdESSignature(!isAttached)
cAdESSignature.certificateStore =
CollectionStore(mutableListOf(X509CertificateHolder(certificate!!.encoded)))
Logger.log(
"Single signature type: " +
if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
)
Logger.log(
"Add one signer: " +
certificate!!.subjectDN
)
if (cAdESType == CAdESType.CAdES_BES) {
cAdESSignature.addSigner(
JCSP.PROVIDER_NAME, null,
null, privateKey, chain, cAdESType, null, false, null, null, null, true
)
}
else {
cAdESSignature.addSigner(
JCSP.PROVIDER_NAME, null,
null, privateKey, chain, cAdESType, CAdESSignVerifyPresenter.TSA_DEFAULT,
false
)
}
val signatureStream = ByteArrayOutputStream()
Logger.log(
"Compute signature for message '" +
dataInBase64 + "'"
)
cAdESSignature.open(signatureStream)
val decodedBytes = Base64.getDecoder().decode(dataInBase64)
cAdESSignature.update(decodedBytes)
cAdESSignature.close()
signatureStream.close()
val sign = signatureStream.toByteArray()
// Проверяем подпись.
Logger.log(
"Verify CAdES signature of type: " +
if (cAdESType == CAdESType.CAdES_BES) "CAdES-BES" else "CAdES-X Long Type 1"
)
val data= if (!isAttached) decodedBytes else null
cAdESSignature = CAdESSignature(sign, data, cAdESType)
cAdESSignature.verify(chain)
Logger.log("CAdES подпись создана и проверена (OK)")
return toBase64(sign)
}
2. Попытка подписать бинарные данные действующим сертификатом info o sertifikate.txt (6kb) загружен 6 раз(а). приводит к ошибке, рутовые сертификаты устанавливаются при старте приложения root_certs.zip (3kb) загружен 4 раз(а).Код:I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_tsp_cert_app_ext_checker = false
I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_enroll_cert_type_ext_checker = false
W/System: A resource failed to call close.
I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_tsp_cert_app_ext_checker = false
I/JCP: ru.CryptoPro.JCP.pref.JCPPref.getBoolean :: System Preference Node: /ru/CryptoPro/reprov :: disable_enroll_cert_type_ext_checker = false
W/JCP: ru.CryptoPro.ssl.cl_39.<init> :: %% No appropriate keys for handshake
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: trustStore is : :: /data/user/0/ru.kck.signapp/security/cacerts
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: trustStore type is : :: BKS
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: trustStore provider is : ::
I/JCP: ru.CryptoPro.ssl.TrustManagerFactoryImpl.a :: init truststore
W/JCP: ru.CryptoPro.ssl.pc_4.cl_4.<clinit> :: X.509 not found
java.security.cert.CertificateException: X.509 not found
at java.security.cert.CertificateFactory.getInstance(CertificateFactory.java:260)
******
Caused by: java.security.NoSuchAlgorithmException: The BC provider no longer provides an implementation for CertificateFactory.X.509. Please see https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html for more details.
at sun.security.jca.Providers.checkBouncyCastleDeprecation(Providers.java:563)
at sun.security.jca.Providers.checkBouncyCastleDeprecation(Providers.java:330)
at java.security.cert.CertificateFactory.getInstance(CertificateFactory.java:254)
... 52 more
Validation failed for the target:
serial: 43c3d60026adbe8449cb7479b2f73cc9
subject: SURNAME=Вавилова, GIVENNAME=Светлана Сергеевна, CN=ООО КСК ТЕХНОЛОГИИ, O=ООО КСК ТЕХНОЛОГИИ, L=Москва, ST=77 г. Москва, C=RU, EMAILADDRESS=s.vavilova@kck.ru, OID.1.2.643.3.131.1.1=#120C303037373138303634373937, OID.1.2.643.100.1=#120D31313537373436313231323436, OID.1.2.643.100.3=#120B3134383732313535343831
issuer: CN=Центральное информационно-техническое таможенное управление, O=Центральное информационно-техническое таможенное управление, STREET="ул. Новозаводская, д. 11/5", L=г. Москва, ST=77 Москва, C=RU, OID.1.2.643.3.131.1.1=#120C303037373330363534343731, OID.1.2.643.100.1=#120D31313137373436383839393431, EMAILADDRESS=vuc@ca.customs.ru
not before: Wed May 12 08:51:56 EDT 2021
not after: Fri Dec 31 07:51:56 EST 2021
signature provider: JCSP
validation date: null
revocation algorithm: CPPKIX
revocation validator: RevCheck
online: true
For online validation by CRLDP parameter 'com.sun.security.enableCRLDP' (Oracle) or 'com.ibm.security.enableCRLDP' (IBM) must be set 'true' to enable or 'ocsp.enable' must be set 'true' (OCSP), or CRL passed for offline validation
Код:System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true")
System.setProperty("com.sun.security.enableCRLDP", "true")
System.setProperty("com.ibm.security.enableCRLDP", "true")
Security.setProperty("ocsp.enable", "true")
Отредактировано пользователем 23 мая 2021 г. 19:57:59(UTC)
| Причина: Не указана
|