x509 包

介绍

x509 包提供处理数字证书功能。

使用本包需要外部依赖 OpenSSL 3sslcrypto 动态库文件,故使用前需安装相关工具:

  • 对于 Linux 操作系统,可参考以下方式:
    • 如果系统的包管理工具支持安装 OpenSSL 3 开发工具包,可通过这个方式安装,并确保系统安装目录下含有 libssl.solibssl.so.3libcrypto.solibcrypto.so.3 这些动态库文件,例如 Ubuntu 22.04 系统上可使用 sudo apt install libssl-dev 命令安装 libssl-dev 工具包;
    • 如果无法通过上面的方式安装,可自行下载 OpenSSL 3.x.x 源码编译安装软件包,并确保安装目录下含有 libssl.solibssl.so.3libcrypto.solibcrypto.so.3 这些动态库文件,然后可选择下面任意一种方式来保证系统链接器可以找到这些文件:
      • 在系统未安装 OpenSSL 的场景,安装时选择直接安装到系统路径下;
      • 安装在自定义目录的场景,将这些文件所在目录设置到环境变量 LD_LIBRARY_PATH 以及 LIBRARY_PATH 中。
  • 对于 Windows 操作系统,可按照以下步骤:
    • 自行下载 OpenSSL 3.x.x 源码编译安装 x64 架构软件包或者自行下载安装第三方预编译的供开发人员使用的 OpenSSL 3.x.x 软件包;
    • 确保安装目录下含有 libssl.dll.a(或 libssl.lib)、libssl-3-x64.dlllibcrypto.dll.a(或 libcrypto.lib)、libcrypto-3-x64.dll 这些库文件;
    • libssl.dll.a(或 libssl.lib)、libcrypto.dll.a(或 libcrypto.lib) 所在的目录路径设置到环境变量 LIBRARY_PATH 中,将 libssl-3-x64.dlllibcrypto-3-x64.dll 所在的目录路径设置到环境变量 PATH 中。
  • 对于 macOS 操作系统,可参考以下方式:
    • 使用 brew install openssl@3 安装,并确保系统安装目录下含有 libcrypto.dyliblibcrypto.3.dylib 这两个动态库文件;
    • 如果无法通过上面的方式安装,可自行下载 OpenSSL 3.x.x 源码编译安装软件包,并确保安装目录下含有 libcrypto.dyliblibcrypto.3.dylib 这两个动态库文件,然后可选择下面任意一种方式来保证系统链接器可以找到这些文件:
      • 在系统未安装 OpenSSL 的场景,安装时选择直接安装到系统路径下;
      • 安装在自定义目录的场景,将这些文件所在目录设置到环境变量 DYLD_LIBRARY_PATH 以及 LIBRARY_PATH 中。

如果未安装OpenSSL 3软件包或者安装低版本的软件包,程序可能无法使用并抛出相关异常 X509Exception: Can not load openssl library or function xxx.

主要接口

interface Key

public interface Key <: ToString {
    func encodeToDer(): DerBlob
    func encodeToPem(): PemEntry
    static func decodeDer(encoded: DerBlob): Key
    static func decodeFromPem(text: String): Key
}

公钥用于签名验证或加密,私钥用于签名或解密,公钥和私钥必须相互匹配并形成一对。

该类为密钥类,无具体实现,供 PrivateKey/PublicKey 及用户扩展接口。

func encodeToDer

func encodeToDer(): DerBlob

功能:将密钥编码为 DER 格式。

返回值:密钥数据 DER 格式编码生成的对象

func encodeToPem

func encodeToPem(): PemEntry

功能:将密钥编码为 PEM 格式。

返回值:密钥数据 PEM 格式编码生成的对象

func decodeDer

static func decodeDer(encoded: DerBlob): Key

功能:将密钥从 DER 格式解码。

参数:

  • encoded:DER 格式的对象

返回值:由 DER 格式解码出的密钥

异常:

  • X509Exception : 当 DER 格式的私钥内容不正确,无法解析时抛出异常

func decodeFromPem

static func decodeFromPem(text: String): Key

功能:将密钥从 PEM 格式解码。

参数:

  • text:PEM 格式的字符流

返回值:由 PEM 格式解码出的密钥

interface PublicKey

public interface PublicKey <: Key {
    override func encodeToPem(): PemEntry
    static func decodeDer(blob: DerBlob): PublicKey
    static func decodeFromPem(text: String): PublicKey
}

func encodeToPem

override func encodeToPem(): PemEntry

功能:将公钥编码为 PEM 格式。

返回值:公钥数据 PEM 格式编码生成的对象

func decodeDer

static func decodeDer(blob: DerBlob): PublicKey

功能:将公钥从 DER 格式解码。

参数:

  • blob:DER 格式的公钥对象

返回值:由 DER 格式解码出的公钥

异常:

  • X509Exception : 当 DER 格式的私钥内容不正确,无法解析时抛出异常

func decodeFromPem

static func decodeFromPem(text: String): PublicKey

功能:将公钥从 PEM 格式解码。

参数:

  • text:PEM 格式的公钥字符流

返回值:由 PEM 格式解码出的公钥

异常:

  • X509Exception:字符流不符合 PEM 格式时,或文件头不符合公钥头标准时抛出异常

interface DHParamters

public interface DHParamters <: Key {
    override func encodeToPem(): PemEntry
    static func decodeDer(blob: DerBlob): DHParamters
    static func decodeFromPem(text: String): DHParamters
}

func encodeToPem

override func encodeToPem(): PemEntry

功能:将 DH 密钥参数编码为 PEM 格式。

返回值: DH 密钥参数数据 PEM 格式编码生成的对象

func decodeDer

static func decodeDer(blob: DerBlob): DHParamters

功能:将 DH 密钥参数从 DER 格式解码。

参数:

  • blob:DER 格式的 DH 密钥参数对象

返回值:由 DER 格式解码出的 DH 密钥参数

异常:

  • X509Exception : 当 DER 格式的 DH 密钥参数内容不正确,无法解析时抛出异常

func decodeFromPem

static func decodeFromPem(text: String): DHParamters

功能:将 DH 密钥参数从 PEM 格式解码。

参数:

  • text:PEM 格式的 DH 密钥参数字符流

返回值:由 PEM 格式解码出的 DH 密钥参数

异常:

  • X509Exception:字符流不符合 PEM 格式时,或文件头不符合 DH 密钥参数头标准时抛出异常

interface PrivateKey

public interface PrivateKey <: Key {
    static func decodeDer(blob: DerBlob): PrivateKey
    static func decodeFromPem(text: String): PrivateKey
    static func decodeDer(blob: DerBlob, password!: ?String): PrivateKey
    static func decodeFromPem(text: String, password!: ?String): PrivateKey
    func encodeToDer(password!: ?String): DerBlob
    override func encodeToPem(): PemEntry
    func encodeToPem(password!: ?String): PemEntry
}

