Java 为什么jetty将证书主题参数S转换为ST?

Java 为什么jetty将证书主题参数S转换为ST?,java,ssl,jetty,ssl-certificate,Java,Ssl,Jetty,Ssl Certificate,我正在使用科目证书 CN = operator-1505 O = Test org L = Moscow S = Moscow C = RU 但当我试图在servlet中获取此证书时: @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { X509Certificate[]

我正在使用科目证书

CN = operator-1505
O = Test org
L = Moscow
S = Moscow
C = RU
但当我试图在servlet中获取此证书时:

    @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);
        }
    }
证书
变量中的主题为:

CN=operator-1505, O=Test org, L=Moscow, ST=Moscow, C=RU
为什么jetty将S参数转换为ST?

证书中没有
S
(或
ST
)。它包含的是对象标识符(OID)

OpenSSL曾经说过,这个OID的缩写形式的权威答案是“ST”,但微软使用的是“S”

可能是两个不同的RFC以不同的简短形式引用了相同的OID,而每个库最终都有自己的答案来说明该特定值的用途

如果您可以使用OID值打印名称,这些OID值在不同的环境中应该是稳定的,否则您可能需要找到一种方法来匹配
S=
ST=

编辑:我很高兴地注意到(2012/10)说“ST”是正确答案,而使用S=作为示例:

6.3.3州或省名称

“州或省名称”属性类型指定州或省。当用作目录名的一个组成部分时,它标识了一个地理分区,命名对象位于该分区的物理位置或以其他重要方式与其关联

州或省名称的属性值是字符串,例如,S=“Ohio”

(强调我的,遗憾的是我不能同时强调“LDAP-NAME{“st”}”和保留空格)

stateOrProvinceName ATTRIBUTE ::= {
  SUBTYPE OF name
  WITH SYNTAX UnboundedDirectoryString
  LDAP-SYNTAX directoryString.&id
  LDAP-NAME {"st"}
  ID id-at-stateOrProvinceName }