X.509证书中的“通用名称”属性允许使用哪些字符串?

42

在X509证书的DN中,常用名称字段,根据OID "2.5.4.3"的ASN.1表示法,允许哪些值?

我知道限制是最多64个字符,但是否允许使用所有字符?数字?
例如:是否允许使用.符号?IP地址(x.x.x.x)是否符合ASN定义的有效序列?
是否允许使用域名?


2
标准允许在通用名称中使用几乎任何字符串。字符串的含义取决于其解释。 - President James K. Polk
1
@GregS:如果是这样的话,为什么这是一条评论而不是答案? - Cratylus
@GregS:您指的是哪个标准?因为我对ASN符号中声明的类型很感兴趣。 - Cratylus
1
哦,抱歉,我在阅读RFC 5280。我没有写成回答,因为我认为它不够详细。 - President James K. Polk
4个回答

67

Distinguished Name 中的通用名称属性编码方式为:

X520CommonName ::= CHOICE {
      teletexString     TeletexString   (SIZE (1..ub-common-name)),
      printableString   PrintableString (SIZE (1..ub-common-name)),
      universalString   UniversalString (SIZE (1..ub-common-name)),
      utf8String        UTF8String      (SIZE (1..ub-common-name)),
      bmpString         BMPString       (SIZE (1..ub-common-name)) }

其中ub-common-name为64。最后三种编码允许使用所有Unicode码点(对于超过0xFFFF的码点,使用UTF-16和bmpString);UTF-8是首选编码(至少标准中是这样规定的)。

就X.509而言(参见RFC 5280),DN元素的内容在相等比较之外无关紧要;这意味着您可以放置任何字符序列,只要您保持一致即可。RFC 5280强制使用UTF-8编码的名称元素进行大小写不敏感的比较,在Unicode的一般上下文中并不容易:请参见第7.1节,其中链接到RFC 45183454。此外,“常用名称”通常会显示给用户(至少在使用具有显示和实际用户的X.509证书的系统上),因此您可能希望使用有意义或至少不太可怕的字符串,并尝试避免非拉丁脚本。

将DNS名称放入“常用名称”属性中是HTTPS服务器证书的常见实践:请参见RFC 2818(服务器证书包含服务器名称,客户端将其与URL中的服务器名称进行匹配;通常,Subject Alt Name扩展更受客户端支持,但常用名称在客户端中的支持范围略有广泛)。


非常详尽并且有很好的参考答案。 - this.josh
这回答了我长期以来一直在问的问题,而且我还没有找到答案。RFC的参考尤其有用。 - Jon Trauntvein
有人能提供一个使用除DNS名称以外的东西作为通用名称的网站链接吗?(因此,站点名称必须在SAN中) - Jeff Puckett
@JeffPuckett 我检查了很多,最接近的是 www-cs-01.oracle.com,它用于 www.oracle.com,所以 CN 不同于 DNS 名称,尽管这不是你要问的。由于 CA 通常从门户网站颁发证书,而门户网站在历史上使用 CN 中的域,我认为你很难找到一个在那里有其他内容而不是 DNS 名称的站点。即使是相对较新的 CA letsencrypt.org 也遵循这个惯例。 - tresf