func decodeDer

static func decodeDer(blob: DerBlob): PrivateKey

功能:将私钥从 DER 格式解码。

参数:

  • blob:DER 格式的私钥对象

返回值:由 DER 格式解码出的私钥

异常:

  • X509Exception : 当 DER 格式的私钥内容不正确,无法解析时抛出异常

func decodeDer

static func decodeDer(blob: DerBlob, password!: ?String): PrivateKey 

功能:将 DER 格式的私钥解密解码成 PrivateKey 对象,密码为 None 时则不解密。

参数:

  • blob:DER 格式的私钥

  • password:解密密码

返回值:解密解码后的私钥对象

异常:

  • X509Exception:解密解码失败,或者参数密码为空字符串

func decodeFromPem

static func decodeFromPem(text: String): PrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text:PEM 格式的私钥字符流

返回值:由 PEM 格式解码出的私钥

异常:

  • X509Exception:字符流不符合 PEM 格式时,或文件头不符合公钥头标准时抛出异常

func decodeFromPem

static func decodeFromPem(text: String, password!: ?String): PrivateKey 

功能:将 PEM 格式的私钥解密解码成 PrivateKey 对象,密码为 None 时则不解密。

参数:

  • text:PEM 格式的私钥

  • password:解密密码

返回值:解密解码后的私钥对象

异常:

  • X509Exception:解密解码失败,或者参数密码为空字符串

func encodeToDer

func encodeToDer(password!: ?String): DerBlob

功能:将私钥加密编码成 DER 格式,密码为 None 时则不加密。

参数:

  • password:加密密码

返回值:加密后的 DER 格式的私钥

异常:

  • X509Exception:加密失败,或者参数密码为空字符串

func encodeToPem

func encodeToPem(password!: ?String): PemEntry

功能:将私钥加密编码成 PEM 格式,密码为 None 时则不加密。

参数:

  • password:加密密码

返回值:加密后的 PEM 格式的私钥

异常:

  • X509Exception:加密失败,或者参数密码为空字符串

func encodeToPem

override func encodeToPem(): PemEntry

功能:将私钥编码成 PEM 格式。

返回值:编码后的 PEM 格式的私钥

异常:

  • X509Exception:编码失败

type IP

public type IP = Array<Byte>

x509包用 Array<Byte> 来记录 IP

struct SerialNumber

public struct SerialNumber <: Equatable<SerialNumber> & Hashable & ToString {
    public init(length!: UInt8 = 16)
}

结构体 SerialNumber 为数字证书的序列号,是数字证书中的一个唯一标识符,用于标识数字证书的唯一性。根据规范,证书序列号的长度不应超过 20 字节。详见rfc5280

init

public init(length!: UInt8 = 16)

功能:生成指定长度的随机序列号。

参数:

  • length:序列号长度,单位为字节,类型为 UInt8,默认值为 16

异常:

  • X509Exception:length 等于 0 或大于 20 时,抛出异常

func toString

public override func toString(): String

功能:生成证书序列号字符串,格式为 16 进制。

返回值:证书序列号字符串

operator func ==

public override operator func ==(other: SerialNumber): Bool

功能:判等。

参数:

  • other:被比较的证书序列号对象

返回值:若序列号相同,返回 true;否则,返回 false

operator func !=

public override operator func !=(other: SerialNumber): Bool

功能:判不等。

参数:

  • other:被比较的证书序列号对象

返回值:若序列号不同,返回 true;否则,返回 false

func hashCode

public override func hashCode(): Int64

功能:返回证书序列号哈希值。

返回值:对证书序列号对象进行哈希计算后得到的结果

struct X509CertificateInfo

public struct X509CertificateInfo {
    public var serialNumber: SerialNumber
    public var notBefore: DateTime
    public var notAfter: DateTime
    public var subject: ?X509Name
    public var dnsNames: Array<String>
    public var emailAddresses: Array<String>
    public var IPAddresses: Array<IP>
    public var keyUsage: ?KeyUsage
    public var extKeyUsage: ?ExtKeyUsage

    public init(
        serialNumber!: ?SerialNumber = None,
        notBefore!: ?DateTime = None,
        notAfter!: ?DateTime = None,
        subject!: ?X509Name = None,
        dnsNames!: Array<String> = Array<String>(),
        emailAddresses!: Array<String> = Array<String>(),
        IPAddresses!: Array<IP> = Array<IP>(),
        keyUsage!: ?KeyUsage = None,
        extKeyUsage!: ?ExtKeyUsage = None
    )
}

X509CertificateInfo 结构包含了证书信息,包括证书序列号、有效期、实体可辨识名称、域名、email 地址、IP 地址、密钥用法和扩展密钥用法。

serialNumber

public var serialNumber: SerialNumber

功能:记录证书的序列号

notBefore

public var notBefore: DateTime

功能:记录证书有效期的起始日期

notAfter

public var notAfter: DateTime

功能:记录证书有效期的结束日期

subject

public var subject: ?X509Name

功能:记录证书实体可辨识名称

dnsNames

public var dnsNames: Array<String>

功能:记录证书的 DNS 域名

emailAddresses

public var emailAddresses: Array<String>

功能:记录证书的 email 地址

IPAddresses

public var IPAddresses: Array<IP>

功能:记录证书的 IP 地址

keyUsage

public var keyUsage: ?KeyUsage

功能:记录证书的密钥用法

extKeyUsage

public var extKeyUsage: ?ExtKeyUsage

功能:记录证书的扩展密钥用法

init

public init(
    serialNumber!: ?SerialNumber = None,
    notBefore!: ?DateTime = None,
    notAfter!: ?DateTime = None,
    subject!: ?X509Name = None,
    dnsNames!: Array<String> = Array<String>(),
    emailAddresses!: Array<String> = Array<String>(),
    IPAddresses!: Array<IP> = Array<IP>(),
    keyUsage!: ?KeyUsage = None,
    extKeyUsage!: ?ExtKeyUsage = None
)

功能:构造 X509CertificateInfo 对象。

参数:

  • serialNumber:数字证书序列号,默认值为 None,使用默认值时默认的序列号长度为 128 比特
  • notBefore:数字证书有效期开始时间,默认值为 None,使用默认值时默认的时间为 X509CertificateInfo 创建的时间
  • notAfter:数字证书有效期截止时间,默认值为 None,使用默认值时默认的时间为 notBefore 往后 1 年的时间
  • subject:数字证书使用者信息,默认值为 None
  • dnsNames:域名列表,需要用户保证输入域名的有效性,默认值为空的字符串数组
  • emailAddresses:email 地址列表,需要用户保证输入 email 的有效性,默认值为空的字符串数组
  • IPAddresses:IP 地址列表,默认值为空的 IP 数组
  • keyUsage:密钥用法,默认值为 None
  • extKeyUsage:扩展密钥用法,默认值为 None

