在我们的 Web 应用程序中,我们将改进证书身份验证机制。
我们曾经使用CN
从证书获取登录和验证用户。
但是,要求已经改变,现在我们建议使用SAN
(主题备用名称)两者UPN
或RFC822 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
。
所以我有两个问题:
- 提取rfc822名称的方法是否正确?
- 我得到什么作为第 0 个元素?是UPN吗?如果是这样,如何使它看起来像一个可读的字符串?(最好不使用第 3 方的库)
提前致谢!