ANS.1的基础总结
ANS.1的基础总结
一、ASN.1定义和作用
1.1 定义
ASN.1描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
1.2 作用
为了解决高级语言中结构化数据在网络传输中的结构关系能送达目的地进行还原,出现了以下几种数据序列化的方法:ASN.1,XML,Json等。
二、ASN.1描述
2.1 数据类型
Integer 、 Bit String 、OCTET String 、Null 、Object Indentifier 、UTF8 String 、Printable String 、UTC time 、Sequence 、 Set 、Choice、ANY等数据类型
除了choice和ANY类型之外的其他数据类型,都有一个标记符。标记符的构成为:
标记符 = 标记符类型 + 标记符ID
2.1.1 标记符类型
类型 | 描述 |
---|---|
Universal | 标准类型 |
Application | 应用相关 |
private | 定义属于特定组织的类型 |
Context-Specify | 上下文的类型,定义特定的结构 |
2.1.2数据类型对应的标记符ID
数据类型 | 标记符ID | 描述 |
---|---|---|
Integer | 0X02 | 全部整数(包含正数和负数) |
REAL | 实数,表示浮点数 | |
ENUMERATED | $1 | 标识符的枚举(实力状态机的状态) |
Bit String | 0X03 | 比特串 |
OCTET String | 0X04 | 字符串 |
Null | 0X05 | 只包含一个值null,用于传送一个报告或者作为choice类型的某些值 |
Object Indentifier | 0X06 | 由注册中心赋予的一个实体的标识符 |
UTF8 String | 0X12 | 各种字符串还有ISO64String等等。。 |
Printable String | 0X13 | |
UTC time | 0X17 | 日期 |
Sequence | 0X30 | 有序集合 |
Set | 0X31 | 无序集合 |
图示:
2.1.3 编码类型
ASN的编码类型有:BER和DER两种类型
BER:是Basic Encoding Rules 的缩写。它定义了一种或者几种方法,将ASN1语法的数据对象转换成二进制字节码。
DER:是Distinguished Encoding Rules的缩写。是唯一的一种方法,将ASN1语法的数据对象转换成二进制字节码。
2.1.3.1 BER的规则TLV
BER传输语法的格式一直是TLV三元组<Type,Length,Value>,也叫做<Tag,Length,Value>。TLV每个域都是一系列八位组,对于组合结构,其中V还可以是TLV三元组。
Type 表示数据类型
Length 表示数据长度
Value 表示数据
== 在上图框内的部分,绿色部分为对象类型ID,蓝色部分为值的长度,黄色部分为值。
如果本结构中还有其他的结构类型,则该值仍为一个三元组组成 ==
2.1.4 CHOICE和ANY类型
2.1.4.1 CHOICE
选择类型。包含一个可供选择的数据类型列表。对于类型能够在事先都知道,可用此类型。
Prize::=CHOICE{
car IA5string,
cash INTEGER,
nothing BOOLEAN }
peter Prize::=TRUE 或者
John Prize::= “ Lincoln ” 或者
Sam Prize::= 25000
2.1.4.1 ANY
如果在定义数据时还不能确定数据类型,可以使用ANY型。ANY型可以被任何ASN.1类型置换。
e.g. TextBook::=SEQUENCE {
author IA5string,
reference ANY}
实例:book1 TextBook ::= {
author "shakespeare ",
reference IA5string " ISBN0669123757 "}
book2 TextBook ::= { author "shakespeare ",
reference INTEGER 1988}
三、ASN.1与证书
3.1 ASN.1、X509v3、证书之间的关系
X509v3定义了证书的结构,里面定义了证书含有哪些信息。
ASN.1定义了证书的语法
X509v3遵循ASN.1语法
类比于ASN.1为java的基础语法和语句。 X509v3为User.java的一个用户模板。这个模板要根据java语法去定义。
3.2 证书结构
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate, -- 证书主体
signatureAlgorithm AlgorithmIdentifier, -- 证书签名算法标识
signatureValue BIT STRING --证书签名值,是使用signatureAlgorithm部分指定的签名算法对tbsCertificate证书主题部分签名后的值.
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, -- 证书版本号
serialNumber CertificateSerialNumber, -- 证书***,对同一CA所颁发的证书,***唯一标识证书
signature AlgorithmIdentifier, --证书签名算法标识
issuer Name, --证书发行者名称
validity Validity, --证书有效期
subject Name, --证书主体名称
subjectPublicKeyInfo SubjectPublicKeyInfo,--证书公钥
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- 证书发行者ID(可选),只在证书版本2、3中才有
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- 证书主体ID(可选),只在证书版本2、3中才有
extensions [3] EXPLICIT Extensions OPTIONAL
-- 证书扩展段(可选),只在证书版本3中才有
}
Version ::= INTEGER { v1(0), v2(1), v3(2) }
CertificateSerialNumber ::= INTEGER
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL }
Parameters:
Dss-Parms ::= SEQUENCE { -- parameters ,DSA(DSS)算法时的parameters,
RSA算法没有此参数
p INTEGER,
q INTEGER,
g INTEGER }
SignatureValue:
Dss-Sig-Value ::= SEQUENCE { -- sha1DSA签名算法时,签名值
r INTEGER,
s INTEGER }
Name ::= CHOICE {
RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue }
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY DEFINED BY AttributeType
Validity ::= SEQUENCE {
notBefore Time, -- 证书有效期起始时间
notAfter Time -- 证书有效期终止时间 }
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }
UniqueIdentifier ::= BIT STRING
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier, -- 公钥算法
subjectPublicKey BIT STRING -- 公钥值
}
SubjectPublicKey:
RSAPublicKey ::= SEQUENCE { -- RSA算法时的公钥值
modulus INTEGER, -- n
publicExponent INTEGER -- e -- }
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }