0

在我们的 Web 应用程序中,我们将改进证书身份验证机制。

我们曾经使用CN从证书获取登录和验证用户。

但是,要求已经改变,现在我们建议使用SAN(主题备用名称)两者UPNRFC822 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

所以我有两个问题:

  1. 提取rfc822名称的方法是否正确?
  2. 我得到什么作为第 0 个元素?是UPN吗?如果是这样,如何使它看起来像一个可读的字符串?(最好不使用第 3 方的库)

提前致谢!

4

0 回答 0