异常:

  • X509Exception:输入的 IP 地址列表中包含无效的 IP 地址,则抛出异常

class X509Certificate

public class X509Certificate <: Equatable<X509Certificate> & Hashable & ToString {
    public init(
        certificateInfo: X509CertificateInfo,
        parent!: X509Certificate,
        publicKey!: PublicKey,
        privateKey!: PrivateKey,
        signatureAlgorithm!: ?SignatureAlgorithm = None
    )

    public func encodeToDer(): DerBlob
    public func encodeToPem(): PemEntry
    public static func decodeFromDer(der: DerBlob): X509Certificate
    public static func decodeFromPem(pem: String): Array<X509Certificate>
    public static func systemRootCerts(): Array<X509Certificate>

    public prop serialNumber: SerialNumber
    public prop signatureAlgorithm: SignatureAlgorithm
    public prop signature: Signature
    public prop issuer: X509Name
    public prop subject: X509Name
    public prop notBefore: DateTime
    public prop notAfter: DateTime
    public prop publicKeyAlgorithm: PublicKeyAlgorithm
    public prop publicKey: PublicKey
    public prop dnsNames: Array<String>
    public prop emailAddresses: Array<String>
    public prop IPAddresses: Array<IP>
    public prop keyUsage: KeyUsage
    public prop extKeyUsage: ExtKeyUsage

    public func verify(verifyOption: VerifyOption): Bool

    public override func toString(): String
    public override operator func ==(other: X509Certificate): Bool
    public override operator func !=(other: X509Certificate): Bool
    public override func hashCode(): Int64
}

X509 数字证书是一种用于加密通信的数字证书,它是公钥基础设施(PKI)的核心组件之一。X509 数字证书包含了一个实体的公钥和身份信息,用于验证该实体的身份和确保通信的安全性。

init

public init(
    certificateInfo: X509CertificateInfo,
    parent!: X509Certificate,
    publicKey!: PublicKey,
    privateKey!: PrivateKey,
    signatureAlgorithm!: ?SignatureAlgorithm = None
)

功能:创建数字证书对象。

参数:

  • certificateInfo:数字证书配置信息,类型为 X509CertificateInfo
  • parent:颁发者证书,类型为 X509Certificate
  • publicKey:申请人公钥,类型为 PublicKey,仅支持 RSA、ECDSA 和 DSA 公钥
  • privateKey:颁发者私钥,类型为 PrivateKey,仅支持 RSA、ECDSA 和 DSA 私钥
  • signatureAlgorithm:证书签名算法,默认值为 None,使用默认值时默认的摘要类型是 SHA256

异常:

  • X509Exception: 公钥或私钥类型不支持、私钥类型和证书签名算法中的私钥类型不匹配或数字证书信息设置失败时,抛出异常

func encodeToDer

public func encodeToDer(): DerBlob

功能:将数字证书编码成 Der 格式。

返回值:编码后的 Der 格式的数字证书

func encodeToPem

public func encodeToPem(): PemEntry

功能:将数字证书编码成 PEM 格式。

返回值:编码后的 PEM 格式的数字证书

func decodeFromDer

public static func decodeFromDer(der: DerBlob): X509Certificate

功能:将 DER 格式的数字证书解码。

参数:

  • der:DER 格式的二进制数据

返回值:由 DER 格式解码出的数字证书

异常:

  • X509Exception:数据为空时,或数据不是有效的数字证书 DER 格式时抛出异常

func decodeFromPem

public static func decodeFromPem(pem: String): Array<X509Certificate>

功能:将数字证书从 PEM 格式解码。

参数:

  • pem:PEM 格式的数字证书字符流

返回值:由 PEM 格式解码出的数字证书数组

异常:

  • X509Exception:字符流不符合 PEM 格式时,或文件头不符合数字证书头标准时抛出异常

func systemRootCerts

public static func systemRootCerts(): Array<X509Certificate>

功能:返回操作系统的根证书链。支持 linux,macOS 和 windows 平台。

返回值:操作系统的根证书链

prop serialNumber

public prop serialNumber: SerialNumber

功能:解析数字证书的序列号。

返回值:数字证书的序列号,类型为 SerialNumber

prop signatureAlgorithm

public prop signatureAlgorithm: SignatureAlgorithm

功能:解析数字证书的签名算法。

返回值:数字证书的签名算法,类型为 SignatureAlgorithm

prop signature

public prop signature: Signature

功能:解析数字证书的签名。

返回值:数字证书的签名,类型为 Signature

prop issuer

public prop issuer: X509Name

功能:解析数字证书的颁发者信息。

返回值:数字证书的颁发者信息,类型为 X509Name

prop subject

public prop subject: X509Name

功能:解析数字证书的使用者信息。

返回值:数字证书的使用者信息,类型为 X509Name

prop notBefore

public prop notBefore: DateTime

功能:解析数字证书的有效期开始时间。

返回值:数字证书的有效期开始时间,类型为 DateTime

prop notAfter

public prop notAfter: DateTime

功能:解析数字证书的有效期截止时间。

返回值:数字证书的有效期截止时间,类型为 DateTime

prop publicKeyAlgorithm

public prop publicKeyAlgorithm: PublicKeyAlgorithm

功能:解析数字证书的公钥算法。

返回值:数字证书的公钥算法,类型为 PublicKeyAlgorithm

prop publicKey

public prop publicKey: PublicKey

功能:解析数字证书的公钥。

返回值:数字证书的公钥,类型为 PublicKey

prop dnsNames

public prop dnsNames: Array<String>

功能:解析数字证书备选名称中的域名。

返回值:数字证书备选名称中的域名,类型为 Array

prop emailAddresses

public prop emailAddresses: Array<String>

功能:解析数字证书备选名称中的 email 地址。

返回值:数字证书备选名称中的 email 地址,类型为 Array

prop IPAddresses

public prop IPAddresses: Array<IP>

功能:解析数字证书备选名称中的 IP 地址。

返回值:数字证书备选名称中的 IP 地址,类型为 Array

prop keyUsage

public prop keyUsage: KeyUsage

功能:解析数字证书中的密钥用法。

返回值:数字证书中的密钥用法,类型为 KeyUsage

prop extKeyUsage

public prop extKeyUsage: ExtKeyUsage

功能:解析数字证书中的扩展密钥用法。

返回值:数字证书中的扩展密钥用法,类型为 ExtKeyUsage

func verify

public func verify(verifyOption: VerifyOption): Bool

功能:根据验证选项验证当前证书的有效性,验证优先级:

  1. 优先验证有效期;
  2. 可选验证DNS域名;
  3. 最后根据根证书和中间证书验证其有效性。

参数:

  • verifyOption:证书验证选项

