3
votes

CloudFormation AWS :: CertificateManager :: Certificat de validation de certificat automatisé

Selon les documents AWS ici et ici, je devrais être en mesure d'automatiser la création et la validation d' un certificat à l'aide de cloudformation. Apparemment, lorsque vous spécifiez un HostedZoneId dans DomainValidationOptions , il est censé créer l'enregistrement DNS requis pour terminer la validation (du moins c'est ce qu'il semble de la documentation très vague). Mon modèle CF pour le certificat ressemble à ceci:

Resources:
  MyAPICert:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: xxxx.dev.mydomain.io
      DomainValidationOptions:
        - DomainName: mydomain.io
          HostedZoneId: /hostedzone/Z03XXXXXXXXXXXX
      ValidationMethod: DNS

`` mydomain.io '' (changé bien sûr) a été enregistré en utilisant AWS en tant que registraire, car les documents indiquent que cela doit être le cas pour que la validation automatisée fonctionne.

Ce modèle ci-dessus est inclus dans un serverless.yml en tant que ressource. Cependant, lorsque je déploie, la création de la pile est juste bloquée en attendant l'enregistrement DNS - c'est-à-dire qu'elle n'ajoute pas l'entrée CNAME requise comme je comprends qu'elle est censée le faire et en tant que telle, la pile est bloquée.

Quelqu'un a-t-il fait fonctionner cette fonctionnalité?

Et, oui, je connais les ressources personnalisées tierces qui essaient de faire la même chose, je ne veux pas les utiliser si CF est censé le faire de manière native maintenant.


2 commentaires

Je commence à me demander si HostedZoneId est censé être sans le préfixe /hostedzone/ qui est ce que j'ai obtenu de la sortie aws route53 list-hosted-zones : { "HostedZones": [ { "Id": "/hostedzone/Z03XXXXXXXXXXXX", "Name": "mydomain.io.", }


Hmm..nope ... se comporte de la même manière même si /hostedzone/ préfixe /hostedzone/ .


3 Réponses :


0
votes

Je viens de déployer le modèle ci-dessous sur CloudFormation et il a créé avec succès les enregistrements DNS de validation et autorisé le certificat.

Si vous deviez passer les paramètres SiteDnsZoneName=mydomain.io. et SiteDnsZoneId=ABCDEFGHIJKLMNOPQRSTU cela créerait un certificat SAN qui couvre à la fois mydomain.io et *.mydomain.io

{
    "Description": "Deploy wildcard SAN cert inc bare domain. (Must deploy cert to us-east-1 for CloudFront)",
    "Parameters": {
        "SiteDnsZoneName": {
            "Type": "String",
            "MinLength": 4,
            "Description": "DNS Zone",
            "Default": "example.com"
        },
        "SiteDnsZoneId": {
            "Type": "String",
            "MinLength": 8,
            "Description": "DNS Zone Id",
            "Default": "ABCDEFGHIJKLMNOPQRSTU"
        }
    },
    "Resources": {
        "SiteCertificate": {
            "Type": "AWS::CertificateManager::Certificate",
            "Properties": {
                "DomainName": {
                    "Fn::Join": [
                        ".",
                        [
                            "*",
                            {
                                "Ref": "SiteDnsZoneName"
                            }
                        ]
                    ]
                },
                "SubjectAlternativeNames": [
                    {
                        "Ref": "SiteDnsZoneName"
                    }
                ],
                "DomainValidationOptions": [
                    {
                        "DomainName": {
                            "Ref": "SiteDnsZoneName"
                        },
                        "HostedZoneId": {
                            "Ref": "SiteDnsZoneId"
                        }
                    }
                ],
                "ValidationMethod": "DNS"
            }
        }
    }
}

Remarque: si vous souhaitez utiliser un certificat dans CloudFront, vous devez déployer le certificat dans us-east-1.

