从弹性负载均衡器中删除上载的证书

时间:2012-06-01 15:59:05

标签: amazon-ec2 amazon-web-services ssl-certificate amazon-elb

我一直在测试和试验一下,以了解如何将SSL证书上传到AWS的弹性负载均衡器(找出不同密钥和证书编码的问题)。

因此我有很多测试证书,我用错误的信息,缺少证书链或只是虚假数据生成了这些证书。

据我所知,无法删除这些证书,甚至无法更新/替换缺少某些信息的证书。 AWS的“更新证书”(http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/US_UpdatingLoadBalancerSSL.html)的说明实际上只是向您展示如何更改负载均衡器侦听器以使用已存在的其他证书或者您也可以上载的证书! (这正是我最初在那里得到如此多证书的原因)。

有人可以告诉我,我错了,有办法删除它们吗? :D(最好也是如何做到)

8 个答案:

答案 0 :(得分:40)

您可以使用以下命令删除ELB关联证书

 aws iam delete-server-certificate --server-certificate-name certificate_object_name

您可以拥有这些证书的数量限制[10]。

答案 1 :(得分:13)

您可以使用命令行工具“iam-servercertdel”来执行此操作。你需要首先获得路径:

iam-servercertlistbypath

完成后,您可以将其删除:

iam-servercertdel arn:aws:iam::10494620000:server-certificate/my-company-cert

然而,chantheman是正确的,因为AWS服务有时可能不稳定,因此重新创建ELB有时会更好。

答案 2 :(得分:6)

这是不可能的。您必须删除ELB并创建一个新的。

请参阅: https://forums.aws.amazon.com/thread.jspa?threadID=57632

可以从IAM中删除它们,但它们并不总是从ELB中正确删除,并且ELB可以继续使用旧的。我肯定会说最安全的方法是创建一个新的ELB并删除旧的ELB

答案 3 :(得分:6)

使用amazon API工具发出以下命令:

iam-servercertdel -s SERVERCERTNAME

答案 4 :(得分:5)

无法通过亚马逊控制台,但通过API调用。 http://docs.amazonwebservices.com/IAM/latest/APIReference/API_DeleteServerCertificate.html您可能没有注意到这一点,因为它们属于IAM,而不是EC2。

答案 5 :(得分:3)

您的第一步应该是停止在负载均衡器中使用证书。将所有侦听器交换到另一个证书或根本不使用证书。 @SDillard在答案中建议你等几分钟再继续删除证书。

您可以在AWS Powershell控制台中使用以下命令删除证书(有关如何使用其他工具执行此操作的详细信息,请参阅其他答案)。安装AWS SDK for .Net以获取控制台。

Remove-IAMServerCertificate <CertificateName>

请注意,<CertificateName> 应该是完整的资源标识符,如下所示。证书名称是最后一段。

ARN:AWS:IAM :: 297826370175:服务器证书/

要获取所有证书的列表,可以使用以下命令。

Get-IAMServerCertificates

现在,当您返回负载均衡器(在AWS管理控制台中)中的侦听器的SSL证书配置时,您不应再在下拉框中看到您删除的证书。

如果出于某种原因,这不起作用,那么您也可以尝试重新创建负载均衡器(删除现有负载均衡器并创建一个新负载均衡器)。但请注意,这可能意味着您需要进行一些与DNS相关的更改,因为新的负载均衡器将具有不同的DNS名称。您的CName记录可能需要更改。

更新:自从我第一次发布此答案后,看起来API已经发生了一些变化。我只能删除当前正由侦听器使用的证书。虽然在监听器,证书列中它说“无效证书”,但当我浏览网站时,旧证书仍然被返回 - 不确定这只是暂时的事情。

答案 6 :(得分:2)

