Subscribed unsubscribe Subscribe Subscribe

HTTPS化のベスト・プラクティス(AWSのRoute53,ACM,ELB,CloudFrontを使用する)

実質HTTPSデファクトになっていますので、HTTPS化する方法をご紹介致します。
※HTTP2はHTTPSを前提としています
Appleはアプリで使用するAPIHTTPSを強制化します

AWSさんのおかげで、HTTPS化するのがとても簡単になっていますので、もはやHTTPを使う理由はないと思います。

ドメインの取得

Route53

ACMで証明書を発行する際にはここで登録したメールアドレスに承認メールがきます

ACMで証明書の取得

    "AcmCertificate" : {
      "Type" : "AWS::CertificateManager::Certificate",
      "Properties" : {
        "DomainName" : { "Ref" :"SiteDomain" },
        "DomainValidationOptions" : [{
          "DomainName" : { "Ref" : "SiteDomain" },
          "ValidationDomain" : { "Ref" : "SiteDomain" }
        }],
        "Tags": [
          { "Key": "Name", "Value": { "Ref": "AWS::StackName" } }
        ]
      }
    }

ドメイン名でメールアドレスを受け取れるようにする必要はありません
※Route53でドメイン取得時に登録したメールアドレスに承認メールがきます
※承認メールのI approveボタンをクリックするだけで証明書が発行済みになります

ELB(クラシック)の場合

SSLCertificateIdに証明書のarnを指定するだけです

        "Listeners": [
          {
            "InstancePort"    : "80",
            "InstanceProtocol": "HTTP",
            "LoadBalancerPort": "443",
            "Protocol"        : "HTTPS",
            "SSLCertificateId": { "Ref" : "AcmCertificateArn" }
          }
        ]

ALB(ELBV2)の場合

CertificateArnに証明書のarnを指定するだけです

    "Listener": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "Properties": {
        "Certificates" : [{
          "CertificateArn" : { "Ref" : "AcmCertificateArn" }
        }],
        "DefaultActions": [
          {
            "Type": "forward",
            "TargetGroupArn": { "Ref": "TargetGroup" }
          }
        ],
        "LoadBalancerArn": { "Ref": "ELBV2" },
        "Port": "443",
        "Protocol": "HTTPS"
      }
    }

CloudFrontの場合

httpsのみ許可して、AcmCertificateArnに証明書のarnを指定するだけです

    "Distribution" : {
      "Type" : "AWS::CloudFront::Distribution",
      "Properties" : {
        "DistributionConfig" : {
          "DefaultCacheBehavior" : {
            ...
            "ViewerProtocolPolicy" : "https-only"
          },
          ...
          "ViewerCertificate": {
            "AcmCertificateArn": { "Ref" : "AcmCertificateArn" },
            "MinimumProtocolVersion": "TLSv1",
            "SslSupportMethod": "sni-only"
          },
          ...
        }
      }