x509 包
介绍
x509
包提供处理数字证书功能。
使用本包需要外部依赖 OpenSSL 3
的 ssl
和 crypto
动态库文件,故使用前需安装相关工具:
- 对于
Linux
操作系统,可参考以下方式:- 如果系统的包管理工具支持安装
OpenSSL 3
开发工具包,可通过这个方式安装,并确保系统安装目录下含有libssl.so
、libssl.so.3
、libcrypto.so
和libcrypto.so.3
这些动态库文件,例如Ubuntu 22.04
系统上可使用sudo apt install libssl-dev
命令安装libssl-dev
工具包; - 如果无法通过上面的方式安装,可自行下载
OpenSSL 3.x.x
源码编译安装软件包,并确保安装目录下含有libssl.so
、libssl.so.3
、libcrypto.so
和libcrypto.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.dll
、libcrypto.dll.a
(或libcrypto.lib
)、libcrypto-3-x64.dll
这些库文件; - 将
libssl.dll.a
(或libssl.lib
)、libcrypto.dll.a
(或libcrypto.lib
) 所在的目录路径设置到环境变量LIBRARY_PATH
中,将libssl-3-x64.dll
、libcrypto-3-x64.dll
所在的目录路径设置到环境变量PATH
中。
- 自行下载
- 对于
macOS
操作系统,可参考以下方式:- 使用
brew install openssl@3
安装,并确保系统安装目录下含有libcrypto.dylib
和libcrypto.3.dylib
这两个动态库文件; - 如果无法通过上面的方式安装,可自行下载
OpenSSL 3.x.x
源码编译安装软件包,并确保安装目录下含有libcrypto.dylib
和libcrypto.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
功能:根据验证选项验证当前证书的有效性,验证优先级:
- 优先验证有效期;
- 可选验证DNS域名;
- 最后根据根证书和中间证书验证其有效性。
参数:
- 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
prop provinceName
public prop provinceName: ?String
功能:返回证书实体的州或省名称。
返回值:Option
prop localityName
public prop localityName: ?String
功能:返回证书实体的城市名称。
返回值:Option
prop organizationName
public prop organizationName: ?String
功能:返回证书实体的组织名称。
返回值:Option
prop organizationalUnitName
public prop organizationalUnitName: ?String
功能:返回证书实体的组织单位名称。
返回值:Option
prop commonName
public prop commonName: ?String
功能:返回证书实体的通用名称。
返回值:Option
prop email
public prop email: ?String
功能:返回证书实体的 email 地址。
返回值:Option
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 文件中。
为了支持不同的用户场景,我们提供了 PemEntry
和 Pem
类型,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
}