介紹一下 X.509 數字證書中的擴展項 subjectAltName

        在 RFC 5280《Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile》中定義了 X.509 公鑰數字證書和證書撤銷列表的內容和格式。

        在 X.509 編碼格式的數字證書中,使用 Issuer 子項標明證書的頒發者,Issuer 子項必須包含一個非空的 DN (Distinguished Name) 名,證書中還可以使用擴展項 issuerAltName (即 Issuer Alternative Names 的縮寫) 來表示證書頒發者的其他名稱,issuerAltName 是一個非關鍵的(non-critical)擴展項。

        數字證書使用 Subject 子項標明證書的持有者,並且使用 subjectAltName 擴展項對持有者的身份進行更多的標記和界定,在 subjectAltName 中可以包含有關持有者身份的多條信息。如果證書持有者是一個CA,則 Subject 項不能爲空,必須包含一個 DN 名,該 DN 名必須與該 CA 頒發的所有證書中 Issuer 項的 DN 名相同。

        在 RFC 5280 4.2.1.6.小節 “Subject Alternative Name” 中,定義了 subjectAltName(即Subject Alternative Name,還可以縮寫爲:SAN),它可以包含以下內容:電子郵件地址、域名、IP 地址、URI(Uniform Resource Identifier),而且以上類型的值可以存在一個或多個。如果證書中的 Subject 項的內容爲空,則 CA 在頒發證書時,必須在證書中放入擴展項 subjectAltName,並且應將該擴展項標記爲 critical。當證書中的 Subject 項包含不爲空的 DN 名時,CA 在頒發證書時必須將 subjectAltName 標記爲 non-critical。

        當擴展項 subjectAltName 包含一個電子郵件地址時,郵件地址的格式必須爲 Local-part@Domain 形式,例如 [email protected],注意不能寫成 <Local-part@Domain>,即不要使用尖括號 < 和 > 將郵件地址包起來。類似於 [email protected] 形式的電子郵件地址是合法的,但是像 subscriber.example.com 這種形式的電子郵件地址不允許在SubAltName 中出現。
        當擴展項 subjectAltName 包含一個 IP 地址時,可以使用 IPv4 或 IPv6 形式的地址。
        當擴展項 subjectAltName 包含一個 dNSName 名時,此時證書持有者的名稱是一個域名,這個域名以 IA5String 格式表示,被存儲在 subjectAltName 的 dNSName 子項中。儘管空字符串也是一個合法的域名,但是在 subjectAltName 中不允許使用值爲空串的 dNSName 項。

        在 RFC 5280 中對 subjectAltName 的 ASN.1 編碼定義如下:
id-ce-subjectAltName  OBJECT IDENTIFIER ::= { id-ce 17 }

SubjectAltName  ::=  GeneralNames

GeneralNames  ::=  SEQUENCE SIZE (1..MAX) OF GeneralName

GeneralName  ::=  CHOICE {
    otherName [0]  OtherName,
    rfc822Name [1]  IA5String,
    dNSName [2]  IA5String,
    x400Address [3]  ORAddress,
    directoryName [4]  Name,
    ediPartyName [5]  EDIPartyName,
    uniformResourceIdentifier [6]  IA5String,
    iPAddress [7]  OCTET STRING,
    registeredID [8]  OBJECT IDENTIFIER }

OtherName  ::=  SEQUENCE {
    type-id  OBJECT IDENTIFIER,
    value [0]  EXPLICIT ANY DEFINED BY type-id }

EDIPartyName  ::=  SEQUENCE {
    nameAssigner [0]  DirectoryString OPTIONAL,
    partyName [1]  DirectoryString }

        根據 RFC 6125《Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)》中的規定,當一個網站使用 TLS 證書標記自己的身份時,如果證書中包含 subjectAltName,在識別證書持有者時會忽略 Subject 子項,將以 subjectAltName 中包含的內容來識別證書持有者。在早期頒發的證書中可能未包含 subjectAltName,但是在新頒發的證書中必須包含 subjectAltName 項。最新版本的瀏覽器如 Chrome、Firefox 等在通過 HTTPS 訪問 web 網站時,會對網站證書中的 subjectAltName 項進行檢查,如果未包含該項或該項有問題,Chrome 瀏覽器會報告 NET::ERR_CERT_COMMON_NAME_INVALID 錯誤,並提示“安全證書沒有指定主題備用名稱”。

        對於一張 TLS 證書,如果這張證書將被用於多個網址,則應在 Subject 子項中 CommonName 部分放入一個最重要的URI,並且只能包含一個 URI。可以將所有的 URI 放置到 subjectAltName(即:SAN)中,根據 CA/Browser Forums(即:CA/瀏覽器論壇國際組織)的規定,在 Subject 子項 CommonName 部分出現的 URI 必須在 SAN 中再次出現,而且通常出現在“SAN DNS Name=...”列表中第一個元素的位置。瀏覽器會檢查當前訪問的網址是否與證書中 SAN 擴展項裏包含的 DNS Name 列表中的某一個網址相符,如果不符就會報錯。

        下面看一個示例,在 Chrome 瀏覽器中訪問 GitHub 網站,並查看證書,如下圖:

        證書中的 Subject 子項內容如下:

        然後查看 SAN 項的內容,結果如下圖:

        可以看到 SAN 項中包含兩個 DNS Name=... 的條目,並且第一條內容與 subject 項的 CN (即 CommonName)的值相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章