web-dev-qa-db-ja.com

Elastic Load Balancerからアップロードされた証明書を削除する

SSL証明書をAWSのElastic Load Balancerに正確にアップロードする方法を確認するために、少しテストと実験を行っています(さまざまなキーと証明書のエンコーディングの問題を解明しています)。

したがって、間違った情報、不足している証明書チェーン、または単なる偽のデータのいずれかで生成したテスト証明書がかなりあります。

私が見る限り、これらの証明書を削除したり、特定の情報が欠落している証明書を更新/置換したりする方法はありません。 「証明書を更新する」ためのAWSの説明( http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/US_UpdatingLoadBalancerSSL.html )は、実際に使用するロードバランサーリスナーを変更する方法を示していますすでにそこにあるか、アップロードできる別の証明書! (それが、そもそも私が最初に非常に多くの証明書を手に入れたことになった方法です)。

誰かが私が間違っていて、それらを削除する方法があることを教えてもらえますか? :D(そしてできればその方法も)

29
Svend Hansen

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

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

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

6
chantheman

次のコマンドを使用して、ELBに関連付けられた証明書を削除できます

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

所有できるこれらの証明書の数には制限があります[10]。

40
Rahul

編集: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

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

13
seren

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

iam-servercertdel -s SERVERCERTNAME
6
Martijn Burger

Amazonコンソールではできませんが、APIコールでは可能です。 http://docs.amazonwebservices.com/IAM/latest/APIReference/API_DeleteServerCertificate.html EC2ではなくIAMの下にあるため、これに気付かなかった可能性があります。

5
Brandon Nicoll

最初のステップは、ロードバランサーでの証明書の使用を停止することです。すべてのリスナーを別の証明書に交換するか、証明書をまったく使用しないでください。 @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にいくつかの変更があったようです。リスナーが現在使用している証明書を削除できました。リスナーの証明書列には「無効な証明書」と表示されていましたが、サイトを参照したときに古い証明書が引き続き返されました。これが一時的なものかどうかはわかりません。

3
Scott Munro

証明書がELBで使用されていない場合は、他の回答に記載されているIAMツールを使用してください。正しい場合は、IAMから削除するのではなく、ELBに新しい正しいものを設定してから、IAMツールを使用して未使用の証明書を削除します。また、証明書を変更してから数分待ってから古い証明書を削除することをお勧めします。正しい証明書が反映されるまでに少し時間がかかる場合があるためです。 ELB DNS名でDigを実行し、各IPアドレスをヒットして、確実に新しい証明書が返されることを確認します。

また、AWSコンソールの最新バージョンは、既存のロードバランサーでの証明書の更新をサポートしていますが、IAMツールを使用して不要な証明書を削除する必要があります。

2
SDillard

私が知る限り(少なくとも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が提供するツールで最高だと思いますが。

0
user48956