【问题标题】:Deleting uploaded certificate from elastic load balancer从弹性负载均衡器中删除上传的证书
【发布时间】:2020-02-18 10:20:34
【问题描述】:

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

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

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

谁能告诉我我错了,有办法删除它们吗? :D(最好还有怎么做)

【问题讨论】:

  • 这是题外话。大概属于superuser.com
  • 虽然我明白为什么会这样(不是直接的编程问题),但我认为很多使用 AWS 的人更有可能在这里寻找它(或者能够在这里回答它)。尽管我的假设可能是错误的。可以横向移动吗?
  • 接受的答案不再是正确答案。这就是这类问题的问题。我从来没有遇到过删除未使用的证书的问题。如果它们没有分配给现有的 ELB,它们就可以很好地删除。也许有一段时间它不是那么可靠,但截至 2016 年它运行良好。
  • 感谢您的更新,马特。我很高兴自从与 AWS 合作以来取得了一些进展:) 我仍然会留下已接受的答案,因为它解决了我当时遇到的问题。但是,是的,并不是所有的问题都能很好地解决:)

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


【解决方案1】:

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

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

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

【讨论】:

  • 这很顺利,很高兴终于摆脱了那些旧证书。在心脏出血后特别有用!
  • 我用aws iam list-server-certificates找到了我需要删除的证书,我想我会分享!
  • 为我工作。当 aws UI 不公开功能时,值得看看 aws 命令行工具可以做什么。 > 您可以拥有的这些证书的数量有限制 [10]。此后,此限制可能已更新。我们的限制是 20。但我们也使用 VPC,所以我们的限制可能不同。
【解决方案2】:

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

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 有时会更好。

【讨论】:

  • 我尝试按上述方式运行它并得到错误“不允许参数”。我在长字符串之前添加了一个“-s”,但它随后抱怨非字母数字。然而,运行它只是:iam-servercertdel -s my-company-cert 工作除了,正如@chantheman 所描述的,证书仍然存在于 ELB。
  • 我只是将名称本身 (my-company-cert) 与 s 一起使用。为我工作。
【解决方案3】:

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

见: https://forums.aws.amazon.com/thread.jspa?threadID=57632

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

【讨论】:

  • 我已经 +1 了所有三个答案,但这个是我已经使用的一个,因为它是删除 ELB,现在终于使额外的证书消失了。做起来并不难,但并不明显它会起作用:)
  • 现在实际上可以在ELB上更改它们......但仍然无法将它们全部删除。
  • 不会创建新的 ELB 会导致新的 ELB 域并因此破坏所有 CNAME 映射?
  • 还有其他答案不需要删除负载均衡器。看看我的和来自@SDillard 的那个。
  • 我也有同样的情况。当您删除 ELB 并创建一个新的 ELB 时,是否可以“事后”将新的负载均衡器与您的 Beanstalk 环境相关联?
【解决方案4】:

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

iam-servercertdel -s SERVERCERTNAME

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 可以从 IAM 中删除它们,但它们并不总是从 ELB 中正确删除,ELB 可以继续使用旧的。我肯定会说最安全的方法是创建一个新的 ELB 并删除旧的。
    • 确实适用于从 IAM 中删除证书,但不能从 ELB 中删除,正如@chantheman 指出的那样。
    • 证书在侦听器级别,而不是 ELB 级别。删除证书和侦听器可能会阻止删除整个负载均衡器。
    • +1 BNicoll 在此处替换听众的建议非常有效。
    【解决方案6】:

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

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

    Remove-IAMServerCertificate <CertificateName>
    

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

    arn:aws:iam::297826370175:server-certificate/

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

    Get-IAMServerCertificates
    

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

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

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

    【讨论】:

    • 这似乎不可能(至少通过 boto)。 - 您可以向侦听器添加新证书,但不能作为默认证书 - 您不能删除现有的“默认”证书,因为它是默认证书 - 您无法修改哪个证书是默认证书 - SSL 侦听器可能没有证书(您不能删除所有证书并添加新的默认证书)。
    【解决方案7】:

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

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

    【讨论】:

    • 我认为这是我第一次做的事情,但是直到我删除并重新创建了 ELB,证书才消失。不确定这是否是因为我在运行 IAM 删除之前没有等待足够长的时间,但我不这么认为,因为当我运行删除时,一些证书有一段时间没有分配给 ELB。 .
    【解决方案8】:

    据我所知(至少使用 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")
    
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多