返回值:证书有效返回 true,否则返回 false

异常:

  • X509Exception:检验过程中失败,比如内存分配异常等内部错误,则抛出异常

func toString

public override func toString(): String

功能:生成证书名称字符串,包含证书的使用者信息、有效期以及颁发者信息。

返回值:证书名称字符串

operator func ==

public override operator func ==(other: X509Certificate): Bool

功能:判等。

参数:

  • other:被比较的证书对象

返回值:若证书相同,返回 true;否则,返回 false

operator func !=

public override operator func !=(other: X509Certificate): Bool

功能:判不等。

参数:

  • other:被比较的证书对象

返回值:若证书不同,返回 true;否则,返回 false

func hashCode

public override func hashCode(): Int64

功能:返回证书哈希值。

返回值:对证书对象进行哈希计算后得到的结果

struct X509CertificateRequestInfo

public struct X509CertificateRequestInfo {
    public var subject: ?X509Name
    public var dnsNames: Array<String>
    public var emailAddresses: Array<String>
    public var IPAddresses: Array<IP>
 
    public init(
        subject!: ?X509Name = None,
        dnsNames!: Array<String> = Array<String>(),
        emailAddresses!: Array<String> = Array<String>(),
        IPAddresses!: Array<IP> = Array<IP>()
    )

X509CertificateRequestInfo 结构包含了证书请求信息,包括证书实体可辨识名称、域名、email 地址和 IP 地址。

subject

public var subject: ?X509Name

功能:记录证书签名请求的实体可辨识名称

dnsNames

public var dnsNames: Array<String>

功能:记录证书签名请求的 DNS 域名

emailAddresses

public var emailAddresses: Array<String>

功能:记录证书签名请求的 email 地址

IPAddresses

public var IPAddresses: Array<IP>

功能:记录证书签名请求的 IP 地址

init

public init(
    subject!: ?X509Name = None,
    dnsNames!: Array<String> = Array<String>(),
    emailAddresses!: Array<String> = Array<String>(),
    IPAddresses!: Array<IP> = Array<IP>()
)

功能:构造 X509CertificateRequestInfo 对象。

参数:

  • subject:数字证书的使用者信息,默认值为 None
  • dnsNames:域名列表,需要用户保证输入域名的有效性,默认值为空的字符串数组
  • emailAddresses:email 地址列表,需要用户保证输入 email 的有效性,默认值为空的字符串数组
  • IPAddresses:IP 地址列表,默认值为空的 IP 数组

异常:

  • X509Exception:输入的 IP 地址列表中包含无效的 IP 地址,则抛出异常

class X509CertificateRequest

public class X509CertificateRequest <: Hashable & ToString {
    public init(
        privateKey: PrivateKey,
        certificateRequestInfo!: ?X509CertificateRequestInfo = None,
        signatureAlgorithm!: ?SignatureAlgorithm = None
    )
    public func encodeToDer(): DerBlob
    public func encodeToPem(): PemEntry
    public static func decodeFromDer(der: DerBlob): X509CertificateRequest
    public static func decodeFromPem(pem: String): Array<X509CertificateRequest>
    public prop signatureAlgorithm: SignatureAlgorithm
    public prop signature: Signature
    public prop publicKeyAlgorithm: PublicKeyAlgorithm
    public prop publicKey: PublicKey
    public prop subject: X509Name
    public prop dnsNames: Array<String>
    public prop emailAddresses: Array<String>
    public prop IPAddresses: Array<IP>
    public override func toString(): String
    public override func hashCode(): Int64

init

public init(
    privateKey: PrivateKey,
    certificateRequestInfo!: ?X509CertificateRequestInfo = None,
    signatureAlgorithm!: ?SignatureAlgorithm = None
)

功能:创建数字证书签名请求对象。

参数:

  • privateKey:私钥,仅支持 RSA、ECDSA 和 DSA 私钥
  • certificateRequestInfo:数字证书签名信息,默认值为 None
  • signatureAlgorithm:证书签名算法,默认值为 None,使用默认值时默认的摘要类型是 SHA256

异常:

  • X509Exception:私钥类型不支持、私钥类型和证书签名算法中的私钥类型不匹配或数字证书签名信息设置失败时,抛出异常

func encodeToDer

public func encodeToDer(): DerBlob

功能:将数字证书签名请求编码成 Der 格式。

返回值:编码后的 Der 格式的数字证书签名请求

func encodeToPem

public func encodeToPem(): PemEntry

功能:将数字证书签名请求编码成 PEM 格式。

返回值:编码后的 PEM 格式的数字证书签名请求

func decodeFromDer

public static func decodeFromDer(der: DerBlob): X509CertificateRequest

功能:将 DER 格式的数字证书签名请求解码。

参数:

  • der:DER 格式的二进制数据

返回值:由 DER 格式解码出的数字证书签名请求

异常:

  • X509Exception:数据为空时,或数据不是有效的数字证书签名请求 DER 格式时抛出异常

func decodeFromPem

public static func decodeFromPem(pem: String): Array<X509CertificateRequest>

功能:将数字证书签名请求从 PEM 格式解码。

参数:

  • pem:PEM 格式的数字证书签名请求字符流

返回值:由 PEM 格式解码出的数字证书签名请求数组

异常:

  • X509Exception:字符流不符合 PEM 格式时,或文件头不符合数字证书签名请求头标准时抛出异常

prop signatureAlgorithm

public prop signatureAlgorithm: SignatureAlgorithm

功能:解析数字证书签名请求的签名算法。

返回值:数字证书签名请求的签名算法,类型为 SignatureAlgorithm

prop signature

public prop signature: Signature

功能:解析数字证书签名请求的签名。

返回值:数字证书签名请求的签名,类型为 Signature

prop publicKeyAlgorithm

public prop publicKeyAlgorithm: PublicKeyAlgorithm

功能:解析数字证书签名请求的公钥算法。

返回值:数字证书签名请求的公钥算法,类型为 PublicKeyAlgorithm

prop publicKey

public prop publicKey: PublicKey

功能:解析数字证书签名请求的公钥。

返回值:数字证书签名请求的公钥,类型为 PublicKey

prop subject

public prop subject: X509Name

功能:解析数字证书签名请求的使用者信息。

返回值:数字证书签名请求的使用者信息,类型为 X509Name

prop dnsNames

public prop dnsNames: Array<String>

功能:解析数字证书签名请求备选名称中的域名。

返回值:数字证书签名请求备选名称中的域名,类型为 Array

prop emailAddresses

public prop emailAddresses: Array<String>

功能:解析数字证书签名请求备选名称中的 email 地址。

返回值:数字证书签名请求备选名称中的 email 地址,类型为 Array

prop IPAddresses

public prop IPAddresses: Array<IP>

功能:解析数字证书签名请求备选名称中的 IP 地址。

返回值:数字证书签名请求备选名称中的 IP 地址,类型为 Array

func toString

public override func toString(): String

功能:生成证书签名请求名称字符串,包含证书签名请求的使用者信息。

返回值:证书签名请求名称字符串

func hashCode

public override func hashCode(): Int64

功能:返回证书签名请求哈希值。

返回值:对证书签名请求对象进行哈希计算后得到的结果

class X509Name

public class X509Name <: ToString {
    public init(
        countryName!: ?String = None,
        provinceName!: ?String = None,
        localityName!: ?String = None,
        organizationName!: ?String = None,
        organizationalUnitName!: ?String = None,
        commonName!: ?String = None,
        email!: ?String = None
    )
    public prop countryName: ?String
    public prop provinceName: ?String
    public prop localityName: ?String
    public prop organizationName: ?String
    public prop organizationalUnitName: ?String
    public prop commonName: ?String
    public prop email: ?String
    public override func toString(): String
}

证书实体可辨识名称(Distinguished Name)是数字证书中的一个重要组成部分,作用是确保证书的持有者身份的真实性和可信度,同时也是数字证书验证的重要依据之一。

X509Name 通常包含证书实体的国家或地区名称(Country Name)、州或省名称(State or Province Name)、城市名称(Locality Name)、组织名称(Organization Name)、组织单位名称(Organizational Unit Name)、通用名称(Common Name)。有时也会包含 email 地址。

init

