wap cmdlet - 添加证书错误

时间:2011-08-02 06:29:38

标签: powershell upload azure certificate cmdlets

尝试使用WAPPA命令添加证书将证书上传到Azure时,我做错了。

这就是我在powershell中运行的内容:

add-certificate -ServiceName myService -CertificateToDeploy ".\mycert.cer" -SubscriptionId 1234c88c-xxxx-xxxx-ad88-888c6ec5fc4a -Certificate (get-item cert:\CurrentUser\My\0E5A777B38724D85F415E011192D2EF888888884)

这就是不断出现的错误。

  

添加证书:索引值无效。   在行:1字符:16   + add-certificate<< ...(删除了重复命令)...       + CategoryInfo:CloseError:(:) [Add-Certificate],CryptographicException       + FullyQualifiedErrorId:Microsoft.Samples.AzureManagementTools.PowerShell.Certificates.AddCertificateCommand

我们确定serviceName和subscriptionId是正确的,并查看我们可以找到的所有示例,看起来其他参数也是正确的......但显然其中一个(或两个)不是。我们只是看不出原因。

非常感谢任何建议: - )

1 个答案:

答案 0 :(得分:1)

Add-Certificate命令用于将证书(通常带有私钥)上载到托管服务。 IIRC,它将尝试使用.pfx包装器包装.cer文件,并使用简单的密码上传它。这样做是因为门户网站曾经要求使用证书密码(假设人们只使用私钥上传了证书)。根据加密异常,该代码路径中的某些内容可能是错误的。我希望看到更多的堆栈跟踪。

如果你上传了一个pfx(带有可导出键),那有用吗?这只是一个问题,因为.cer文件和缺少密码?

另一个想法:-ServiceName参数可能区分大小写,因为它解析为DNS名称(servicename.cloudapp.net)。你能确定你使用全小写吗?

编辑:另一个想法 - 尝试将.cer导入您的系统并使用get-item cert:格式再次引用它。查看代码,我不能完全确定它是否可以正确使用不是pfx时指定的文件路径。我猜测用空密码导入.cer文件可能会失败。这只是运行我通过内部(思想)调试器看到的代码:

    private byte[] GetCertificateData()
    {
        var cert = new X509Certificate2();
        byte[] certData = null;

        if (((this.CertificateToDeploy is PSObject) && ((PSObject)this.CertificateToDeploy).ImmediateBaseObject is X509Certificate) ||
            (this.CertificateToDeploy is X509Certificate))
        {
            cert = ((PSObject)this.CertificateToDeploy).ImmediateBaseObject as X509Certificate2;

            try
            {
                certData = cert.HasPrivateKey ? cert.Export(X509ContentType.Pfx) : cert.Export(X509ContentType.Pkcs12);
            }
            catch (CryptographicException)
            {
                certData = cert.HasPrivateKey ? cert.RawData : cert.Export(X509ContentType.Pkcs12);
            }
        }
        else
        {
            cert.Import(this.ResolvePath(this.CertificateToDeploy.ToString()), this.Password, X509KeyStorageFlags.Exportable);
            certData = cert.HasPrivateKey ? cert.Export(X509ContentType.Pfx, this.Password) : cert.Export(X509ContentType.Pkcs12);
        }

        return certData;
    }