Oto jak to zrobić, używając wyrażenia regularnego cert.getSubjectX500Principal().getName(), na wypadek, gdybyś nie chciał przyjmować zależności od BouncyCastle.
To wyrażenie regularne przeanalizuje nazwę wyróżniającą, podając namei valprzechwytuj grupy dla każdego dopasowania.
Kiedy łańcuchy DN zawierają przecinki, należy je cytować - to wyrażenie regularne poprawnie obsługuje zarówno cytowane, jak i niecytowane ciągi, a także obsługuje cudzysłowy w cudzysłowach:
(?:^|,\s?)(?:(?<name>[A-Z]+)=(?<val>"(?:[^"]|"")+"|[^,]+))+
Oto ładnie sformatowany:
(?:^|,\s?)
(?:
(?<name>[A-Z]+)=
(?<val>"(?:[^"]|"")+"|[^,]+)
)+
Oto link, dzięki któremu możesz zobaczyć to w akcji:
https://regex101.com/r/zfZX3f/2
Jeśli chcesz, aby wyrażenie regularne otrzymywało tylko CN, zrobi to ta dostosowana wersja:
(?:^|,\s?)(?:CN=(?<val>"(?:[^"]|"")+"|[^,]+))