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

編集:7年後、コマンドが少し変更されました:

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

ただし、AWSサービスが不安定な場合があるという点で、chanthemanは正しいので、ELBを再作成する方が良い場合があります。

于 2012-06-04T22:46:53.653 に答える
7

これは不可能です。ELBを削除して、新しいELBを作成する必要があります。

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

それらをIAMから削除することは可能ですが、ELBから常に正しく削除されるとは限らず、ELBは引き続き古いものを使用できます。間違いなく最も安全な方法は、新しいELBを作成し、古いELBを削除することです。

于 2012-06-01T16:45:25.603 に答える
6

AmazonAPIツールを使用して次のコマンドを発行します。

iam-servercertdel -s SERVERCERTNAME
于 2012-09-07T08:28:41.390 に答える
5

これは、Amazonコンソールではなく、API呼び出しを介して可能です。http://docs.amazonwebservices.com/IAM/latest/APIReference/API_DeleteServerCertificate.html EC2ではなくIAMの下にあるため、これに気付いていない可能性があります。

于 2012-06-04T19:39:01.803 に答える
3

最初のステップは、ロードバランサーでの証明書の使用を停止することです。すべてのリスナーを別の証明書に交換するか、証明書をまったく使用しないでください。@SDillardは、彼の回答で、証明書の削除を続行する前に数分待つ必要があることを推奨しています。

AWS Powershellコンソールで次のコマンドを使用して証明書を削除できます(他のツールを使用してこれを行う方法の詳細については、他の回答を参照してください)。AWS SDK for .Netをインストールして、コンソールを入手します。

Remove-IAMServerCertificate <CertificateName>

は、次のような完全なリソース識別子であっては<CertificateName>ならないことに注意してください。証明書名は最後のセグメントです。

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

すべての証明書のリストを取得するには、次のコマンドを使用できます。

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")

何か問題が発生した場合はダウンタイムが発生するため、理想的ではありません。これはAmazonが提供するツールで最高だと思いますが。

于 2020-02-18T00:41:23.697 に答える