首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#自动将SSL证书安装到IIS6站点

使用C#自动将SSL证书安装到IIS6站点
EN

Stack Overflow用户
提问于 2011-10-14 02:54:07
回答 3查看 3.5K关注 0票数 0

我正在尝试通过C#代码在IIS6中自动生成站点的过程。我正在使用DirectoryServices,马上就到了..我有它创建的网站,设置所有的绑定等只是很好。我还没有想出如何安装我们的通配符ssl证书。以下是详细信息:

我们有一个与'*.example.com‘匹配的SSL证书。我们托管的每个站点都有一个匹配的服务器绑定。例如'test.example.com‘。我想我知道如何添加SecureBinding属性:

代码语言:javascript
复制
DirectoryEntrySite.Properties["SecureBindings"][0] = "xx.xx.xx.xx:443:test.example.com";

但是我没有成功地找到关于如何自动将证书安装到该站点的信息。在IIS6管理器中,您可以通过右键单击站点->属性->目录安全->服务器证书-> Next -> Assign an existing Certificate -> (选择证书) -> Next...来完成此操作。

有人能帮上忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-22 03:50:07

看看这个:http://forums.iis.net/t/1163325.aspx

代码语言:javascript
复制
using Microsoft.Web.Administration;  

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);

X509Certificate2 certificate = new X509Certificate2(pfxFilePath);

store.Add(certificate);

using (ServerManager serverManager = new ServerManager())
{
    Site site = serverManager.Sites["Default Web Site"];

    if (site != null)
    {
         site.Bindings.Add("*:443:", certificate.GetCertHash(), store.Name);
    }

    store.Close();
}
票数 2
EN

Stack Overflow用户

发布于 2013-07-18 05:42:36

好了,这个问题已经回答了,但获奖的答案不是针对IIS6的,而是针对IIS7和更大的。命名空间Microsoft.Web.Administration不可用于IIS6。我们步履蹒跚地结合了一系列技术,都是在.NET 4.0中实现的。

步骤..。

  1. 添加对COM组件的引用IIS CertObj 1.0类型库
  2. 在添加的引用CERTOBJLib上,在属性表中,将“Embed Interop Types”设置为false
  3. 使用以下方法创建类...

代码语言:javascript
复制
using System.Linq;
using System.Management;
namespace CertStuff
{
    public class CertificateInstaller
    {
public void RegisterCertificateWithIIS6(string webSiteName, string certificateFilePath, string certificatePassword)
        {
            // USE WMI TO DERIVE THE INSTANCE NAME
            ManagementScope managementScope = new ManagementScope(@"\\.\root\MicrosoftIISv2");
            managementScope.Connect();
            ObjectQuery queryObject = new ObjectQuery("SELECT Name FROM IISWebServerSetting WHERE ServerComment = '" + webSiteName + "'");
            ManagementObjectSearcher searchObject = new ManagementObjectSearcher(managementScope, queryObject);
            var instanceNameCollection = searchObject.Get();
            var instanceName = (from i in instanceNameCollection.Cast<ManagementObject>() select i).FirstOrDefault();

            // USE IIS CERT OBJ TO IMPORT CERT - THIS IS A COM OBJECT
            var IISCertObj = new CERTOBJLib.IISCertObjClass();
            IISCertObj.InstanceName = instanceName["Name"].ToString();
            IISCertObj.Import(certificateFilePath, certificatePassword, false, true); // OVERWRITE EXISTING
        }

    }
}

要删除证书引用,请使用以下方法...

代码语言:javascript
复制
public void UnRegisterCertificateWithIIS6(string webSiteName)
        {
            // USE WMI TO DERIVE THE INSTANCE NAME
            ManagementScope managementScope = new ManagementScope(@"\\.\root\MicrosoftIISv2");
            managementScope.Connect();
            ObjectQuery queryObject = new ObjectQuery("SELECT Name FROM IISWebServerSetting WHERE ServerComment = '" + webSiteName + "'");
            ManagementObjectSearcher searchObject = new ManagementObjectSearcher(managementScope, queryObject);

            foreach (var instanceName in searchObject.Get())
            {
                var IISCertObj = new CERTOBJLib.IISCertObjClass();
                IISCertObj.InstanceName = instanceName["Name"].ToString();

                // THE REMOVE CERT CALL COMPLETES SUCCESSFULLY, BUT FOR WHATEVER REASON, IT ERRORS OUT.
                // SWALLOW THE ERROR.
                try
                {
                    IISCertObj.RemoveCert(false, true);
                }
                catch (Exception ex)
                {

                }
            }
        }

注意:如果您收到错误消息“互操作类型'CERTOBJLib.IISCertObjClass‘无法被嵌入。请使用适用的接口。”,这意味着跳过了步骤2。确保引用对象未嵌入。

票数 1
EN

Stack Overflow用户

发布于 2019-08-06 00:17:27

要在IIS4.7和.Net 10中执行此操作,可以传递以下标志:

代码语言:javascript
复制
X509Certificate2 certificate = new X509Certificate2(path, "password", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable| X509KeyStorageFlags.MachineKeySet);

如果将证书存储在CurrentUser存储中,而不是存储在LocalMachine存储中,请执行以下操作:

代码语言:javascript
复制
X509Certificate2 certificate = new X509Certificate2(path, "password", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable| X509KeyStorageFlags.UserKeySet);

键集标志表示以下内容:

代码语言:javascript
复制
//
// Summary:
//     Private keys are stored in the current user store rather than the local computer
//     store. This occurs even if the certificate specifies that the keys should go
//     in the local computer store.
UserKeySet = 1,
//
// Summary:
//     Private keys are stored in the local computer store rather than the current user
//     store.
MachineKeySet = 2,

私钥需要与证书的其余部分位于同一位置,才能与IIS一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7759017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档