Я использую a SslServerSocket
и клиентские сертификаты и хотят извлечь CN из SubjectDN от клиента X509Certificate
.
В данный момент я звоню cert.getSubjectX500Principal().getName()
но это, конечно, дает мне, общее количество отформатировало DN клиента. По некоторым причинам я просто интересуюсь CN=theclient
часть DN. Существует ли способ извлечь эту часть DN, не анализируя Строку самостоятельно?
Вы можете попробовать использовать getName (X500Principal.RFC2253, oidMap) или getName (X500Principal.CANONICAL, oidMap)
, чтобы увидеть, какой из них лучше всего форматирует строку DN. Возможно, одно из значений карты oidMap
будет той строкой, которую вы хотите.
Если добавление зависимостей не является проблемой, вы можете сделать это с помощью Bouncy Castle's API для работы с сертификатами X.509:
import org.bouncycastle.asn1.x509.X509Name;
import org.bouncycastle.jce.PrincipalUtil;
import org.bouncycastle.jce.X509Principal;
...
final X509Principal principal = PrincipalUtil.getSubjectX509Principal(cert);
final Vector<?> values = principal.getValues(X509Name.CN);
final String cn = (String) values.get(0);
Обновление
На момент публикации этого сообщения это был способ сделать это. Однако, как упоминает gtrak в комментариях, этот подход теперь устарел. См. обновленный код gtrak'а, использующий новый API Bouncy Castle.