    public init(
        countryName!: ?String = None,
        provinceName!: ?String = None,
        localityName!: ?String = None,
        organizationName!: ?String = None,
        organizationalUnitName!: ?String = None,
        commonName!: ?String = None,
        email!: ?String = None
    )

功能:构造 X509Name 对象。

参数:

  • countryName:国家或地区名称,默认值为 None
  • provinceName:州或省名称,默认值为 None
  • localityName:城市名称,默认值为 None
  • organizationName:组织名称,默认值为 None
  • organizationalUnitName:组织单位名称,默认值为 None
  • commonName:通用名称,默认值为 None
  • email:email 地址,默认值为 None

异常:

  • X509Exception:设置证书实体可辨识名称时失败,比如内存分配异常等内部错误,则抛出异常

prop countryName

public prop countryName: ?String

功能:返回证书实体的国家或地区名称。

返回值:Option,若证书实体中没有国家或地区名称,返回 None

prop provinceName

public prop provinceName: ?String

功能:返回证书实体的州或省名称。

返回值:Option,若证书实体中没有州或省名称,返回 None

prop localityName

public prop localityName: ?String

功能:返回证书实体的城市名称。

返回值:Option,若证书实体中没有城市名称,返回 None

prop organizationName

public prop organizationName: ?String

功能:返回证书实体的组织名称。

返回值:Option,若证书实体中没有组织名称,返回 None

prop organizationalUnitName

public prop organizationalUnitName: ?String

功能:返回证书实体的组织单位名称。

返回值:Option,若证书实体中没有组织单位名称,返回 None

prop commonName

public prop commonName: ?String

功能:返回证书实体的通用名称。

返回值:Option,若证书实体中没有通用名称,返回 None

prop email

public prop email: ?String

功能:返回证书实体的 email 地址。

返回值:Option,若证书实体中没有 email 地址,返回 None

func toString

public override func toString(): String

功能:生成证书实体名称字符串。

返回值:证书实体名称字符串,包含实体名称中存在的字段信息

class X509Exception

public class X509Exception <: Exception {
    public init()
    public init(message: String)
}

此异常为 X509 包抛出的异常类型。

init

public init()

功能:构造 X509Exception 对象。

init

public init(message: String)

功能:构造 X509Exception 对象。

参数:

  • message:异常的信息

enum SignatureAlgorithm

public enum SignatureAlgorithm <: Equatable<SignatureAlgorithm> & ToString {
    | MD2WithRSA | MD5WithRSA | SHA1WithRSA | SHA256WithRSA | SHA384WithRSA
    | SHA512WithRSA | DSAWithSHA1 | DSAWithSHA256 | ECDSAWithSHA1 | ECDSAWithSHA256
    | ECDSAWithSHA384 | ECDSAWithSHA512 | UnknownSignatureAlgorithm
}

证书签名算法(Signature Algorithm)是用于数字证书签名的算法,它是一种将数字证书中的公钥和其他信息进行加密的算法,以确保数字证书的完整性和真实性。

目前支持签名算法的种类包括:MD2WithRSA 、MD5WithRSA 、SHA1WithRSA 、SHA256WithRSA 、SHA384WithRSA、SHA512WithRSA、DSAWithSHA1、DSAWithSHA256、ECDSAWithSHA1、ECDSAWithSHA256、ECDSAWithSHA384 和 ECDSAWithSHA512。

MD2WithRSA

MD2WithRSA

功能:MD2withRSA 签名算法。

MD5WithRSA

MD5WithRSA

功能:MD5withRSA 签名算法。

SHA1WithRSA

SHA1WithRSA

功能:SHA1withRSA签名算法。

SHA256WithRSA

SHA256WithRSA

功能:SHA256withRSA 签名算法。

SHA384WithRSA

SHA384WithRSA

功能:SHA384withRSA 签名算法。

SHA512WithRSA

SHA512WithRSA

功能:SHA512withRSA 签名算法。

DSAWithSHA1

DSAWithSHA1

功能:DSAwithSHA1 签名算法。

DSAWithSHA256

DSAWithSHA256

功能:DSAwithSHA256 签名算法。

ECDSAWithSHA1

ECDSAWithSHA1

功能:ECDSAwithSHA1 签名算法。

ECDSAWithSHA256

ECDSAWithSHA256

功能:ECDSAwithSHA256 签名算法。

ECDSAWithSHA384

ECDSAWithSHA384

功能:ECDSAwithSHA384 签名算法。

ECDSAWithSHA512

ECDSAWithSHA512

功能:ECDSAwithSHA512 签名算法。

UnknownSignatureAlgorithm

UnknownSignatureAlgorithm

功能:未知签名算法。

operator func ==

public override operator func ==(other: SignatureAlgorithm): Bool

功能:判等。

参数:

  • other:被比较的签名算法

返回值:若签名算法相同,返回 true;否则,返回 false

operator func !=

public override operator func !=(other: SignatureAlgorithm): Bool

功能:判不等。

参数:

  • other:被比较的签名算法

返回值:若签名算法不同,返回 true;否则,返回 false

func toString

public override func toString(): String

功能:生成证书签名算法名称字符串。

返回值:证书签名算法名称字符串

struct Signature

public struct Signature <: Equatable<Signature> & Hashable {
}

数字证书的签名,用来验证身份的正确性。

prop signatureValue

public prop signatureValue: DerBlob

功能:返回证书签名的二进制。

返回值:证书签名的二进制,类型为 DerBlob

operator func ==

public override operator func ==(other: Signature): Bool

功能:判等。

参数:

