X.509证书:网络世界的身份守护者
这篇文章的来源呢,来自于群友的一个问题,我们来还原一下当时的问题场景,这里我针对原始的内容进行了替换,具体的内容还是自己生成一个吧。
情景再现
MIIDSTCCAjECFFH+a6cvfUiR+bgGNUqdggKUpo2+MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNVBAYTAnh4MQswCQYDVQQIDAJ4eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQswCQYDVQQLDAJ4eDELMAkGA1UEAwwCeHgxETAPBgkqhkiG9w0BCQEWAnh4MB4XDTI0MDQyMDEzNDc0OVoXDTI1MDQyMDEzNDc0OVowYTELMAkGA1UEBhMCeHgxCzAJBgNVBAgMAnh4MQswCQYDVQQHDAJ4eDELMAkGA1UECgwCeHgxCzAJBgNVBAsMAnh4MQswCQYDVQQDDAJ4eDERMA8GCSqGSIb3DQEJARYCeHgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCyydgta6W8ybll4rRq+aS/MlISerEgYWU2J0fvqxlIE5hBC8VNBy9MrJd0PH+A3oK+G66dWcgE80Qdapl8/VwVvQ+U7ruuq7c67ZAuPVcftOFPXG/JAIhD8zIXq/jssceYLDF6qQH2gLO/tHBO9k8ToOAgvbjdx4ULnyrqEJl202FIIcPEBtqZ49RoFkdlZFRu3mB+iL06mr8Ym4Ccd//yUlDMoO7LXsXBSiTQ9HGQo2mcANTFpESvkX1EmHrSu0c+OIuToaJ5+BuTPwPvS9n7k7xMrnF2lcc9n7ZBCdG19HhMH9bUTZd0RTuei65bhgs3vL6UNajL+Fx6CfN33GMfAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAJOUxlTXYYpZprG8dBLSFE4BfbXguZ3HfRsMwWcrnOAqvgUK35+dlHxsgCrfxEseMme0D6+i4QCX0PSxDKIMxYEMkEUb8xNAZKzjB8keM5aTd8MA4KFjoJA0ygiRaRdIGrG8GtczxR9t4iq08aBO//nm0dUWEplHL3jUJh8kkhd3QiMa+WnVEYi0XmYAVUyQItvZOZGEOfeoY85dU21ui+/PBY0paS3ETkGAM9PhhZn3CfsbEbhxmDByb6WNA3riUaE87xYHmGJY3fWHozGOnSF/gFa1Arkqk1OBLGV0OddVa4o6Hmwhy7RPwZ0eR2EGf05kRC0ElpvUgKess51b5pY=
从问题描述来看,这个是一个公钥,又到了惊喜的看字母猜算法环节,好了,尝试一下,咱能不能给猜出来吧。
猜测过程
首先呢,看base64很大概率是看不出来什么的,这里先给转换成为hex来看一下。
看到,开头,基本上就用了定论,这大概率是一个证书的文件,那么后面就尝试来解析一下吧,这里直接采用openssl来对于这个东西进行一下处理。
echo "30 82 03 49 30 82 02 31 02 14 51 fe 6b a7 2f 7d 48 91 f9 b8 06 35 4a 9d 82 02 94 a6 8d be 30 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 61 31 0b 30 09 06 03 55 04 06 13 02 78 78 31 0b 30 09 06 03 55 04 08 0c 02 78 78 31 0b 30 09 06 03 55 04 07 0c 02 78 78 31 0b 30 09 06 03 55 04 0a 0c 02 78 78 31 0b 30 09 06 03 55 04 0b 0c 02 78 78 31 0b 30 09 06 03 55 04 03 0c 02 78 78 31 11 30 0f 06 09 2a 86 48 86 f7 0d 01 09 01 16 02 78 78 30 1e 17 0d 32 34 30 34 32 30 31 33 34 37 34 39 5a 17 0d 32 35 30 34 32 30 31 33 34 37 34 39 5a 30 61 31 0b 30 09 06 03 55 04 06 13 02 78 78 31 0b 30 09 06 03 55 04 08 0c 02 78 78 31 0b 30 09 06 03 55 04 07 0c 02 78 78 31 0b 30 09 06 03 55 04 0a 0c 02 78 78 31 0b 30 09 06 03 55 04 0b 0c 02 78 78 31 0b 30 09 06 03 55 04 03 0c 02 78 78 31 11 30 0f 06 09 2a 86 48 86 f7 0d 01 09 01 16 02 78 78 30 82 01 22 30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00 03 82 01 0f 00 30 82 01 0a 02 82 01 01 00 b2 c9 d8 2d 6b a5 bc c9 b9 65 e2 b4 6a f9 a4 bf 32 52 12 7a b1 20 61 65 36 27 47 ef ab 19 48 13 98 41 0b c5 4d 07 2f 4c ac 97 74 3c 7f 80 de 82 be 1b ae 9d 59 c8 04 f3 44 1d 6a 99 7c fd 5c 15 bd 0f 94 ee bb ae ab b7 3a ed 90 2e 3d 57 1f b4 e1 4f 5c 6f c9 00 88 43 f3 32 17 ab f8 ec b1 c7 98 2c 31 7a a9 01 f6 80 b3 bf b4 70 4e f6 4f 13 a0 e0 20 bd b8 dd c7 85 0b 9f 2a ea 10 99 76 d3 61 48 21 c3 c4 06 da 99 e3 d4 68 16 47 65 64 54 6e de 60 7e 88 bd 3a 9a bf 18 9b 80 9c 77 ff f2 52 50 cc a0 ee cb 5e c5 c1 4a 24 d0 f4 71 90 a3 69 9c 00 d4 c5 a4 44 af 91 7d 44 98 7a d2 bb 47 3e 38 8b 93 a1 a2 79 f8 1b 93 3f 03 ef 4b d9 fb 93 bc 4c ae 71 76 95 c7 3d 9f b6 41 09 d1 b5 f4 78 4c 1f d6 d4 4d 97 74 45 3b 9e 8b ae 5b 86 0b 37 bc be 94 35 a8 cb f8 5c 7a 09 f3 77 dc 63 1f 02 03 01 00 01 30 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 03 82 01 01 00 93 94 c6 54 d7 61 8a 59 a6 b1 bc 74 12 d2 14 4e 01 7d b5 e0 b9 9d c7 7d 1b 0c c1 67 2b 9c e0 2a be 05 0a df 9f 9d 94 7c 6c 80 2a df c4 4b 1e 32 67 b4 0f af a2 e1 00 97 d0 f4 b1 0c a2 0c c5 81 0c 90 45 1b f3 13 40 64 ac e3 07 c9 1e 33 96 93 77 c3 00 e0 a1 63 a0 90 34 ca 08 91 69 17 48 1a b1 bc 1a d7 33 c5 1f 6d e2 2a b4 f1 a0 4e ff f9 e6 d1 d5 16 12 99 47 2f 78 d4 26 1f 24 92 17 77 42 23 1a f9 69 d5 11 88 b4 5e 66 00 55 4c 90 22 db d9 39 91 84 39 f7 a8 63 ce 5d 53 6d 6e 8b ef cf 05 8d 29 69 2d c4 4e 41 80 33 d3 e1 85 99 f7 09 fb 1b 11 b8 71 98 30 72 6f a5 8d 03 7a e2 51 a1 3c ef 16 07 98 62 58 dd f5 87 a3 31 8e 9d 21 7f 80 56 b5 02 b9 2a 93 53 81 2c 65 74 39 d7 55 6b 8a 3a 1e 6c 21 cb b4 4f c1 9d 1e 47 61 06 7f 4e 64 44 2d 04 96 9b d4 80 a7 ac b3 9d 5b e6 96" | xxd -r -ps > output.der
小处理一下,然后呢,我们尝试来解析一下。
openssl asn1parse -in output.der -inform DER
不出意外,一发猜中了,好了,本篇文章到这里就结束了,感谢大家的观看。
好了,这文章到这里,结束的话,可能读者又要来说,你这又双叒叕来水文章了,为了让读者多看一会呢,故事那肯定还没有结束。
这里,已经猜测到了具体的格式,那么,问题又来了,这个应该如何生成呢,那么我们还是来借助openssl这个工具,可以非常方便的生成这个证书。
openssl genrsa -out private_key.pem 2048
openssl req -new -key private_key.pem -out request.csr
openssl x509 -signkey private_key.pem -in request.csr -req -days 365 -out certificate.pem
好了,故事就结束了,我们来看一下这个证书的吧。
什么是X509证书
想象一下,你正走在一个充满神秘商店的巷子里,每个店铺都闪烁着诱人的商品和令人难以抗拒的优惠。但在你决定进入其中一个店铺之前,你需要确定这个地方是安全的,不会在你掏出钱包时就立刻变成一个陷阱。在这个数字化时代,X.509证书就像是那些商店门口挂着的“值得信赖”的标志,向你保证这是一个安全的交易场所。但有谁真的停下来仔细看过这个标志是什么样子,又是怎样挂上去的呢?
定义
X.509证书是一种电子证书,它采用了X.509公钥基础设施(PKI)标准来验证实体的身份,无论是个人、公司还是服务器。该证书包含了公钥以及证书颁发机构(CA)对持有者身份的数字签名,以确保公钥的真实性和可信度。
X.509证书用于各种安全协议,包括安全套接字层(SSL)/传输层安全性(TLS),这些协议保护因特网上的通信。证书使得数据传输可以在加密的信道上进行,同时保证发送和接收消息方的身份得到认证。
组成部分
这里,简单介绍一下,证书所有的部分,当然,这里仅仅是简单介绍一下,从rfc里面给薅出来的,详细的还是去翻rfc吧。
「1. 证书」
「证书版本号(Version)」:指明证书遵循的X.509版本,如V1、V2或V3。 「序列号(Serial Number)」:发行者为每个证书分配的唯一编号。 「签名算法ID(Signature Algorithm ID)」:用于签署证书的算法。 「颁发者(Issuer)」:颁发并签署该证书的实体或机构的名称。 「有效期(Validity)」:包括开始日期和结束日期,即证书的生命周期。 「Not Before」:证书生效日期。 「Not After」:证书过期日期。 「主体(Subject)」:证书所指的实体(个人、服务器、组织)的信息。 「主体公钥信息(Subject Public Key Info)」 「公钥算法」:密钥所使用的算法 「主体公钥」:证书拥有者的公钥。
「2. 颁发者独有的ID」(如果存在)
「3. 主体独有的ID」(如果存在)
「4. 扩展」(仅限v3)
「扩展是可选的」,但在现代证书中非常常见,用于提供额外的功能和信息。 「扩展包括」: 「基本约束」(Basic Constraints):标识证书是否为CA证书。 「密钥使用」(Key Usage):限制公钥的使用范围。 「扩展密钥使用」(Extended Key Usage):更具体地限制证书的使用场景。 「证书策略」(Certificate Policies):证书使用的规则和政策。 「主题备用名称」(Subject Alternative Name):其他用于标识证书主体的名称。 「颁发者备用名称」(Issuer Alternative Name):其他用于标识证书颁发者的名称。 「证书吊销列表(CRL)分发点」:指向证书吊销列表的URL。 「权威信息访问」(Authority Information Access):如何获取证书的颁发者信息。
「5. 证书签名算法」(Signature Algorithm)
「签名算法」:用于证书签名的算法。 「签名」:颁发者对证书信息签名的数字签名。
针对于,这个的详细内容,这里就不扩展来讲了,后面如果有读者对这个感兴趣,可能单独出一篇文章,不过吧,感觉展开讲就像翻译rfc了,也怪无聊的。
编码格式
证书编码是指将证书数据结构转换为可传输和存储的格式的过程。X.509证书通常使用ASN.1(Abstract Syntax Notation One)语法来描述其结构,并使用DER或PEM格式对此结构进行编码。其实有关于ASN.1和PEM、DER呢,在之前讲解RSA的公钥格式的时候,就已经展开讲过了,这里先不展开讲了。
「DER 编码」
DER(Distinguished Encoding Rules)是ASN.1结构的一个严格编码规则,用于产生唯一的、不含冗余信息的二进制序列。 它确保了同一个ASN.1描述的结构在每次编码时都产生相同的字节序列,这是数字签名校验的关键要素。 在X.509证书中,这种编码用于确保证书的完整性和验证性,因为任何微小的变化都会导致编码结果不同,进而被验证过程所检测。
PEM(Privacy-Enhanced Mail)是一种基于文本的编码格式,它使用Base64编码将二进制数据转换为ASCII字符串。 PEM格式通常包含一个明确的开始("-----BEGIN CERTIFICATE-----")和结束("-----END CERTIFICATE-----")标记,这让系统能够容易地识别证书内容的开始和结束。 除了证书本身,PEM格式也经常用于编码公钥和私钥。 在X.509证书中,通常首先使用DER编码,然后将得到的数据转换为PEM格式,以便于在不同的系统和应用程序间轻松共享。
通常,证书的颁发机构会提供DER格式的证书文件,但是一些服务和应用程序可能需要PEM格式。
可以使用开源工具如OpenSSL进行格式转换,例如,从DER转换到PEM格式,命令可能如下:
复制
openssl x509 -inform der -in certificate.der -outform pem -out certificate.pem
然后呢,其实本文开头的问题,生成的就是这个东西,这里摘一个ASN.1的具体描述来看看吧。
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber INTEGER,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time
}
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime
}
UniqueIdentifier ::= BIT STRING
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING
-- contains the DER encoding of an ASN.1 value
-- corresponding to the extension type identified
-- by extnID
}
然后,简单描述一下每一部分的作用。
**tbsCertificate (To Be Signed Certificate)**:这部分包含了证书中所有需要被签名的信息,包括以下字段:
「version」:证书版本号,可以是1(v1)、2(v2)或3(v3)。 「serialNumber」:签发证书的CA分配的一个独一无二的序列号。 「signature」:用于证书签名的算法标识。 「issuer」:签发证书的实体的名称。 「validity」:证书有效期,包含起始日期(notBefore)和结束日期(notAfter)。 「subject」:证书主体的名称,即证书的拥有者。 「subjectPublicKeyInfo」:包含公钥及其算法的信息。 「issuerUniqueID」 和 「subjectUniqueID」(可选):为证书v2和v3版本添加的唯一标识符。 「extensions」(可选,仅v3):可用于添加额外信息的扩展字段。
总结
在数字世界的宽广道路上,X.509证书如同一盏明灯,守护着每一次数据的往来,确保信息像星辰般安全地在网络的海洋中航行。通过精妙设计的ASN.1语言编织而成,这些证书承载着信任的重量,以一串串看似冰冷的二进制数字,实则蕴含着精密逻辑与严格秩序的信息结构,让不同的系统能够以一种几乎诗意的和谐共鸣,相互识别和理解。好了,实在文艺不下去了,本文章,到这里就真的结束了,感谢读者能阅读到这里。
参考资料
D. Cooper, S. Santesson, S. Farrell, S. Boeyen, R. Housley, & W. Polk. (2008). Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. RFC 5280. https://doi.org/10.17487/RFC5280 S. Turner, & P. Hoffman. (2013). Updates to the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. RFC 6818. https://doi.org/10.17487/RFC6818 S. Josefsson, & S. Leonard. (2015). Textual Encodings of PKIX, PKCS, and CMS Structures. RFC 7468. https://doi.org/10.17487/RFC7468 J. Jonsson, & B. Kaliski. (2003). Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1. RFC 3447. https://doi.org/10.17487/RFC3447 R. Housley, W. Ford, W. Polk, & D. Solo. (1999). Internet X.509 Public Key Infrastructure Certificate and CRL Profile. RFC 2459. https://doi.org/10.17487/RFC2459
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...