Преобразование подписи PHP DSA из DER ASN.1 в XMLDSIG P1363
Я пишу приложение PHP (действующее как SAML IdP), которое пытается выполнить вход через ответ SAML на сервер (действующий как SAML SP. В настоящее время я застрял на сервере, отклонившем запрос (я просто получаю 500 Плохой запрос).
Я написал тестовое приложение (на Java/openSAML - которое, я уверен, использует сервер), и вижу, что проблема в том, что SAML SignatureValidator validate генерирует
org.apache.xml.security.signature.XMLSignatureException: неверный формат XMLDSIG подписи DSA
Глядя на код SAML SignatureValidator, я вижу, что он проверяет, что длина подписи XMLDISG составляет ровно 40 байтов (формат P1363?), Тогда как длина сгенерированной подписи составляет 46-48 байтов (формат DER ASN.1?).
Сигнатура генерируется PHP openssl_sign, как показано ниже.
openssl_sign($canonicalized_signedinfo,
$signature,
$private_key,
OPENSSL_ALGO_DSS1))
Пример подписи (для ясности отображается в двоичном виде в шестнадцатеричный), как показано ниже. Это 46 байтов, но я замечаю, что оно варьируется (в зависимости от случайного ключа?) От 46 до 48 байтов.
302c02146e74afeddb0fafa646757d73b43bca688a12ffc5021473dc0ca572352c922b80abd0662965e7b866416d
Я могу успешно проверить эту подпись, используя PHP openssl_verify, как показано ниже.
openssl_verify ($canonicalized_signedinfo,
$signature ,
$public_key,
OPENSSL_ALGO_DSS1))
Но в моем тестовом приложении, когда я выполняю проверку SignatureValidator (как показано ниже), я получаю XMLSignatureException: Invalid XMLDSIG format of DSA signature
исключение.
BasicCredential credential = new BasicCredential();
credential.setPublicKey(publicKey);
credential.setUsageType(UsageType.SIGNING);
SignatureValidator sigValidator = new SignatureValidator(credential);
sigValidator.validate(signature);
Кто-нибудь знает, как сделать преобразование сигнатуры PHP из формата 46-48 DER ASN.1, сгенерированного PHP openssl_sign, в 40-байтовый формат P1363, ожидаемый openSAML?
1 ответ
Этот ресурс из проекта кода содержит пояснения о том, как преобразовать формат ASN.1 в P1363 с примерами кода. Может быть полезно написать метод проверки Java.
И я предлагаю вам использовать этот код C++ для генерации DSIG-совместимой подписи из PHP: http://xmlsig.sourceforge.net/
Кстати, это звучит сложнее, чем просто создать подпись и проверить ее. Вы можете быть заинтересованы в XMLBlackbox