Как сравнить различные реализации java.security.cert.X509Certificate - PullRequest
2 голосов
/ 23 июля 2011

Я использую bouncycastle org.bouncycastle.jce.provider.X509CertificateObject и sun.security.x509.X509CertImpl в разных частях моего приложения, и иногда мне нужно сравнить их на равенство, метод equals () не работает и такие методы, как getSubjectDN (). getName () отображают разные результаты для каждой из этих реализаций, как я могу сравнить эти сертификаты на равенство, не переходя в двоичное сравнение DER или PEM?

Ответы [ 3 ]

5 голосов
/ 25 июля 2011

Безопасный способ определить, равны ли два сертификата, - сравнить их двоичное представление. В реализации Bouncy Castle и Sun реализован метод getEncoded. Вы можете сравнить их с массивами # равно.

Вам следует избегать сравнения строк SubjectDN или IssuerDN, вполне возможно, что представление отличается, даже если на двоичном уровне они совершенно равны. Мне пришлось усвоить этот трудный путь при взаимодействии с .NET - имена отдельных относительных отличительных имен (таких как CN, O, OU ...) отличались для более экзотических RDN. Мой совет - оставаться на бинарном уровне для сравнения, сложные высокоуровневые сравнения подвержены ошибкам и их сложнее поддерживать.

1 голос
/ 26 июля 2011

Другим способом будет сравнение с использованием хэшей MD5 или SHA-1 данных сертификата. Таким образом генерируется отпечаток сертификата, и он дает вам гарантии равенства двух.

0 голосов
/ 15 января 2015

Вы можете попытаться преобразовать сертификат в этом случае клиента (BouncyCastle) в java.security

try {
            byte[] encoded = client.getEncoded();
            ByteArrayInputStream bis = new ByteArrayInputStream(encoded);
            java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory.getInstance("X.509");
            x509CertificateC = (java.security.cert.X509Certificate) cf.generateCertificate(bis);
        } catch (java.security.cert.CertificateEncodingException e) {
        } catch (java.security.cert.CertificateException e) {
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...