  • other:被比较的证书签名

返回值:若证书签名相同,返回 true;否则,返回 false

operator func !=

public override operator func !=(other: Signature): Bool

功能:判不等。

参数:

  • other:被比较的证书签名

返回值:若证书签名不同,返回 true;否则,返回 false

func hashCode

public override func hashCode(): Int64

功能:返回证书签名哈希值。

返回值:对证书签名对象进行哈希计算后得到的结果

enum PublicKeyAlgorithm

public enum PublicKeyAlgorithm <: Equatable<PublicKeyAlgorithm> & ToString {
    RSA | DSA | ECDSA | UnknownPublicKeyAlgorithm
}

数字证书中包含的公钥信息,目前支持的种类有:RSA、DSA、ECDSA。

RSA

RSA

功能:RSA 公钥算法。

DSA

DSA

功能:DSA 公钥算法。

ECDSA

ECDSA

功能:ECDSA 公钥算法。

UnknownPublicKeyAlgorithm

UnknownPublicKeyAlgorithm

功能:未知公钥算法。

operator func ==

public override operator func ==(other: PublicKeyAlgorithm): Bool

功能:判等。

参数:

  • other:被比较的公钥算法

返回值:若公钥算法相同,返回 true;否则,返回 false

operator func !=

public override operator func !=(other: PublicKeyAlgorithm): Bool

功能:判不等。

参数:

  • other:被比较的公钥算法

返回值:若公钥算法不同,返回 true;否则,返回 false

func toString

public override func toString(): String

功能:生成证书携带的公钥算法名称字符串。

返回值:证书携带的公钥算法名称字符串

struct KeyUsage

public struct KeyUsage <: ToString {
    public static let DigitalSignature = 0x0080u16
    public static let NonRepudiation = 0x0040u16
    public static let KeyEncipherment = 0x0020u16
    public static let DataEncipherment = 0x0010u16
    public static let KeyAgreement = 0x0008u16
    public static let CertSign = 0x0004u16
    public static let CRLSign = 0x0002u16
    public static let EncipherOnly = 0x0001u16
    public static let DecipherOnly = 0x0100u16

    public init(keys: UInt16)

    public override func toString(): String
}

数字证书扩展字段中通常会包含携带公钥的用法说明,目前支持的用途有:DigitalSignature、NonRepudiation、KeyEncipherment、DataEncipherment、KeyAgreement、CertSign、CRLSign、EncipherOnly、DecipherOnly。

DigitalSignature

public static let DigitalSignature = 0x0080u16

功能:表示私钥可以用于除了签发证书、签发 CRL 和非否认性服务的各种数字签名操作,而公钥用来验证这些签名

NonRepudiation

public static let NonRepudiation = 0x0040u16

功能:表示私钥可以用于进行非否认性服务中的签名,而公钥用来验证签名

KeyEncipherment

public static let KeyEncipherment = 0x0020u16

功能:表示密钥用来加密传输其他的密钥

DataEncipherment

public static let DataEncipherment = 0x0010u16

功能:表示公钥用于直接加密数据

KeyAgreement

public static let KeyAgreement = 0x0008u16

功能:表示密钥用于密钥协商

CertSign

public static let CertSign = 0x0004u16

功能:表示私钥用于证书签名,而公钥用于验证证书签名,专用于 CA 证书

CRLSign

public static let CRLSign = 0x0002u16

功能:表示私钥可用于对 CRL 签名,而公钥可用于验证 CRL 签名

EncipherOnly

public static let EncipherOnly = 0x0001u16

功能:表示证书中的公钥在密钥协商过程中,仅仅用于加密计算,配合 key Agreement 使用才有意义

DecipherOnly

public static let DecipherOnly = 0x0100u16

功能:表示证书中的公钥在密钥协商过程中,仅仅用于解密计算,配合 key Agreement 使用才有意义

init

public init(keys: UInt16)

参数:

  • keys:密钥的用法,建议使用本结构中所提供的密钥用法变量通过按位或的方式传入参数

功能:构造指定用途的密钥用法,需要注意同一个密钥可以有多种用途。

func toString

public override func toString(): String

功能:生成密钥用途字符串。

返回值:证书密钥用途字符串

struct ExtKeyUsage

public struct ExtKeyUsage <: ToString {
    public static let AnyKey = 0u16
    public static let ServerAuth = 1u16
    public static let ClientAuth = 2u16
    public static let EmailProtection = 3u16
    public static let CodeSigning = 4u16
    public static let OCSPSigning = 5u16
    public static let TimeStamping = 6u16

    public init(keys: Array<UInt16>)

    public override func toString(): String
}

数字证书扩展字段中通常会包含携带扩展密钥用法说明,目前支持的用途有:ServerAuth、ClientAuth、EmailProtection、CodeSigning、OCSPSigning、TimeStamping。

AnyKey

public static let AnyKey = 0u16

功能:表示应用于任意用途

ServerAuth

public static let ServerAuth = 1u16

功能:表示用于 SSL 的服务端验证

ClientAuth

public static let ClientAuth = 2u16

功能:表示用于 SSL 的客户端验证

EmailProtection

public static let EmailProtection = 3u16

功能:表示用于电子邮件的加解密、签名等

CodeSigning

public static let CodeSigning = 4u16

功能:表示用于代码签名

OCSPSigning

public static let OCSPSigning = 5u16

功能:用于对 OCSP 响应包进行签名

TimeStamping

public static let TimeStamping = 6u16

功能:用于将对象摘要值与时间绑定

init

public init(keys: Array<UInt16>)

功能:构造指定用途的扩展密钥用法,需要注意同一个密钥可以有多种用途。

func toString

public override func toString(): String

功能:生成扩展密钥用途字符串。

返回值:证书扩展密钥用途字符串

struct VerifyOption

public struct VerifyOption {
    public var time: DateTime = DateTime.now()
    public var dnsName: String = ""
    public var roots: Array<X509Certificate> = X509Certificate.systemRootCerts()
    public var intermediates: Array<X509Certificate> = Array<X509Certificate>()
}

time

public var time: DateTime = DateTime.now()

校验时间,默认为创建选项的时间。

dnsName

public var dnsName: String = ""

校验域名,默认为空,只有设置域名时才会进行此处校验。

roots

public var roots: Array<X509Certificate> = X509Certificate.systemRootCerts()

根证书链,默认为系统根证书链。

intermediates

public var intermediates: Array<X509Certificate> = Array<X509Certificate>()

中间证书链,默认为空。

struct DerBlob

public struct DerBlob <: Equatable<DerBlob> & Hashable {
    public init(content: Array<Byte>)
}

Crypto 支持配置二进制证书流,用户读取二进制证书数据并创建 DerBlob 对象后可将其解析成 X509Certificate / X509CertificateRequest / PublicKey / PrivateKey 对象。

init

public init(content: Array<Byte>)

功能:构造 DerBlob 对象。

参数:

