我使用带主题的证书
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
X509Certificate[] certificates = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
if (certificates != null && certificates.length == 1) {
X509Certificate certificate = certificates[0];
authenticate(certificate, req, resp);
}
}
但是当我试图在我的servlet中获取此证书时:
certificate
CN=operator-1505, O=Test org, L=Moscow, ST=Moscow, C=RU
变量中的主题是:
{{1}}
为什么jetty将S参数转换为ST?
答案 0 :(得分:2)
S
(或ST
)并非真正在证书中。它包含的是对象标识符(OID)2.5.4.8。
OpenSSL过去常常a snarky comment说这个OID的缩写形式的权威答案是“ST”,但微软使用“S”。
可能的情况是,两个不同的RFC引用了具有不同简短形式的相同OID,并且每个库最终都有自己的答案,用于该特定值的使用。
如果您可以使用在各种环境中保持稳定的OID值打印名称,否则您可能只需要在S=
或ST=
上找到匹配方式。
编辑:我很高兴地注意到ITU-T X.520(2012/10)说“ST”是正确答案,而使用S =作为示例:
6.3.3州或省名
州或省名称属性类型指定州或省。当用作目录名的一个组件时,它标识一个地理细分,命名对象在物理上位于该地理细分中,或者以某种其他重要方式与之关联。
State或Province Name的属性值是一个字符串,例如 S =“Ohio”
stateOrProvinceName ATTRIBUTE ::= { SUBTYPE OF name WITH SYNTAX UnboundedDirectoryString LDAP-SYNTAX directoryString.&id LDAP-NAME {"st"} ID id-at-stateOrProvinceName }
(强调我的,遗憾的是我不能拥有“ LDAP-NAME {”st“} ”强调和空白保留“