8
虽然上述答案涵盖了通常在其中找到的内容,但不要忘记,因为这是X.509证书,您实际上可以将几乎任何内容放入其中。例如下面的证书使用0.9.2342.19200300.100.1.5,即“最喜爱的饮料”(请参见https://www.alvestrand.no/objectid/0.9.2342.19200300.100.1.5.html)。OpenSSL理解这一点,因此通用名称显示为CN=example.com/emailAddress=test@example.com/favouriteDrink=tequila。还有许多其他字段可以放在证书通用名称中。
您可以使用openssl x509 -text验证证书是否按照我描述的方式显示。
-----BEGIN CERTIFICATE-----
MIIDOzCCAiOgAwIBAgIBCzANBgkqhkiG9w0BAQUFADCBqzEmMCQGA1UEAxMdV2Vz
dHBvaW50IENlcnRpZmljYXRlIFRlc3QgQ0ExEzARBgNVBAgTCkxhbmNhc2hpcmUx
CzAJBgNVBAYTAlVLMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbTFAMD4G
A1UEChM3V2VzdHBvaW50IENlcnRpZmljYXRlIFRlc3QgUm9vdCBDZXJ0aWZpY2F0
aW9uIEF1dGhvcml0eTAeFw0xMTA3MzEyMTAxMTdaFw0yMTA3MjgyMTAxMTdaMFAx
FDASBgNVBAMTC2V4YW1wbGUuY29tMR8wHQYJKoZIhvcNAQkBFhB0ZXN0QGV4YW1w
bGUuY29tMRcwFQYKCZImiZPyLGQBBRMHdGVxdWlsYTCBnzANBgkqhkiG9w0BAQEF
AAOBjQAwgYkCgYEAuCqI3aNbSkRpA9VuGOmeVQ010Oaawsz4tcW2FQChJDOv6PuT
ucy5IijvaVewotDjnuVzPpBVW5EmC8Qapradomhb6FtFPyH/hGSnhLtht3Ln6stJ
ZkAjvr/wjWDy+3Gy/P5r5weUNWVm2AaQgk2xumx49EIXyzwOEHAhqTE7iEECAwEA
AaNIMEYwCQYDVR0TBAIwADA5BggrBgEFBQcBAQQtMCswKQYIKwYBBQUHMAGGHWh0
dHA6Ly9vY3NwLmV4YW1wbGUuY29tOjg4ODgvMA0GCSqGSIb3DQEBBQUAA4IBAQBL
oz035PphO4yUx7FJVaZjxLgTM4wLrcn2ONGm015/ECO+1Uxj3hWb6/EIDDKV/4e8
x0HDF69zyawYLD1th5tBcZLkV/Dat/Tzkt3boLOCGo2I1P+yjqxlb7BZCk7PEs3+
zjWF2hMcXtAwOIrsRuvXp4eTGwigKLAt/H02US/fa2dXFbOnz91V7oH8ZvynIl/n
hpELPzVWX/pBnHEGA9Bi0jviCKuvQisfaJ8XCiA73qH6CkSoZ2fClnrs+pJNj8i6
vtcMx8htn7FsyB3puVww86JSQ+VDKlQkFbPVla/4Aavzwz8djjVYEWwSgm+tw3jB
zUP/k5Aln5cXNo50KOip
-----END CERTIFICATE-----

该网站的链接由于证书错误而无法加载。 - Jeff Puckett

7
如果您的主要问题是想知道是否(或应该)在Subject DN的Common Name中放置IP地址,答案是否定的。这与X.509格式无关,而与规范如何解释所读内容有关。就HTTPS而言,RFC 2818提到了IP地址:在某些情况下,URI被指定为IP地址而不是主机名。在这种情况下,证书中必须存在iPAddress subjectAltName,并且必须与URI中的IP完全匹配。这意味着CN根本不应用于IP地址,SAN条目类型必须是IP地址,而不是DNS。(一些浏览器可能不会完全实现此功能,因此它们可能更加宽容。Java默认主机名验证程序将很严格。)
最佳实践证书身份验证也已在RFC 6125中定义,但它认为IP地址不在范围内(阅读此部分可了解针对在那里使用IP地址的论据)。 如果您查看有关其他协议的RFC摘录,则某些协议也具有类似的限制,例如LDAP。

DNS对于SAN扩展是有效的。 - TravisThomas
@TravisThomas 确实(在 dNSName 扩展中)。只是为了澄清,我特别回答了关于 IP 地址的部分问题(因为其他部分已经有了其他答案)。 - Bruno

7
“通用名称”属性在X.509证书中允许使用哪些字符串?
我无法回答应该使用哪些字符串,但可以告诉你不允许使用的内容:服务器名称,如主机名(www.example.com),内部名称(如www)和IP地址(如127.0.0.1或100.100.100.100)。
将DNS名称或服务器名称放在通用名称(CN)中已被IETF和CA / Browser论坛废弃。 尽管已过时,但目前尚未禁止使用。 CA / B非常重要,因为这是浏览器遵循的规则 - 浏览器不遵循IETF。
IETF在RFC 6125第2.3节中废弃了这种做法,而CA / B在“基线要求”第9.1.1节中废弃了这种做法。
所有服务器名称都放在“主题备用名称”(SAN)中。 在CA / B基线要求第9.2.1节中,将服务器名称放在SAN中是必需的。 IETF在发行期间更加宽容,在RFC 5280中的6.4.4节下进行验证时需要使用它。

1
太棒了!你能分享一个没有CN中的DNS名称的网站链接吗? - Jeff Puckett
2
@JeffPuckett - 请尝试访问Crypto++网站(http://www.cryptopp.com)。CN被完全省略了。我认为这只是一个偶然事件。我要求一个通用名称为“Crypto ++”,但我认为处理发行的软件过滤了该名称,因为某些脚本可能会将加号解释为正则表达式。唉... - jww
谢谢,太好了!如果你偶然遇到一个具有价值或除DNS名称之外的任何内容的野生对象,请再次联系我。 - Jeff Puckett
@JeffPuckett - 还要记住,CN只是Distinguished Name(DN)的一部分或一块。有两个重要的DN。第一个是主题的DN(颁发证书的对象),第二个是颁发者的DN(谁进行颁发)。整个DN字符串是重要的部分;缺少像CN或State这样的RDN并不太重要。有一个RFC涵盖了DN;它是覆盖目录名称的那个。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接