  • content:二进制字符序列

prop size

public prop size: Int64

功能:DerBlob 对象中字符序列的大小。

prop body

public prop body: Array<Byte>

功能:DerBlob 对象中的字符序列。

operator func ==

public override operator func ==(other: DerBlob): Bool

功能:判等。

参数:

  • other:被比较的 DerBlob 对象

返回值:若对象相同,返回 true;否则,返回 false

operator func !=

public override operator func !=(other: DerBlob): Bool

功能:判不等。

参数:

  • other:被比较的 DerBlob 对象

返回值:若对象不同,返回 true;否则,返回 false

func hashCode

public override func hashCode(): Int64

功能:返回 DerBlob 对象哈希值。

返回值:对 DerBlob 对象进行哈希计算后得到的结果

struct PemEntry

public struct PemEntry <: ToString {
    public PemEntry(
        public let label: String,
        public let headers: Array<(String, String)>,
        public let body: ?DerBlob
    )
    public init(label: String, body: DerBlob)
}

PEM 文本格式经常用于存储证书和密钥,PEM 编码结构包含以下几个部分:第一行是 “-----BEGIN”,标签和 “-----” 组成的utf8编码的字符串;最后一行是 “-----END”,标签和 “-----” 组成的 utf8 编码的字符串;中间是正文,是实际二进制内容经过 base64 编码得到的可打印字符串, 详细的 PEM 编码规范可参考 rfc7468。在旧版的 PEM 编码标准中在第一行和正文之间还包含条目头,详见 rfc1421

单个 PEM 文件可能包含多个条目,单个条目可以是证书、密钥、请求或其他安全相关内容的 PEM 基础结构。密钥和证书链可以分别存储在多个 PEM 文件中,也可以存储在同一个 PEM 文件中。

为了支持不同的用户场景,我们提供了 PemEntryPem 类型,PemEntry 用于存储单个PEM 基础结构。

label

public let label: String

功能:PemEntry 实例的标签。

headers

public let headers: Array<(String, String)>

功能:PemEntry 实例的条目头。

body

public let body: ?DerBlob

功能:PemEntry 实例的二进制内容。

PemEntry

public PemEntry(
    public let label: String,
    public let headers: Array<(String, String)>,
    public let body: ?DerBlob
)

功能:构造 PemEntry 对象。

参数:

  • label:标签

  • headers:条目头

  • body:二进制内容

init

public init(label: String, body: DerBlob)

功能:构造 PemEntry 对象。

参数:

  • label:标签

  • body:二进制内容

func header

public func header(name: String): Iterator<String>

功能:通过条目头名称,找到对应条目内容。

参数:

  • name:条目头名称

返回值:条目头名称对应内容的迭代器

func encode

public func encode(): String

功能:返回PEM格式的字符串。行结束符将根据当前操作系统生成。

返回值:PEM 格式的字符串

func toString

public override func toString(): String

功能:返回 PEM 对象的标签和二进制内容的长度。

返回值:PEM 对象的标签和二进制内容的长度

LABEL_CERTIFICATE

public static let LABEL_CERTIFICATE = "CERTIFICATE"

功能:记录条目类型为证书

LABEL_X509_CRL

public static let LABEL_X509_CRL = "X509 CRL"

功能:记录条目类型为证书吊销列表

LABEL_CERTIFICATE_REQUEST

public static let LABEL_CERTIFICATE_REQUEST = "CERTIFICATE REQUEST"

功能:记录条目类型为证书签名请求

LABEL_PRIVATE_KEY

public static let LABEL_PRIVATE_KEY = "PRIVATE KEY"

功能:记录条目类型为 PKCS #8 标准未加密的私钥

LABEL_EC_PRIVATE_KEY

public static let LABEL_EC_PRIVATE_KEY = "EC PRIVATE KEY"

功能:记录条目类型为椭圆曲线私钥

LABEL_ENCRYPTED_PRIVATE_KEY

public static let LABEL_ENCRYPTED_PRIVATE_KEY = "ENCRYPTED PRIVATE KEY"

功能:记录条目类型为 PKCS #8 标准加密的私钥

LABEL_RSA_PRIVATE_KEY

public static let LABEL_RSA_PRIVATE_KEY = "RSA PRIVATE KEY"

功能:记录条目类型为 RSA 私钥

LABEL_PUBLIC_KEY

public static let LABEL_PUBLIC_KEY = "PUBLIC KEY"

功能:记录条目类型为公钥

LABEL_EC_PARAMETERS

public static let LABEL_EC_PARAMETERS = "EC PARAMETERS"

功能:记录条目类型为椭圆曲线参数

LABEL_DH_PARAMETERS

public static let LABEL_DH_PARAMETERS = "DH PARAMETERS"

功能:记录条目类型为 DH 密钥参数

struct Pem

public struct Pem <: Collection<PemEntry> & ToString {
    public Pem(private let items: Array<PemEntry>)
}

结构体 Pem 为条目序列,可以包含多个 PemEntry

Pem

public Pem(private let items: Array<PemEntry>)

功能:构造 Pem 对象。

参数:

  • items:多个 PemEntry 对象

func encode

public func encode(): String

功能:返回PEM格式的字符串。行结束符将根据当前操作系统生成。

返回值:PEM 格式的字符串

func decode

public static func decode(text: String): Pem

功能:将 PEM 文本解码为条目序列。

参数:

