Статус: Новичок
Группы: Участники
Зарегистрирован: 10.02.2016(UTC) Сообщений: 5
|
Здравствуйте. Использую jdk1.7.0_06, КриптоПро JCP v1.0, rel.1.0.54 и xades4j для подписи части xml-документа. Если в xades4j использовать getIssuerX500Principal().getName(X500Principal.CANONICAL), то в подписи значение тэга "xd:X509IssuerName" получается Код:
<xd:X509IssuerName>cn=#1e380422043504410442043e0432044b04390020042304260020041e041e041e00200022041a04200418041f0422041e002d041f0420041e0022,o=#1e20041e041e041e00200022041a04200418041f0422041e002d041f0420041e0022,c=ru,1.2.840.113549.1.9.1=#1611696e666f4063727970746f70726f2e7275,l=#1e0c041c043e0441043a04320430,st=#1e180037003700200433002e0020041c043e0441043a04320430,street=#1e300443043b002e0020042104430449045104320441043a04380439002004320430043b002c00200434002e002000310038,1.2.643.3.131.1.1=#120c303037373137313037393931,1.2.643.100.1=#120d31303337373030303835343434</xd:X509IssuerName>
и последующая проверка подписи проходит без ошибок, но если использовать getIssuerX500Principal().getName(X500Principal.RFC1779) (что рекомендуется делать, исходя из ответов найденных в похожих темах на форуме), значение тэга принимает более читаемый вид Код:
<xd:X509IssuerName>CN="Тестовый УЦ ООО \"КРИПТО-ПРО\"", O="ООО \"КРИПТО-ПРО\"", C=RU, OID.1.2.840.113549.1.9.1=info@cryptopro.ru, L=Москва, ST=77 г. Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.3.131.1.1=#120C303037373137313037393931, OID.1.2.643.100.1=#120D31303337373030303835343434</xd:X509IssuerName>
однако проверку такая подпись уже не проходит, с ошибкой Цитата: Verification failed for property 'SigningCertificate': Couldn't find a reference to the signing certificate Код используемый для подписи Код:
KeyStore ks = SignUtil.buildKeyStore();
//Получение ключа и сертификата
PrivateKey privateKey = (PrivateKey) ks.getKey(SignUtil.PRIVATE_KEY_CONTAINER, SignUtil.PRIVATE_KEY_PASSWORD.toCharArray());
X509Certificate cert = (X509Certificate) ks.getCertificate("1");
KeyingDataProvider keyingDataProvider = new DirectKeyingDataProvider(cert, privateKey);
XadesSigningProfile prof = new XadesBesSigningProfile(keyingDataProvider)
.withTimeStampTokenProvider(DefaultTimeStampTokenProvider.class)
.withDigestEngineProvider(new DefaultMessageDigestProvider() {
@Override
public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {
try {
return MessageDigest.getInstance("GOST3411");
} catch (NoSuchAlgorithmException nsae) {
throw new UnsupportedAlgorithmException(nsae.getMessage(), digestAlgorithmURI, nsae);
}
}
})
.withAlgorithmsProviderEx(new DefaultAlgorithmsProviderEx() {
@Override
public Algorithm getSignatureAlgorithm(String keyAlgorithmName)
throws UnsupportedAlgorithmException {
return new GenericAlgorithm("http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411");
}
@Override
public String getDigestAlgorithmForReferenceProperties() {
return "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
}
@Override
public Algorithm getCanonicalizationAlgorithmForTimeStampProperties() {
return new ExclusiveCanonicalXMLWithoutComments();
}
@Override
public String getDigestAlgorithmForDataObjsReferences() {
return "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
}
})
;
XadesSigner signer = prof.newSigner();
DataObjectDesc obj1 = new DataObjectReference("#" + elementToSign.getAttribute("Id"))
.withTransform(new EnvelopedSignatureTransform());
SignedDataObjects dataObjs = new SignedDataObjects(obj1);
signer.sign(dataObjs, elementToSign, SignatureAppendingStrategies.AsFirstChild);
И для проверки подписи Код:
KeyStore trustStore = SignUtil.buildTrustStore();
final CertificateValidationProvider validationProvider = new PKIXCertificateValidationProvider(
trustStore, true, new CertStore[]{});
final XadesVerificationProfile verProf = new XadesVerificationProfile(validationProvider)
.withTimeStampTokenVerifier(DefaultTimeStampVerificationProvider.class)
.withDigestEngineProvider(new DefaultMessageDigestProvider() {
@Override
public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException {
// Определение OID’а алгоритма хэширования по URN
try {
return MessageDigest.getInstance("GOST3411");
} catch (NoSuchAlgorithmException e) {
throw new UnsupportedAlgorithmException(e.getMessage(), digestAlgorithmURI, e);
}
}
});
final XadesVerifier verifier = verProf.newVerifier();
verifier.verify((Element)elementToSign.getFirstChild(), null);
В чем может быть загвоздка?
|