C# 如何通过编程或使用命令行程序更新现有CA模板的有效期

C# 如何通过编程或使用命令行程序更新现有CA模板的有效期,c#,powershell,ssl,ssl-certificate,certutil,C#,Powershell,Ssl,Ssl Certificate,Certutil,我正在寻找一种方法来更新现有CA模板的有效期,您知道使用certutil、任何其他命令或通过Powershell或C#进行编程是否可行吗 CA正在Windows Server 2008 R2上运行 我的目标是每天运行一个脚本来更新特定模板的有效期,以便使用该模板注册的任何请求在特定日期过期,比如2016年12月31日 谢谢, 据此,您可以使用certutil更改CA生存期或最大有效期。我假设您的模板过期限制了您。是否可以创建一个过期日期更长的新模板?假设您正在运行AD CS Enterprise

我正在寻找一种方法来更新现有CA模板的有效期,您知道使用certutil、任何其他命令或通过Powershell或C#进行编程是否可行吗

CA正在Windows Server 2008 R2上运行

我的目标是每天运行一个脚本来更新特定模板的有效期,以便使用该模板注册的任何请求在特定日期过期,比如2016年12月31日

谢谢,


据此,您可以使用certutil更改CA生存期或最大有效期。我假设您的模板过期限制了您。是否可以创建一个过期日期更长的新模板?

假设您正在运行AD CS Enterprise CA,证书模板存储在配置NC中的Active Directory中

(如评论中所述,Microsoft不支持此方法-您确实应该使用证书模板mmc,
certtmpl.msc
,来完成此任务)

要检索证书模板,请执行以下操作:

$CertTemplateParams = @{
    LDAPFilter = '(&(objectClass=pKICertificateTemplate))'
    SearchBase = 'CN=Certificate Templates,CN=Public Key Services,CN=Services,{0}' -f ([adsi]'LDAP://RootDSE').configurationNamingContext[0]
    Properties = 'pKIExpirationPeriod'
}
$Templates = Get-ADObject @CertTemplateParams
筛选所需的模板:

$UserTemplate = $Templates |Where-Object { $_.Name -eq "User" }
表示64位FILETIME结构,但您可以使用
[BitConverter]::ToInt64()将其转换为时间跨度

现在为时间跨度添加一些时间:

$Validity.Add($(New-TimeSpan -Days 365))
将其转换回64位字节数组:

$NewExpirationPeriod = [System.BitConverter]::GetBytes($($Validity.TotalSeconds * -10000000))
使用
Set ADObject
更改模板对象:

Set-ADObject -Identity $UserTemplate.objectGuid -Replace @{pKIExpirationPeriod = $NewExpirationPeriod}
计算

$NewExpirationPeriod = [System.BitConverter]::GetBytes($([Int64]$Validity.TotalSeconds * -10000000))

上面的链接解释了更新根CA的生存期的方法,而不是针对CA模板。我已编辑了该问题以指定我的目标。谢谢,我认为您可以使用具有扩展有效期的模板替换该模板,从而允许将来生成的证书具有更长的有效期。请记住,这是一种使用命令或编程方式更改有效期的方法。谢谢。简单的回答是版本1模板不能通过任何方法修改。这个过程是复制它,创建一个版本2模板,修改复制的模板,然后用复制的模板取代原来的模板。我相当肯定certutil提供了这些功能。[technet]()certutil不提供复制/修改证书模板的功能。不久前,我与Windows PKI团队就类似问题进行了长时间的对话。他们明确表示不支持证书模板MMC之外的任何证书模板设置(ACL除外)。有很多依赖关系,如果你不遵循它们(而且你没有),可能会导致不可预测的结果。即使你知道怎么做,微软也不推荐这样做。此外,问题中的整个设计看起来一点也不好。@CryptoGuy我自己不会使用时间跨度,但另一方面我想一步一步地展示它。不过它可以工作,我已经在我的PKI实验室进行了测试。“除了证书模板MMC之外什么都没有”是否也意味着不存在(受支持的)编程接口,或者它是否像GPO一样,如果您真的需要,您至少有
IGroupPolicyObject
?它无论如何都可以工作。无意冒犯,但是…您做了一件不受支持的事情:修改了版本1模板(用户),这是不允许修改的。另一件事,您在设置修改后没有增加tamplate的次要版本。下面是我与Microsoft对话的一段摘录:“各种模板属性之间存在内在的相互依赖关系,这些依赖关系是通过模板管理单元中的视觉线索和复杂逻辑来实现的。”@m0dest0您找不到任何文档专门说明,事实上,证书模板mmc是唯一受支持的方式。我没有官方参考,因为我通过与Windows PKI团队的私人对话获得了这些信息。您可能需要联系Microsoft支持服务以获得正式确认。
$NewExpirationPeriod = [System.BitConverter]::GetBytes($([Int64]$Validity.TotalSeconds * -10000000))