Remarque 2: Route53 doit héberger votre zone DNS, mais il n'est pas nécessaire qu'AWS soit le registraire. Votre domaine peut être enregistré auprès de n'importe quel fournisseur, à condition que vous utilisiez les serveurs de noms AWS fournis par Route53 lorsque vous ajoutez la zone.


6 commentaires

Combien de temps a-t-il fallu à l'enregistrement CNAME pour être créé? J'ai attendu jusqu'à 30 minutes et aucune entrée CNAME n'est apparue (il n'y avait pas non plus d'erreur dans la pile).


Au-dessus de la pile, le déploiement a pris 6 ou 7 minutes (ce qui a créé le CNAME et créé / activé le certificat). Quelle sortie / erreur donne-t-il si vous laissez le temps imparti? Quelle région déployez-vous?


Ce n'est jamais le temps, je peux essayer ça et laisser ça pour la nuit. Dans le journal, il y a une sortie indiquant ce qui doit être mis dans DNS, mais il n'y a rien dans la pile indiquant qu'il le fait (et en fait ce n'est pas le cas). Déploiement vers us-east-2.


Pouvez-vous déployer tout sur us-east-1 ou déployer uniquement un certificat sur us-east-1 et utiliser l'ARN de certificat us-east-1 pour votre application us-east-2? C'est bizarre, ce n'est pas une erreur - mais je soupçonne que c'est dû à la région.


Configuré exactement comme ci-dessus mais n'a pas fonctionné jusqu'à ce que j'ai changé la propriété DomainName sous DomainValidationOptions pour qu'elle soit la même que la propriété DomainName sous les propriétés du certificat comme @ X-Guardian a suggéré dans la réponse (je sais, cela n'a pas de sens car j'utilise également un domaine générique). Lorsque j'ai fait cela, CFN a commencé à créer automatiquement l'enregistrement CNAME. Cependant, le modèle de pile est toujours là en attendant que le certificat soit validé. Le gestionnaire de certificats affiche également «En attente de validation» malgré l'enregistrement CNAME correctement ajouté.


Rendre les propriétés DomainName identiques ne fonctionnait que car .example.com n'inclut pas example.com. Voir RFC 2459 cité ici : Un caractère générique " " PEUT être utilisé comme composant de nom le plus à gauche dans le certificat. Par exemple, * .example.com correspondrait à a.example.com, foo.example.com, etc. mais ne correspondrait pas à example.com. Je l'ai donc rétabli à ma configuration d'origine et ajouté example.com sous SubjectAlternativeNames.



1
votes

J'ai touché le même problème. Vous devez spécifier le nom de domaine complet, y compris l'hôte dans le paramètre DomainValidationOptions DomainName , et spécifiez simplement l'ID de la zone hébergée:

Resources:
  MyAPICert:
    Type: AWS::CertificateManager::Certificate
    Properties:
      DomainName: xxxx.dev.mydomain.io
      DomainValidationOptions:
       - DomainName: xxxx.dev.mydomain.io
         HostedZoneId: Z03XXXXXXXXXXXX
      ValidationMethod: DNS

Lors de mes tests, l'enregistrement de validation Route53 a été ajouté environ une minute après l'exécution de la pile, et le domaine a réussi à valider itslef après environ 15 minutes.


2 commentaires

Par golly c'était ça! Ce serait bien si ce détail était documenté quelque part! Grâce à vous, il est maintenant documenté dans la documentation «non officielle» pour toute autre personne ayant le même problème.


Il y a une note sous la propriété HostedZoneId de la documentation DomainValidationOption qui se lit comme suit: "L'API ListHostedZones renvoie les identifiants au format '/ hostszone / Z111111QQQQQQQ', mais CloudFormation exige que les identifiants soient au format 'Z111111QQQQQQQQ'".



1
votes

Si cela reste bloqué comme en cours pendant une longue période, il se peut que vous utilisiez une zone hébergée privée lorsque vous devez utiliser la zone publique. Vous n'utilisez probablement pas d'autorité de certification privée. Ce processus devrait prendre 2 à 3 minutes, pas plus.


0 commentaires