Вот как это сделать, используя регулярное выражение над cert.getSubjectX500Principal().getName()
, если вы не хотите получать зависимость от BouncyCastle.
Это регулярное выражение будет анализировать различающееся имя, давая name
и val
группы захвата для каждого совпадения.
Когда строки DN содержат запятые, они должны быть заключены в кавычки - это регулярное выражение правильно обрабатывает как строки в кавычках, так и строки в кавычках, а также обрабатывает экранированные кавычки в строках в кавычках:
(?:^|,\s?)(?:(?<name>[A-Z]+)=(?<val>"(?:[^"]|"")+"|[^,]+))+
Вот красиво отформатировано:
(?:^|,\s?)
(?:
(?<name>[A-Z]+)=
(?<val>"(?:[^"]|"")+"|[^,]+)
)+
Вот ссылка, чтобы вы могли увидеть ее в действии:
https://regex101.com/r/zfZX3f/2
Если вы хотите, чтобы регулярное выражение получало только CN, то эта адаптированная версия сделает это:
(?:^|,\s?)(?:CN=(?<val>"(?:[^"]|"")+"|[^,]+))