AWS ALBでRSA証明書とECDSA証明書の両方に対応する

ども、大瀧です。
先日、ALBに複数のSSL/TLS証明書を設定できるようになりました。設定方法は以下のブログを参照ください。

複数の証明書というと異なるドメイン名をハンドルするバーチャルホストを連想しますが、今回は同じドメイン名で異なる暗号方式の証明書を設定するパターンをご紹介します。

異なる暗号方式の証明書を用意する目的

TLSのサーバー証明書の暗号方式は複数あり、TLS接続の初期段階(TLSハンドシェイク)で利用する証明書が決められます。暗号方式によってサポートするクライアントや計算量が異なるため、古めのクライアント向けの証明書、計算量の少ない新しめな暗号方式の証明書など複数用意することできめ細かいTLS通信が実現できます。

設定方法

今回は、多くのクライアントがサポートするRSAの証明書とちょっと新しめのECDSAの証明書を設定してみます。設定手順は前述のブログ記事と特に変わりませんが、以下のコツがあります。

1. 追加の証明書として設定する

ALBに設定する証明書は、SNI非対応のクライアントに送るためのデフォルト証明書とSNI用の追加の証明書を区別して設定します。デフォルト証明書は1つのみ設定可で、追加の証明書を含めた証明書の選択が行われないため、今回の用途にデフォルト証明書は利用できません。一方でデフォルト証明書と追加の証明書は同じTLS証明書を登録できるので、デフォルト証明書にはRSA証明書とECDSA証明書のどちらかを登録しておけば良いでしょう。以下の様な感じです。

alb-multicert05

2. クライアントからSNIで接続する

前述の通り今回の用途では追加の証明書にTLS証明書を設定するため、結果的にSNIサポートが必要になります *1openssl s_clientコマンドで動作確認するときには、-servernameオプションでドメイン名を付与しましょう。

動作確認例