如果证书未在ELB上使用,请使用其他答案中提到的IAM工具。如果是,那么您不应该从IAM中删除它,而应该为ELB设置新的,正确的,然后使用IAM工具删除未使用的证书。我还建议您在删除旧证书之前等待几分钟,因为可能需要一点时间才能传播正确的证书;只需挖掘一下ELB DNS名称并点击每个IP地址,确保它返回新证书以确保。

此外,最新版本的AWS控制台支持更新现有负载均衡器上的证书,但您仍需使用IAM工具删除不需要的证书。

答案 7 :(得分:0)

据我所知(至少使用Boto3)

  • 您可以将新证书添加到侦听器,但不能作为默认证书(isDefault属性被拒绝)
  • 您不能删除现有的“默认”证书,因为它是默认的
  • 您不能修改哪个证书为默认证书
  • SSL侦听器可能没有证书(您不能删除所有证书并添加新的默认证书)。

因此,剩下的唯一选择是删除负载平衡器或删除侦听器(嘿!)。因为侦听器可能附加了许多路由信息,所以这是PITA。所以,我推荐的是:

  • 上传证书
  • 检索引用旧SSL的侦听器的状态
  • 记下他们的规则
  • 删除那些听众
  • 仅更改其CertificateArn(指向您的新证书)来重新创建它们。

类似这样的东西:

   import boto3

   def fixRule(rule): 
            """Copy a rule so that it can be submitted as a new rule"""
            rule = rule.copy()
            if rule["IsDefault"]:
                # The default rule is set at create_listener
                return None

            def fix_condition(c):
                c = c.copy()
                del c["Values"]
                return c
            rule["Conditions"] = [fix_condition(c) for c in rule.get("Conditions",())]
            # del rule["Priority"]
            del rule["RuleArn"]
            del rule["IsDefault"]
            # rule["Priority"] = rule["Priority"]
            try:
                rule["Priority"] = int(rule["Priority"])
            except:
                del rule["Priority"]
            return rule


   acmClient = session.client('acm')
   response = acmClient.import_certificate(
                Certificate=certificate,
                PrivateKey=privatekey,
                CertificateChain=chain
            )
   current_ssl_arn = response[ 'CertificateArn']

   session.client('resourcegroupstaggingapi').tag_resources(
                ResourceARNList=[
                    current_ssl_arn
                ],
                Tags={ ... whaterver }
                }
            )

   # Replace each SSL listener with one that has a new certificate.
   lbClient = session.client('elbv2')
   listeners = lbClient.describe_listeners(LoadBalancerArn=self.lb_arn["Listeners"]


   # Make existing listeners use the certificate
   # Delete exisiting listeners with SSL certificates
   # Create a new one with the same parameters and rules as the old one.
   for l in listeners:
            oldListenerArn = l["ListenerArn"]

            # Only deal with SSL listeners
            if l.get("SslPolicy")==None: continue

            _listener_certs = l.get("Certificates",())
            _listener_cert_arns = set(c['CertificateArn'] for c in _listener_certs)

            # Great! already up-to-date
            if current_ssl_arn in _listener_cert_arns: continue


            # Backup the rules
            oldRules = lbClient.describe_rules(ListenerArn=oldListenerArn)['Rules']

            # Recreate the listener with the new certificate
            print("Replacing listener")
            _ = lbClient.delete_listener(ListenerArn = oldListenerArn)

            l = l.copy()
            del l["ListenerArn"]
            l["Certificates"] = [{"CertificateArn":current_ssl_arn}]
            newListener = lbClient.create_listener(**l)["Listeners"][0]
            newListenerArn = newListener["ListenerArn"]

            print("Replacing listener .. copying ({}) rules ".format(len(oldRules)))
            for rule in oldRules:
                rule = fixRule(rule)
                if rule is None: continue
                _ = lbClient.create_rule(
                    ListenerArn=newListenerArn,
                    **rule)
            print("Replacing listener .. OK")

这不是理想的,因为如果发生任何错误,则将导致停机。尽管我认为这是Amazon提供的工具中最好的。