有一些服务器将证书从一个系统传输到另一个系统,因此有必要减少传输的数据量,因此想到证书已经以通常通过 json 传输的字母数字字符的形式提供,不应以 base64 编码,并且仅将此类编码用于二进制形式的证书。
问题是我不明白您如何找出证书是 PEM / DER 编码(因此,它不需要额外以 base64 编码)还是证书的 CER(因此,需要用base64编码才能传输)
原来,使用常规的X509Certificate2,只能区分有效证书和无效证书的情况:
try
{
var x509Certificate2 = new X509Certificate2();
x509Certificate2.Import(data);
并且不可能提取有关证书类型的信息。
反正有没有做对?通过使用正则表达式检查字符串仅包含字母数字字符来保护一些拐杖似乎是错误的。
我会打开文件并读取前几个字节。
如果文件以 开头
-----BEGIN
,则它是 PEM 格式。如果文件以 开头
MII
,那么它是 base64 编码的 DER如果文件以字节 0x30 0x82 开头,那么这是 SEQUENCE 类型的 ASN.1 对象的二进制 DER 编码,并且根据标准,所有证书都是 SEQUENCE。0x82 表示数据结构的大小用一个两字节整数表示。如果是 0x83,那么大小超过 64 kb,这对于某些 CRL 原则上是可能的,但对于单个证书来说不太可能。
可能存在第二个字节为 0x81 的理论情况。这意味着长度适合 1 个字节,即对象的大小小于 256 个字节。我怀疑如果您采用最小尺寸的密钥和签名并且在 CN 中使用最少的字符,这是可能的,但现在这样的证书必须从阈值开始包装)
否则,我不知道会是什么。