suzaku:~ ryuta$ openssl s_client -connect otaki.classmethod.info:443 -cipher ECDHE-RSA-AES128-GCM-SHA256 -servername otaki.classmethod.info < /dev/null
CONNECTED(00000003)
depth=0 CN = otaki.classmethod.info
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = otaki.classmethod.info
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=otaki.classmethod.info
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFDzCCA/egAwIBAgISBH+JLJcP45AmY2xO4+YHqyskMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzEwMTEwMjA5NThaFw0x
ODAxMDkwMjA5NThaMCExHzAdBgNVBAMTFm90YWtpLmNsYXNzbWV0aG9kLmluZm8w
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDjgXgMRQHWiCfyrqUevab0
EkaACEzoeU6ZwY9Ig0XtlwP0nlaR16pYZIJd3M6aChC2G5e7QXSPys3N3LjVa6kP
xyZEybj5CVUlsmFPcnHNk5EwAmKv1/A4i8iB/jrJzJjto3ca2iyy216BNagDoN/U
/Wj6hgg4b6VabNC6fUeQkYHDfYxREwCPeU+pHMqJkkn++LN98HAlxQ2RariNyxrC
RmjlOFBTxTUBBSn+0Xc4kZWcL8Dv40T56oLf0H1paXAEw/EF34YCUeiqivalqJWf
gQ16/F/7eJj/qHuaBD5Hcy6Dlig3EUSC6hjEq+DR4j6Lx7xjHnIO2SmxL0R9oV5F
AgMBAAGjggIWMIICEjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUH
AwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFA/cU2NXbUVO+2uO
516O6qkx/5kkMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsG
AQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNl
bmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNl
bmNyeXB0Lm9yZy8wIQYDVR0RBBowGIIWb3Rha2kuY2xhc3NtZXRob2QuaW5mbzCB
/gYDVR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYB
BQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCB
ngyBm1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkg
UmVseWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUg
Q2VydGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQu
b3JnL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQBzu3nwqLFj1b4enwWd
/kg6qqWy/ymFQsdE18ICJnK0BPdux5XwRrKfofyrMYKw/MluyAMG0ANfDOIr1S49
w5nyCvexGRhM6eFCd5CZgAJI0HhjNUvlNjziwY/89iGY4C1poVUZ8vYwIuDZlA7P
6NHQuJwuL1plelm43fu6SmFZlWiYTT5hUWyXJyD4YKKO6ywnM76XTukZVhFNZ4uO
EXb9wbRMvn9HKudEjO6uqOx5jwpXCDoAZPYZtnASkOJZxlVK+baDW71gt/0RIB43
+G+/WYlCgBdaZjpg90JVeOBchYszIwc3gavInayFkEv4rFaO+vayS7h4qCYYBbez
UEhg
-----END CERTIFICATE-----
subject=/CN=otaki.classmethod.info
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2005 bytes and written 297 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 4AFC8FDD699BF2E048AC803BFC7661F5165F7B85B4DF58C2C2D6F594888AA966
    Session-ID-ctx:
    Master-Key: EB9399F7553A091CECCC8A87F344567F1D794D2923F20F83F8CBB472F172C574F26F04EBA6AEA9255A2F54F7D6C9B711
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 43200 (seconds)
    TLS session ticket:
    0000 - e9 ac 29 5b d9 9f d4 4c-d7 be 26 1f df 75 1a 95   ..)[...L..&..u..
    0010 - 76 ea 0c 45 99 c8 5e 41-2e 95 5a f2 cb 56 6f 82   v..E..^A..Z..Vo.
    0020 - db d5 3d 81 ef 05 0c 17-d5 c5 5e 2a 6c c8 b5 2f   ..=.......^*l../
    0030 - 32 17 65 92 3b 8b fa 8a-fe de 59 02 c0 ad fe eb   2.e.;.....Y.....
    0040 - 41 b3 3a e8 6d bd 86 67-78 89 7e 15 27 39 7c ef   A.:.m..gx.~.'9|.
    0050 - e8 36 9c 4b 68 8e d0 5d-da 62 b1 2b 9d 30 0a 89   .6.Kh..].b.+.0..
    0060 - 8f f6 7b 90 33 1b 45 b9-ce 35 f5 67 20 95 5a 9b   ..{.3.E..5.g .Z.
    0070 - 90 e8 76 f3 3c 58 d9 20-c4 00 49 f8 6e fa 45 15   ..v.<X. ..I.n.E.
    0080 - b5 e3 5b de 49 b2 de de-65 54 cb 8f 04 b7 d8 ec   ..[.I...eT......
    0090 - 3c 74 e0 52 30 65 42 f7-e0 fb ba 54 7d 22 6a 49   <t.R0eB....T}"jI
    00a0 - eb b1 f4 8b 2c 62 21 7b-2f 0f 72 b8 83 37 2e f5   ....,b!{/.r..7..
    00b0 - b6 29 3e b9 82 a4 40 48-44 8a 28 ee 1a 0e 98 de   .)>...@HD.(.....
    00c0 - 9f bd f7 53 62 96 af ad-0e f4 83 6d 12 0e 79 2b   ...Sb......m..y+

    Start Time: 1507852953
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
DONE
suzaku:~ ryuta$ openssl s_client -connect otaki.classmethod.info:443 -cipher ECDHE-ECDSA-AES128-GCM-SHA256 -servername otaki.classmethod.info < /dev/null
CONNECTED(00000003)
depth=0 CN = otaki.classmethod.info
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = otaki.classmethod.info
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=otaki.classmethod.info
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEYTCCA0mgAwIBAgISBHiacePeRMlJokRddc7IFbC7MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzEwMTEwMjA4MTNaFw0x
ODAxMDkwMjA4MTNaMCExHzAdBgNVBAMTFm90YWtpLmNsYXNzbWV0aG9kLmluZm8w
djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQB8Is1yDpfnNYnW4mjTS7xKNTtqZLtVspV
FXG74AfopDzyx6pkWZA7Dr69as4/EgXfsNYm8H+rYUzRGNxr+mezYXJ5hLjy0UAe
JJBl+vhb3wv+j2IdZit+tqCOm/FSbx2jggIWMIICEjAOBgNVHQ8BAf8EBAMCB4Aw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYD
VR0OBBYEFOYqJ1dgo608ENp3kOOEGclNxuUzMB8GA1UdIwQYMBaAFKhKamMEfd26
5tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDov
L29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDov
L2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wIQYDVR0RBBowGIIWb3Rha2ku
Y2xhc3NtZXRob2QuaW5mbzCB/gYDVR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYB
BAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQu
b3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkg
YmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFj
Y29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0
dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUA
A4IBAQBC4EyQQaBrvKEMt001dsj/OYNtah1hyDRRANIf0ydeJ5erk51KU1dAGL7E
96ziE5dF4EbIiIoASOkoiqk8FbuVtQs+SWMRh+ooCBFxUH2EPMyUqTvD1Gd1FaSX
nbSbIT0mcYUtIp68S3NHl4LkmEQGCAeuXbaPQmrwp0bRgD9LNeJ00zNqC3PwuaBW
CAYjbb6o0LYrkdwmQqIbiej7WiYmCDs396HJrOb3MnkhtOCue6w3ksHEukPGnzty
xxNZDFltBTI9fi22yREtYQrj2jTh1ESuQi70EXSGcFSyVxWkama/sRI3zYVoHWTB
C6lLASiechFzOjPe6aQmwgJCR8bs
-----END CERTIFICATE-----
subject=/CN=otaki.classmethod.info
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1679 bytes and written 297 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-ECDSA-AES128-GCM-SHA256
Server public key is 384 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-ECDSA-AES128-GCM-SHA256
    Session-ID: 8535C549C5BB67249BE71166FEF2FCC8DACCB02B88FD0B9F693E1B7301745C91
    Session-ID-ctx:
    Master-Key: 27C093F11FC237EA0A1CB7C96DEE972077D2C7375A82047595A696791C1ACBF7C3077DFF3AD310CD6E7486E1DA61A27B
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 43200 (seconds)
    TLS session ticket:
    0000 - e9 ac 29 5b d9 9f d4 4c-d7 be 26 1f df 75 1a 95   ..)[...L..&..u..
    0010 - ad ed 9b 5f 6a f2 d3 5a-98 7d 53 19 e7 7e 27 c4   ..._j..Z.}S..~'.
    0020 - cc 58 bb 86 40 81 94 51-06 94 0b 36 04 61 f8 69   .X..@..Q...6.a.i
    0030 - 8f 3e a0 40 ff 8b ef a1-19 47 fd 84 7e 29 26 4d   .>.@.....G..~)&M
    0040 - 5e f5 d7 b8 cc f6 b0 a8-85 1f f8 af 0e ec c7 1e   ^...............
    0050 - c0 8a 5e ea 55 d5 39 c1-4e 0a e2 48 ab 84 83 7a   ..^.U.9.N..H...z
    0060 - 48 d3 c2 bc b4 38 43 bb-9b 78 f9 f8 56 d4 f7 c1   H....8C..x..V...
    0070 - 6d 81 b4 07 68 77 6d 30-57 e0 c6 30 06 f0 a7 42   m...hwm0W..0...B
    0080 - 6e ed e2 c7 64 7f 17 1a-93 1a 79 03 a5 ff b5 f0   n...d.....y.....
    0090 - 0f 01 81 06 56 17 0d f3-5b 1e c2 52 98 ff 84 47   ....V...[..R...G
    00a0 - 55 54 74 e9 27 48 5e 49-1b ed 5b 8a fe 37 e1 c6   UTt.'H^I..[..7..
    00b0 - 2f 08 81 61 6e 54 04 f4-6d 53 3d 48 9c a7 52 48   /..anT..mS=H..RH
    00c0 - 2e 9e 78 7d d2 89 cb 9d-32 7d 21 ff 26 9d bd 56   ..x}....2}!.&..V

    Start Time: 1507852956
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
DONE

ECDSAをサポートするChromeブラウザでアクセスすると、ECDSAの証明書が選択されていることが確認できました。

alb-multicert04

まとめ

ALBの複数TLS証明書対応の応用編として、同一ドメインで異なる暗号方式の証明書を利用する様子をご紹介しました。 従来はTLS証明書が高額だったために、幅広いクライアントがサポートする枯れた暗号化方式の証明書のみを利用することが多かったと思います。しかしDV証明書であればACM(AWS Certificate Manager)やLet's Encryptを用いて複数の証明書を手軽に用意できるようになってきましたし、All HTTPSといったTLS通信の一般化も進んでいます *2ので、複数の暗号方式に合わせてそれぞれ証明書を配備することも増えていくのではないかと思います。

参考URL

脚注

  1. 本来のTLS証明書のネゴシエーションは、SNIなしでももちろん行われますので、ALB特有の要件です。
  2. 本ブログもHTTPS対応を進めている真っ最中です