В нашем веб-приложении мы собираемся усовершенствовать механизм аутентификации сертификата.
Мы использовали CN
из сертификата для входа в систему и аутентификации пользователя.
Однако требования изменились, и теперь мы рекомендуем использовать SAN
(альтернативное имя субъекта) как UPN
или RFC822 Name
В поле нашего сертификата SAN
я вижу следующее:
Other Name:
Principal Name=EXAMPLE@vw.vwg
RFC822 Name=Extern.Example.Example@volkswagen.de
Я пытался получить имя RFC822 с помощью следующего фрагмента:
public static String getSANOtherNameRFC822(X509Certificate cert) throws CertificateParsingException
{
Collection<List<?>> subjectAlternativeNames = cert.getSubjectAlternativeNames();
for (List<?> subjectAlternativeName : subjectAlternativeNames)
{
if ((Integer) subjectAlternativeName.get(0) == 1) // rfc822name
{
System.out.println((String) subjectAlternativeName.get(1));
return (String) subjectAlternativeName.get(1);
}
}
return null;
}
И, похоже, это работает.
Когда я анализирую сертификат и вызываю метод, я получаю следующий вывод:
Extern.Example.Example@volkswagen.de
Однако я не знаю, как получить UPN
из сертификата, поэтому я просто решил вызвать метод с удаленным условием if и повторить все возможные альтернативные имена, такие как Итак:
public static String getSANOtherNameUPN(X509Certificate cert) throws CertificateParsingException
{
Collection<List<?>> subjectAlternativeNames = cert.getSubjectAlternativeNames();
for (List<?> subjectAlternativeName : subjectAlternativeNames)
{
System.out.println(subjectAlternativeName);
}
return null;
}
Вывод выглядит следующим образом:
[0, [B@3cd1a2f1]
[1, Extern.Example.Example@volkswagen.de]
Я думаю, что 0-й элемент - это то, что мне нужно, хотя он совсем не похож на EXAMPLE@vw.vwg
.
Итак, у меня есть 2 вопроса:
- Является ли метод извлечения имени rfc822 правильным?
- Что я получу в качестве 0-го элемента? Это UPN? Если так, как сделать так, чтобы она выглядела как читаемая строка? (желательно без использования сторонних библиотек)
Заранее спасибо!