CDO での証明書の使用
CDO は、デバイスに接続するときに証明書の有効性をチェックします。具体的には、CDO は次のことを要求します。
-
デバイスで TLS バージョン 1.0 以降を使用している。
-
デバイスにより提示される証明書が有効期限内であり、発効日が過去の日付である(すなわち、すでに有効になっており、後日に有効化されるようにスケジュールされていない)。
-
証明書は、SHA-256 証明書であること。SHA-1 証明書は受け入れられません。
-
次のいずれかが該当すること。
これらは、ブラウザとは異なる CDO の証明書の使用方法です。
-
自己署名証明書の場合、CDO は、デバイスのオンボーディングまたは再接続時に、ドメイン名チェックを無効にして、代わりに、その証明書が承認ユーザーによって信頼された証明書と完全に一致することをチェックします。
-
CDOは、まだ内部 CA をサポートしていません。現時点では、内部 CA によって署名された証明書をチェックする方法はありません。
ASA デバイスの証明書チェックを、デバイスごとに無効にすることができます。ASA の証明書を CDO が信頼できない場合、そのデバイスの証明書チェックを無効にするオプションがあります。デバイスの証明書チェックの無効化を試みても依然としてデバイスをオンボードできない場合は、デバイスに関して指定した
IP アドレスおよびポートが正しくないか到達可能ではない可能性があります。証明書チェックをグローバルに無効にする方法、またはサポートされている証明書を持つデバイスの証明書チェックを無効にする方法はありません。非 ASA デバイスの証明書チェックを無効にする方法はありません。
デバイスの証明書チェックを無効にしても、CDO は、引き続き TLS を使用してデバイスに接続しますが、接続の確立に使用される証明書を検証しません。つまり、パッシブ中間者攻撃者は接続を盗聴できませんが、アクティブ中間攻撃者は、無効な証明書を CDO
に提供することによって、接続を傍受する可能性があります。
証明書の問題の特定
いくつかの理由で CDO がデバイスをオンボードできない場合があります。UI に「CDO cannot connect to the device using the certificate presented」というメッセージが表示される場合は、証明書に問題があります。このメッセージが
UI に表示されない場合は、問題が接続の問題 (デバイスに到達できない) またはその他のネットワークエラーに関連している可能性が高くなります。
CDO が特定の証明書を拒否する理由を判断するには、SDC ホスト、または関連デバイスに到達できる別のホストで、openssl コマンドラインツールを使用します。次のコマンドを使用して、デバイスによって提示された証明書を示すファイルを作成します。
openssl s_client -showcerts -connect <host>:<port> &> <filename>.txt
このコマンドでは、対話型セッションが開始されるため、数秒後に Ctrl+C キーを押して終了する必要があります。
次のような出力を含むファイルが作成されます。
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com
verify return:1 CONNECTED(00000003)
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
-----BEGIN CERTIFICATE-----
MIIH0DCCBrigAwIBAgIIUOMfH+8ftN8wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
....lots of base64...
tzw9TylimhJpZcl4qihFVTgFM7rMU2VHulpJgA59gdbaO/Bf
-----END CERTIFICATE-----
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIDAjqSMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
....lots of base64...
tzw9TylimhJpZcl4qihFVTgFM7rMU2VHulpJgA59gdbaO/Bf
-----END CERTIFICATE-----
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
....lots of base64...
b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4575 bytes and written 434 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: 48F046F3360225D51BE3362B50CE4FE8DB6D6B80B871C2A6DD5461850C4CF5AB
Session-ID-ctx:
Master-Key: 9A9CCBAA4F5A25B95C37EF7C6870F8C5DD3755A9A7B4CCE4535190B793DEFF53F94203AB0A62F9F70B9099FBFEBAB1B6
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 100800 (seconds)
TLS session ticket:
0000 - 7a eb 54 dd ac 48 7e 76-30 73 b2 97 95 40 5b de z.T..H~v0s...@[.
0010 - f3 53 bf c8 41 36 66 3e-5b 35 a3 03 85 6f 7d 0c .S..A6f>[5...o}.
0020 - 4b a6 90 6f 95 e2 ec 03-31 5b 08 ca 65 6f 8f a6 K..o....1[..eo..
0030 - 71 3d c1 53 b1 29 41 fc-d3 cb 03 bc a4 a9 33 28 q=.S.)A.......3(
0040 - f8 c8 6e 0a dc b3 e1 63-0e 8f f2 63 e6 64 0a 36 ..n....c...c.d.6
0050 - 22 cb 00 3a 59 1d 8d b2-5c 21 be 02 52 28 45 9d "..:Y...\!..R(E.
0060 - 72 e3 84 23 b6 f0 e2 7c-8a a3 e8 00 2b fd 42 1d r..#...|....+.B.
0070 - 23 35 6d f7 7d 85 39 1c-ad cd 49 f1 fd dd 15 de #5m.}.9...I.....
0080 - f6 9c ff 5e 45 9c 7c eb-6b 85 78 b5 49 ea c4 45 ...^E.|.k.x.I..E
0090 - 6e 02 24 1b 45 fc 41 a2-87 dd 17 4a 04 36 e6 63 n.$.E.A....J.6.c
00a0 - 72 a4 ad
00a4 - <SPACES/NULS> Start Time: 1476476711 Timeout : 300 (sec)
Verify return code: 0 (ok)
---
この出力では、最初に、確認リターン(verify return)コードが示されている最後の行に注目してください。証明書に関する問題が存在する場合、このリターンコードはゼロ以外になり、エラーの説明が表示されます。
この証明書エラーコードのリストを展開して、一般的なエラーとその修正方法を確認してください。
0 X509_V_OK:操作が成功しました。
2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:信頼できない証明書の発行者証明書が見つかりませんでした。
3 X509_V_ERR_UNABLE_TO_GET_CRL:証明書の CRL が見つかりませんでした。
4 X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:証明書の署名を復号できませんでした。これは、実際の署名値が、期待値と一致しないのではなく、判別できなかったことを意味します。これは、RSA キーについてのみ意味を持ちます。
5 X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:CRL の署名を復号できませんでした。これは、実際の署名値が、期待値と一致しないのではなく、判別できなかったことを意味します。未使用。
6 X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:証明書 SubjectPublicKeyInfo の公開キーを読み取れませんでした。
7 X509_V_ERR_CERT_SIGNATURE_FAILURE:証明書の署名が無効です。
8 X509_V_ERR_CRL_SIGNATURE_FAILURE:証明書の署名が無効です。
9 X509_V_ERR_CERT_NOT_YET_VALID:証明書がまだ有効ではありません(notBefore の日付が現在時刻より後です)。詳細については、この後の「確認リターンコード:9(証明書がまだ有効ではありません)」を参照してください。
10 X509_V_ERR_CERT_HAS_EXPIRED:証明書の有効期限が切れています(notAfter の日付が現在時刻より前です)。詳細については、この後の「確認リターンコード:10(証明書の有効期限が切れています)」を参照してください。
11 X509_V_ERR_CRL_NOT_YET_VALID:CRL がまだ有効ではありません。
12 X509_V_ERR_CRL_HAS_EXPIRED:CRL の有効期限が切れています。
13 X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:証明書の notBefore フィールドに無効な時刻が含まれています。
14 X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:証明書の notAfter フィールドに無効な時刻が含まれています。
15 X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:CRL の lastUpdate フィールドに無効な時刻が含まれています。
16 X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:CRL の nextUpdate フィールドに無効な時刻が含まれています。
17 X509_V_ERR_OUT_OF_MEM:メモリを割り当てようとしてエラーが発生しました。これは決して発生しないはずの問題です。
18 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:渡された証明書は自己署名済みであり、信頼できる証明書のリストに同じ証明書が見つかりません。
19 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:信頼できない証明書を使用して証明書チェーンを構築できましたが、ルートがローカルで見つかりませんでした。
20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:ローカルでルックアップされた証明書の発行者証明書が見つかりませんでした。これは、通常、信頼できる証明書のリストが完全ではないことを意味します。
21 X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:チェーンに証明書が 1 つしか含まれておらず、それが自己署名済みでないため、署名を検証できませんでした。詳細については、この後の「確認リターンコード:21(最初の証明書を検証できません)」を参照してください。詳細については、この後の「確認リターンコード:21(最初の証明書を検証できません)」を参照してください。
22 X509_V_ERR_CERT_CHAIN_TOO_LONG:証明書チェーンの長さが、指定された最大深度を超えています。未使用。
23 X509_V_ERR_CERT_REVOKED:証明書が失効しています。
24 X509_V_ERR_INVALID_CA:CA 証明書が無効です。CA ではないか、その拡張領域が、提供された目的と一致していません。
25 X509_V_ERR_PATH_LENGTH_EXCEEDED:basicConstraints の pathlength パラメータを超えています。
26 X509_V_ERR_INVALID_PURPOSE:提供された証明書を、指定された目的に使用できません。
27 X509_V_ERR_CERT_UNTRUSTED:ルート CA が、指定された目的に関して信頼できるものとしてマークされていません。
28 X509_V_ERR_CERT_REJECTED:ルート CA が、指定された目的を拒否するようにマークされています。
29 X509_V_ERR_SUBJECT_ISSUER_MISMATCH:件名が現在の証明書の発行者名と一致しないため、現在の候補発行者証明書が拒否されました。-issuer_checks オプションが設定されている場合にのみ表示されます。
30 X509_V_ERR_AKID_SKID_MISMATCH:件名キー識別子が存在し、現在の証明書の認証局キー識別子と一致しないため、現在の候補発行者証明書が拒否されました。-issuer_checks オプションが設定されている場合にのみ表示されます。
31 X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH:発行者名とシリアル番号が存在し、現在の証明書の認証局キー識別子と一致しないため、現在の候補発行者証明書が拒否されました。-issuer_checks オプションが設定されている場合にのみ表示されます。
32 X509_V_ERR_KEYUSAGE_NO_CERTSIGN:keyUsage 拡張領域が証明書の署名を許可していないため、現在の候補発行者証明書が拒否されました。
50 X509_V_ERR_APPLICATION_VERIFICATION:アプリケーション固有のエラーです。未使用。
「New Certificate Detected」メッセージ
自己署名証明書を持つデバイスをアップグレードして、アップグレードプロセス後に新しい証明書が生成された場合、CDO で、[設定(Configuration)] ステータスと [接続(Connectivity)] ステータスの両方として、「新しい証明書が検出されました(New Certificate Detected)」というメッセージが生成されることがあります。このデバイスを引き続き CDO から管理するには、この問題を手動で確認して解決する必要があります。証明書が同期されて、デバイスの状態が正常になったら、このデバイスを管理できます。
(注) |
複数の管理対象デバイスを CDO に同時に一括再接続すると、CDO は、デバイス上の新しい証明書を自動的に確認して受け入れ、それらとの再接続を続行します。
|
新しい証明書を解決するには、次の手順を使用します。
-
[インベントリ(Inventory)] ページに移動します。
-
フィルタを使用して、接続ステータスまたは設定ステータスが [新しい証明書が検出されました(New Certificate Detected)] であるデバイスを表示し、必要なデバイスを選択します。
-
[アクション(Action)] ペインで、[証明書の確認(Review Certificate)] をクリックします。CDO では、確認のために証明書をダウンロードし、新しい証明書を受け入れることができます。
-
[デバイス同期(Device Sync)] ウィンドウで [承認(Accept)] をクリックするか、[デバイスへの再接続(Reconnecting to Device)] ウィンドウで [続行(Continue)] をクリックします。
CDO は、デバイスを新しい自己署名証明書と自動的に同期します。 同期されたデバイスを表示するには、[インベントリ] ページを手動で更新する必要が生じる場合があります。
証明書エラーコード
確認リターンコード:0(OK)(ただし、CDO は証明書エラーを返します)
CDO は、証明書を取得すると、「https://<device_ip>:<port>」への GET コールを実行することにより、デバイスの URL への接続を試みます。これが機能しない場合、CDO は証明書エラーを表示します。証明書が有効である(openssl
が 0 つまり OK を返します)ことがわかった場合、接続しようとしているポートで別のサービスがリッスンしている可能性があります。この場合、次のコマンドを使用できます。
curl -k -u <username>:<password> https://<device_id>:<device_port>/admin/exec/show%20version
これにより、次のように、ASA と確実に通信しているかどうかを確認することができ、HTTPS サーバーが ASA の正しいポートで動作しているかどうかをチェックすることもできます。
# show asp table socket
Protocol Socket State Local Address Foreign Address
SSL 00019b98 LISTEN 192.168.1.5:443 0.0.0.0:*
SSL 00029e18 LISTEN 192.168.2.5:443 0.0.0.0:*
TCP 00032208 LISTEN 192.168.1.5:22 0.0.0.0:*
確認リターンコード:9(証明書がまだ有効ではありません)
このエラーは、提供された証明書の発行日が将来の日付であるため、クライアントがそれを有効なものとして扱わないことを意味します。これは、証明書の不完全な作成が原因である可能性があります。また、自己署名証明書の場合は、証明書生成時のデバイスの時刻が間違っていたことが原因である可能性があります。
エラーには、証明書の notBefore の日付が含まれた行があります。
depth=0 CN = ASA Temporary Self Signed Certificate
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = ASA Temporary Self Signed Certificate
verify error:num=9:certificate is not yet valid
notBefore=Oct 21 19:43:15 2016 GMT
verify return:1
depth=0 CN = ASA Temporary Self Signed Certificate
notBefore=Oct 21 19:43:15 2016 GMT
このエラーから、証明書がいつ有効になるかを判別できます。
修復
証明書の notBefore の日付は過去の日付である必要があります。notBefore の日付をより早い日付にして証明書を再発行できます。この問題は、クライアントまたは発行デバイスのいずれかで時刻が正しく設定されていない場合にも発生する可能性があります。
確認リターンコード:10(証明書の有効期限が切れています)
このエラーは、提供された証明書の少なくとも 1 つの期限が切れていることを意味します。エラーには、証明書の notBefore の日付が含まれた行があります。
error 10 at 0 depth lookup:certificate has expired
この有効期限は、証明書の本文に含まれています。
修復
証明書が本当に期限切れの場合、唯一の修復方法は、別の証明書を取得することです。証明書の有効期限が将来の日付であるのに、openssl が期限切れであると主張する場合は、コンピュータの日付と時刻をチェックしてください。たとえば、証明書が 2020
年に期限切れになるように設定されているのに、コンピュータの日付が 2021 年になっている場合、そのコンピュータは証明書を期限切れとして扱います。
確認リターンコード:21(最初の証明書を検証できません)
このエラーは、証明書チェーンに問題があることと、デバイスによって提示された証明書を信頼できることを openssl が検証できないことを示しています。ここで、上記の例の証明書チェーンを調べて、証明書チェーンがどのように機能するのかを見てみましょう。
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
-----BEGIN CERTIFICATE-----
MIIH0DCCBrigAwIBAgIIUOMfH+8ftN8wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
....lots of base64...
tzw9TylimhJpZcl4qihFVTgFM7rMU2VHulpJgA59gdbaO/Bf
-----END CERTIFICATE-----
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIDAjqSMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
....lots of base64...
tzw9TylimhJpZcl4qihFVTgFM7rMU2VHulpJgA59gdbaO/Bf
-----END CERTIFICATE-----
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
....lots of base64...
b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
-----END CERTIFICATE----- ---
証明書チェーンとは、サーバーによって提示される証明書のリストです。このリストは、サーバー自体の証明書から始まり、そのサーバーの証明書を認証局の最上位の証明書に結び付ける、段階的により上位の中間証明書が含まれます。各証明書には、その件名(「s:」で始まる行)とその発行者(「i」で始まる行)のリストが示されています。
件名は、証明書によって識別されるエンティティです。これには、組織名が含まれており、場合によっては証明書の発行先エンティティの共通名も含まれます。
発行者は、証明書を発行したエンティティです。これには、組織フィールドも含まれており、場合によっては共通名も含まれます。
サーバーは、信頼できる認証局によって直接発行された証明書を持っている場合、証明書チェーンに他の証明書を含める必要がありません。次のような 1 つの証明書が表示されます。
--- Certificate chain 0 s:/C=US/ST=California/L=Anytown/O=ExampleCo/CN=*.example.com i:/C=US/O=Trusted Authority/CN=Trusted Authority
-----BEGIN CERTIFICATE-----
MIIH0DCCBrigAwIBAgIIUOMfH+8ftN8wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
....lots of base64...
tzw9TylimhJpZcl4qihFVTgFM7rMU2VHulpJgA59gdbaO/Bf
-----END CERTIFICATE----- ---
この証明書を提供すると、openssl は、*.example.com の ExampleCo 証明書が、openssl の組み込み信頼ストアに存在する信頼できる認証局の証明書によって正しく署名されていることを検証します。その検証の後に、openssl は、デバイスに正常に接続します。
ただし、ほとんどのサーバーには、信頼できる CA によって直接署名された証明書がありません。代わりに、最初の例のように、サーバーの証明書は 1 つ以上の中間証明書によって署名されており、最上位の中間証明書が、信頼できる CA によって署名された証明書を持ちます。OpenSSL
は、デフォルトでは、これらの中間 CA を信頼せず、信頼できる CA で終わる完全な証明書チェーンが提供されている場合にのみ、それらを検証できます。
中間認証局によって署名された証明書を持つサーバーが、信頼できる CA に結び付けられたすべての証明書(すべての中間証明書を含む)を提供することが非常に重要です。このチェーン全体が提供されない場合、openssl からの出力は次のようなものになります。
depth=0 OU = Example Unit, CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 OU = Example Unit, CN = example.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 OU = Example Unit, CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1
CONNECTED(00000003)
---
Certificate chain
0 s:/OU=Example Unit/CN=example.com
i:/C=US/ST=Massachusetts/L=Cambridge/O=Intermediate Authority/OU=http://certificates.intermediateauth...N=Intermediate Certification Authority/sn=675637734
-----BEGIN CERTIFICATE-----
...lots of b64...
-----END CERTIFICATE-----
---
Server certificate
subject=/OU=Example Unit/CN=example.com
issuer=/C=US/ST=Massachusetts/L=Cambridge/O=Intermediate Authority/OU=http://certificates.intermediateauth...N=Intermediate Certification Authority/sn=675637734
---
No client certificate CA names sent
---
SSL handshake has read 1509 bytes and written 573 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : AES256-SHA
Session-ID: 24B45B2D5492A6C5D2D5AC470E42896F9D2DDDD54EF6E3363B7FDA28AB32414B
Session-ID-ctx:
Master-Key: 21BAF9D2E1525A5B935BF107DA3CAF691C1E499286CBEA987F64AE5F603AAF8E65999BD21B06B116FE9968FB7C62EF7C
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1476711760
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
この出力は、サーバーが 1 つの証明書のみを提供しており、提供された証明書が信頼されたルート認証局ではなく中間認証局によって署名されていることを示しています。この出力には、特性検証エラーも示されています。
修復
この問題は、デバイスによって提示された証明書の設定が間違っているために発生します。この問題を修正して CDO またはその他のプログラムがデバイスに安全に接続できるようにする唯一の方法は、正しい証明書チェーンをデバイスにロードして、接続しているクライアントに完全な証明書チェーンを提示することです。
中間 CA をトラストポイントに含めるには、次のいずれか(CSR が ASA で生成されたかどうかに応じて)のリンク先に記載されている手順に従ってください。