30

我一直在测试和试验,以了解如何准确地将 SSL 证书上传到 AWS 的 Elastic Load Balancer(找出不同密钥和证书编码的问题)。

因此,我在那里有相当多的测试证书,我使用错误的信息、缺少的证书链或只是伪造的数据生成了这些证书。

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

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

4

8 回答 8

41

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

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

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

于 2014-02-12T16:24:32.787 回答
13

编辑:七年后,命令发生了一些变化:

aws iam delete-server-certificate --server-certificate-name <cert-name>

您可以使用以下方式获取证书名称:

aws iam list-server-certificates


您可以使用命令行工具iam-servercertdel来执行此操作。不过,您需要先获取路径:

iam-servercertlistbypath

一旦你有了它,你可以删除它:

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

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

于 2012-06-04T22:46:53.653 回答
7

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

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

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

于 2012-06-01T16:45:25.603 回答
6

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

iam-servercertdel -s SERVERCERTNAME
于 2012-09-07T08:28:41.390 回答
5

这不可能通过 Amazon 控制台,而是通过 API 调用。http://docs.amazonwebservices.com/IAM/latest/APIReference/API_DeleteServerCertificate.html您可能没有注意到这一点,因为它们在 IAM 下,而不是 EC2 下。

于 2012-06-04T19:39:01.803 回答
3

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

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

Remove-IAMServerCertificate <CertificateName>

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

arn:aws:iam::297826370175:服务器证书/

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

Get-IAMServerCertificates

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

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

更新:自从我第一次发布这个答案以来,API 似乎发生了一些变化。我只是能够删除当前由侦听器使用的证书。尽管在侦听器中,证书列中显示“无效证书”,但当我浏览该站点时,旧证书继续被退回-不确定这是否只是暂时的。

于 2013-03-13T06:15:15.833 回答
2

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

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

于 2012-06-11T06:34:24.173 回答
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")

它并不理想,因为如果出现任何问题,就会出现停机时间。虽然我认为这是亚马逊提供的工具中最好的。

于 2020-02-18T00:41:23.697 回答