  • text:PEM 字符串

返回值:PEM 条目序列

func toString

public override func toString(): String

功能:返回一个字符串,字符串内容是包含每个条目序列的标签。

返回值:包含每个条目序列的标签的字符串

func isEmpty

public override func isEmpty(): Bool

功能:判断 PEM 文本解码为条目序列是否为空。

返回值:PEM 文本解码为条目序列为空返回 true;否则,返回 false

func iterator

public override func iterator(): Iterator<PemEntry>

功能:生成 PEM 文本解码为条目序列的迭代器。

返回值:PEM 文本解码为条目序列的迭代器

prop size

public override prop size: Int64

功能:条目序列的数量。

示例

读取、解析证书

from std import fs.File
from crypto import x509.*

let readPath = "./files/root_rsa.cer"
main() {
    // 读取本地证书
    let pem = String.fromUtf8(File.readFrom(readPath))
    let certificates = X509Certificate.decodeFromPem(pem)

    // 解析证书中的必选字段
    let cert = certificates[0]
    println(cert)
    println("Serial Number: ${cert.serialNumber}")
    println("Issuer: ${cert.issuer}")
    println("NotBefore: ${cert.notBefore}")
    println("NotAfter: ${cert.notAfter}")
    println(cert.signatureAlgorithm)
    let signature = cert.signature
    println(signature.hashCode())
    println(cert.publicKeyAlgorithm)
    let pubKey = cert.publicKey
    println(pubKey.encodeToPem().encode())

    // 解析证书中的扩展字段
    println("DNSNames: ${cert.dnsNames}")
    println("EmailAddresses: ${cert.emailAddresses}")
    println("IPAddresses: ${cert.IPAddresses}")
    println("KeyUsage: ${cert.keyUsage}")
    println("ExtKeyUsage: ${cert.extKeyUsage}")

    // 解析证书使用者的可辨识名称
    println("Subject: ${cert.subject}")

    return 0
}

读取、验证证书

from std import fs.File
from crypto import x509.*
from std import time.DateTime

let prefixPath = "./files/"
let certFile = "servers.crt"
let rootFile = "roots.crt"
let middleFile = "middles.crt"

func getX509Cert(path: String)
{
    let pem = String.fromUtf8(File.readFrom(path))
    X509Certificate.decodeFromPem(pem)
}


func testVerifyByTime(cert: X509Certificate, roots: Array<X509Certificate>, middles: Array<X509Certificate>)
{
    var opt = VerifyOption()
    opt.roots = roots
    opt.intermediates = middles
    cert.verify(opt)
    println("Verify result: ${cert.verify(opt)}")
    opt.time = DateTime.of(year: 2023, month: 7, dayOfMonth: 1)
    println("Verify result:: ${cert.verify(opt)}")
}

func testVerifyByDNS(cert: X509Certificate)
{
    var opt = VerifyOption()
    opt.dnsName = "www.example.com"
    println("cert DNS names: ${cert.dnsNames}")
    let res = cert.verify(opt)
    println("Verify result: ${res}")
}


/**
 * The relation of certs.
 *    root[0]         root[1]
 *    /      \            |
 *  mid[0]  mid[1]    mid[2]
 *   |                  |
 *  server[0]         server[1]
*/
func testVerify(cert: X509Certificate, roots: Array<X509Certificate>, middles: Array<X509Certificate>)
{
    var opt = VerifyOption()
    opt.roots = roots
    opt.intermediates = middles
    let res = cert.verify(opt)
    println("Verify result: ${res}")
}

main() {
    // 2 server certs
    let certs = getX509Cert(prefixPath + certFile)
    // 2 root certs
    let roots = getX509Cert(prefixPath + rootFile)
    // 3 middle certs
    let middles = getX509Cert(prefixPath + middleFile)
    // Verify by time: true, false
    testVerifyByTime(certs[0], [roots[0]], [middles[0]])
    // Verify by dns: false
    testVerifyByDNS(certs[0])
    // cert0 <- root0: false
    testVerify(certs[0], [roots[0]], [])
    // cert0 <- middle0 <- root0: true
    testVerify(certs[0], [roots[0]], [middles[0]])
    // cert0 <- (middle0, middle1, middle2) <- (root0, root1) : true
    testVerify(certs[0], roots, middles)
    // cert1 <- middle0 <- root0: false
    testVerify(certs[1], [roots[0]], [middles[0]])
    // cert1 <- middle2 <- root1: true
    testVerify(certs[1], [roots[1]], [middles[2]])
    // cert1 <- (middle0, middle1, middle2) <- (root0, root1) : true
    testVerify(certs[1], roots, middles)
    return 0
}

创建、解析证书

from std import fs.*
from crypto import x509.*

main(){
    let x509Name = X509Name(
        countryName: "CN",
        provinceName: "beijing",
        localityName: "haidian",
        organizationName: "organization",
        organizationalUnitName: "organization unit",
        commonName: "x509",
        email: "test@email.com"
    )
    let serialNumber = SerialNumber(length: 20)
    let startTime: DateTime = DateTime.now()
    let endTime: DateTime = notBefore.addYears(1)
    let ip1: IP = Array<Byte>([8, 8, 8, 8])
    let ip2: IP = Array<Byte>([0, 1, 0, 1, 0, 1, 0, 1, 0, 8, 0, 8, 0, 8, 0, 8])
    let parentCertPem = String.fromUtf8(File("./certificate.pem", OpenOption.Open(true, false)).readToEnd())
    let parentCert = X509Certificate.decodeFromPem(parentCertPem)[0]
    let parentKeyPem = String.fromUtf8(File("./rsa_private_key.pem", OpenOption.Open(true, false)).readToEnd())
    let parentPrivateKey = PrivateKey.decodeFromPem(parentKeyPem)
    let usrKeyPem = String.fromUtf8(File("./ecdsa_public_key.pem", OpenOption.Open(true, false)).readToEnd())
    let usrPublicKey = PublicKey.decodeFromPem(usrKeyPem)

    let certInfo = X509CertificateInfo(serialNumber: serialNumber, notBefore: startTime, notAfter: endTime, subject: x509Name, dnsNames: Array<String>(["b.com"]), IPAddresses: Array<IP>([ip1, ip2]));
    let cert = X509Certificate(info, parent: parentCert, publicKey: usrPublicKey, privateKey: parentPrivateKey)

    println(cert)
    println("Serial Number: ${cert.serialNumber}")
    println("Issuer: ${cert.issuer}")
    println("Subject: ${cert.subject}")
    println("NotBefore: ${cert.notBefore}")
    println("NotAfter: ${cert.notAfter}")
    println(cert.signatureAlgorithm)
    println("DNSNames: ${cert.dnsNames}")
    println("IPAddresses: ${cert.IPAddresses}")

    return 0
}

创建、解析证书签名请求

from std import fs.*
from crypto import x509.*

main(){
    let x509Name = X509Name(
        countryName: "CN",
        provinceName: "beijing",
        localityName: "haidian",
        organizationName: "organization",
        organizationalUnitName: "organization unit",
        commonName: "x509",
        email: "test@email.com"
    )
    let ip1:IP = Array<Byte>([8, 8, 8, 8])
    let ip2:IP = Array<Byte>([0, 1, 0, 1, 0, 1, 0, 1, 0, 8, 0, 8, 0, 8, 0, 8])
    let rsaPem = String.fromUtf8(File("./rsa_private_key.pem", OpenOption.Open(true, false)).readToEnd())
    let rsa = PrivateKey.decodeFromPem(rsaPem)

    let csrInfo = X509CertificateRequestInfo(subject: x509Name, dnsNames: Array<String>(["b.com"]), IPAddresses: Array<IP>([ip1, ip2]));
    let csr = X509CertificateRequest(rsa, certificateRequestInfo:csrInfo, signatureAlgorithm: SHA256WithRSA)

    println("Subject: ${csr.subject.toString()}")
    println("IPAddresses: ${csr.IPAddresses}")
    println("dnsNames: ${csr.dnsNames}")

    return 0
}