4

我有一个 Azure 工作者角色,我希望调用管理服务(例如 REST API)并收集有关相关服务的信息。但是,当我尝试加载我的证书时,它找不到它。以下是我遵循的步骤:

1.我使用 MakeCert 创建了一个证书,并通过门户将其注册为我的管理证书

makecert -r -pe -a sha1 -n "CN=MyCnName" -ss My -len 2048 -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 MyCert.cer

2.在我的本地机器上安装了证书,一切正常。在本地运行 Worker Role 时,我可以毫无问题地调用管理服务。

3.从我的机器导出证书并通过门户在目标托管服务下注册导出的证书

4.部署角色。当角色启动时,它无法找到证书。

这是我用来查找证书的代码的摘录。

// Open the certificate store for the current user.
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser); // I also tried localmachine
certStore.Open(OpenFlags.ReadOnly);

// Find the certificate with the specified subject.
X509Certificate2Collection certCollection = certStore.Certificates.Find(
    X509FindType.FindBySubjectName,
    _myConfiguration.SubjectName,
    false);


if (certCollection == null || certCollection.Count < 1)
{
    // Find the certificate with the specified thumbprint.
    certCollection = certStore.Certificates.Find(
        X509FindType.FindByThumbprint,
        _myConfiguration.ThumbPrint,
        false);
}

// Close the certificate store.
certStore.Close();

// Check to see if a matching certificate was found.
if (certCollection.Count == 0)
{
    _logger.Warn("No certificate found");
}

没有例外,只是没有找到证书。谁能告诉我我需要做什么?

4

2 回答 2

8

找出问题所在... 除了在门户中配置证书之外,我还需要将证书详细信息(例如名称、存储和指纹)添加到选项卡下的 Azure 项目角色设置中Certificates

于 2012-07-15T22:17:20.657 回答
0

我对网络角色有类似的问题,我已经应用了一种解决方法。

  1. 使用远程桌面连接到部署服务和证书的 VM
  2. 项目清单
  3. 复制您的证书或pfx您的 VM 本地磁盘(例如 C:)
  4. 单击您的pfx或 .cert 文件并将其安装在特定的证书存储“受信任的人”上)
  5. 运行您的服务,即使您已配置为在其他商店进行搜索,您也会在受信任的人上找到

如果我强制在“我的商店”位置搜索,但搜索方法从受信任的人员存储中检索信息,我不知道为什么我的网络角色会尝试在该位置查找证书。

此解决方法的问题是,当您删除部署时,证书和任何其他配置都将被擦除。

这段代码可以为您提供一些信息:

//the certificate must be in the Trusted People Store
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
try
{
    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
   //Commented
   //Get the first available match from cert store
   //X509Certificate2 cert = store.Certificates.Find(X509FindType.FindBySubjectName,
                 // subjectname,
                 // false)
                 // .Cast<X509Certificate2>()
                 // .FirstOrDefault();

   X509Certificate2 cert = new X509Certificate2();
   foreach (var ct in store.Certificates)
   {
       //Logger.TraceInformation(string.Format("Cert found: Subject {0} Tumbprt:{1}", ct.FriendlyName, ct.Thumbprint));
       if (ct.SubjectName.Name.ToString().Contains("*.certnamexx.extensionxx"))
       {
           return new X509SecurityToken(ct);
       }

    }
}
于 2014-03-13T09:27:51.827 回答