IX509Extension XCN编码?

时间:2016-03-08 10:30:02

标签: powershell certenroll

通过阅读MSDN我明白了 X509 v3扩展必须手工制作。这涉及CRL,AIA,名称和策略约束,策略映射,私钥使用期和主题目录属性。

我尝试创建一个CRL分发点但结果是垃圾:

var user_id = this.get('session.data.authenticated.user_id');

是否有关于如何对以下各项的值进行编码的参考?我已经搜遍了所有但没有运气。

  • AuthorityInformationAccess
  • CrlDistributionPoints
  • FreshestCRL
  • NameConstraints
  • 的PolicyConstraints
  • PolicyMappings
  • PrivateKeyUsagePeriod
  • SubjectDirectoryAttributes

请注意,这与Windows中的certenroll com接口有关。 openssl不适用于此。

1 个答案:

答案 0 :(得分:0)

我在C#中遇到了同样的问题,尝试通过CertEnroll.dll生成带有CDP(CRL分发点)扩展的证书

我能够完成这项工作的唯一方法是在字节级手工制作扩展,但我没有找到任何关于如何排序字节或某些字节含义的文档。为了解决这个问题,我在Linux中使用OpenSSL生成了一些证书并检查了C#中的原始字节(在X509Certificate2 class中加载证书并查看Extensions属性。X509Extension class有一个RawData财产)。

您应该能够将我的代码转换为PowerShell,因此我最终得到了:

var urisStr = new string[]
{
    "http://pki.example.com/list.crl"
};
var uris = urisStr.Select(u => Encoding.UTF8.GetBytes(u));
var zero = new byte[] { 48 }; //"0", delimiter ?
var nbsp = new byte[] { 160 }; //" ", separator ?
var dagger = new byte[] { 134 }; //"dagger", separator ?

var zeroSize = zero.Length + 1;
var nbspSize = nbsp.Length + 1;
var daggerSize = dagger.Length + 1;

var col = new List<byte>();
col.AddRange(zero); //delimiter
int totalBytes = uris.Sum(u => u.Length);
totalBytes += (zeroSize + (nbspSize * 2) + daggerSize) * uris.Count();
col.Add((byte)totalBytes); //size of everything it contains

foreach (var uri in uris)
{
    var uriSize = uri.Length;
    col.AddRange(zero); //delimiter
    col.Add((byte)(nbspSize + nbspSize + uriSize + daggerSize)); //size of everything it contains
    col.AddRange(nbsp);
    col.Add((byte)(nbspSize + uriSize + daggerSize)); //size of everything it contains
    col.AddRange(nbsp);
    col.Add((byte)(uriSize + daggerSize)); //size of everything it contains
    col.AddRange(dagger); //separator ?
    col.Add((byte)uriSize);
    col.AddRange(uri);
}
var bytes = col.ToArray();
var base64 = Convert.ToBase64String(bytes);

var oidCDP = new CObjectId();
oidCDP.InitializeFromName(CERTENROLL_OBJECTID.XCN_OID_CRL_DIST_POINTS);

// There is no specific class to CDPs, so we use the CX509Extension
var crlList = new CX509Extension();
crlList.Initialize(oidCDP, EncodingType.XCN_CRYPT_STRING_BASE64, base64);
certRequest.X509Extensions.Add(crlList);

请注意我没有找到任何关于我生成的字节格式的文档,因此此代码没有官方基础。它仅基于对工作证书的观察。