У меня есть проект, который включает пользовательскую аутентификацию клиента для реализации сервера StrongSwan IKEv2 в Linux.
Я использую: StrongSwan 5.4.0 с плагином eap-radius
В настоящее время мы используем FreeRadius для общения EAP-MSCHAPv2 с различными клиентскими платформами (Windows, Mac, Linux). Из-за некоторых ограничений нам необходимо реализовать собственный «говорящий» сервер RADIUS + EAP-MSCHAPv2 для замены FreeRadius. Я не буду вдаваться в подробности, почему это необходимо (но я скажу, что это необходимо), но я столкнулся с проблемой, которую, кажется, не могу понять.
Следуя спецификациям RFC для протокола RADIUS, а также протоколов EAP и MSCHAPv2, я создал POC-сервер, который аутентифицирует клиентов. Реализация работает для всех клиентов Mac OSX, клиентов Android (с использованием приложения strongswan) и клиентов Linux.
Проблемы начинаются с клиентов Windows (проверено Windows 10 + 7). По какой-то причине клиент Windows выдает ошибку с кодом 691, который является общей ошибкой, подразумевающей либо неправильное имя пользователя / пароль, либо неправильный протокол аутентификации.
Я неоднократно подтверждал, что моя реализация EAP-MSCHAPv2 соответствует спецификациям RFC:
MSCHAPv2 RFC: https://tools.ietf.org/html/rfc2759
Внизу этого RFC приведены примеры наборов данных. Когда я использую имя пользователя и пароль в этих примерах, мой код генерирует правильный вывод:
INPUTS:
AuthenticatorChallenge = 5B5D7C7D7B3F2F3E3C2C602132262628
PeerChallenge = 21402324255E262A28295F2B3A337C7E
username = "User"
password = "clientPass"
OUTPUT:
8-octet Challenge: = D02E4386BCE91226
24 octet NT-Response:: 82309ECD8D708B5EA08FAA3981CD83544233114A3D85D6DF
42-octet AuthenticatorResponse: S=407A5589115FD0D6209F510FE9C04566932CDA56
Это подтверждает, что моя реализация соответствует спецификации RFC для данных, которые должны быть вычислены во время частей MSCHAPv2 диалога EAP. Это также подтверждается тем фактом, что клиенты Mac, Android и Linux успешно проходят аутентификацию.
Это заставляет меня думать, что ошибка Windows связана с форматом пакета, а не с базовыми значениями, генерируемыми моим кодом. С этой целью я включил полное ведение журнала отладки в StrongSwan и направил аутентификацию обратно на FreeRadius, чтобы я мог регистрировать успешный диалог аутентификации с FreeRadius, а затем сравнивать пакеты с моим собственным POC.
Ниже приведен успешный диалог Windows EAP с FreeRadius:
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> => 168 bytes @ 0x7f55f00014b0
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 0: 01 F6 00 A8 73 40 3E 5D A8 2A 50 21 53 8E FE 52 ....s@>].*P!S..R
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 16: 0F 14 D1 8E 01 12 72 34 32 6D 33 6E 63 76 2D 65 ......r42m3ncv-e
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00 8wfpg3=.........
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D ........W.ikev2-
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E mschapv2...4.#..
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36 196.52.46.35..66
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 17 02 00 .207.208.226O...
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 112: 00 15 01 72 34 32 6D 33 6E 63 76 2D 65 38 77 66 ...r42m3ncv-e8wf
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 128: 70 67 33 20 13 63 61 2D 30 30 31 5F 73 74 72 6F pg3 .ca-001_stro
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 144: 6E 67 73 77 61 6E 50 12 E1 CD BD 37 42 F0 6C BE ngswanP....7B.l.
Jul 30 01:02:38 87[CFG] <ikev2-mschapv2|1> 160: 64 AB BD F6 19 B6 9A A6 d.......
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> => 112 bytes @ 0x7f55f0000de0
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> 0: 0B F6 00 70 ED 7D 83 2C AF 6E 81 05 ED E7 73 43 ...p.}.,.n....sC
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> 16: 60 19 76 B7 1A 0C 00 00 01 37 1C 06 0A FF FF 03 `.v......7......
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> 32: 4F 2C 01 01 00 2A 1A 01 01 00 25 10 FC 80 3D 84 O,...*....%...=.
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> 48: 7A A0 ED DC FF E3 CB 7C C3 07 62 FC 72 34 32 6D z......|..b.r42m
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> 64: 33 6E 63 76 2D 65 38 77 66 70 67 33 50 12 63 4F 3ncv-e8wfpg3P.cO
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> 80: 24 0B F0 D1 B3 09 7B 74 40 5C DF FC FB CC 18 12 $.....{t@\......
Jul 30 01:02:39 87[CFG] <ikev2-mschapv2|1> 96: 01 A0 90 AE 01 A1 8A DA 3E A1 21 17 0E 05 88 2C ........>.!....,
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 42 bytes @ 0x7f55f0000ee0
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1> 0: 01 01 00 2A 1A 01 01 00 25 10 FC 80 3D 84 7A A0 ...*....%...=.z.
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1> 16: ED DC FF E3 CB 7C C3 07 62 FC 72 34 32 6D 33 6E .....|..b.r42m3n
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1> 32: 63 76 2D 65 38 77 66 70 67 33 cv-e8wfpg3
Jul 30 01:02:39 87[IKE] <ikev2-mschapv2|1> initiating EAP_MSCHAPV2 method (id 0x01)
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> => 240 bytes @ 0x7f5618001570
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 0: 01 F7 00 F0 8A 5D 27 E3 01 D1 65 4C 07 7B CC 4A .....]'...eL.{.J
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 16: 41 12 87 95 01 12 72 34 32 6D 33 6E 63 76 2D 65 A.....r42m3ncv-e
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00 8wfpg3=.........
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D ........W.ikev2-
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E mschapv2...4.#..
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36 196.52.46.35..66
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 4D 02 01 .207.208.226OM..
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 112: 00 4B 1A 02 01 00 46 31 7F D3 69 D7 24 FB 6A 9E .K....F1..i.$.j.
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 128: 22 39 C7 3F B0 43 94 3C 00 00 00 00 00 00 00 00 "9.?.C.<........
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 144: 76 E7 D7 C3 6B 69 85 B0 1F 7E EF 8D 11 C6 78 28 v...ki...~....x(
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 160: D3 F4 78 04 40 BD BD 39 00 72 34 32 6D 33 6E 63 ..x.@..9.r42m3nc
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 176: 76 2D 65 38 77 66 70 67 33 20 13 63 61 2D 30 30 v-e8wfpg3 .ca-00
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 192: 31 5F 73 74 72 6F 6E 67 73 77 61 6E 18 12 01 A0 1_strongswan....
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 208: 90 AE 01 A1 8A DA 3E A1 21 17 0E 05 88 2C 50 12 ......>.!....,P.
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 224: 73 4F EF F8 F6 08 B9 31 DA FC 35 25 0F CF 00 30 sO.....1..5%...0
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> => 121 bytes @ 0x7f5618001160
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 0: 0B F7 00 79 F6 E1 7C CC C5 C7 FA 31 F7 9A 68 45 ...y..|....1..hE
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 16: 71 6A D6 A9 1A 0C 00 00 01 37 1C 06 0A FF FF 03 qj.......7......
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 32: 4F 35 01 02 00 33 1A 03 01 00 2E 53 3D 32 30 46 O5...3.....S=20F
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 48: 46 45 45 38 39 43 31 31 41 39 37 36 44 45 43 34 FEE89C11A976DEC4
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 64: 38 46 42 46 44 34 44 44 31 33 32 46 43 31 36 33 8FBFD4DD132FC163
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 80: 36 39 33 35 31 50 12 D1 D9 D9 CB 8D C1 9A F8 EE 69351P..........
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 96: 40 12 C5 13 F5 CD 40 18 12 01 A0 90 AE 00 A2 8A @.....@.........
Jul 30 01:02:39 48[CFG] <ikev2-mschapv2|1> 112: DA 3E A1 21 17 0E 05 88 2C .>.!....,
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 51 bytes @ 0x7f56180012c0
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1> 0: 01 02 00 33 1A 03 01 00 2E 53 3D 32 30 46 46 45 ...3.....S=20FFE
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1> 16: 45 38 39 43 31 31 41 39 37 36 44 45 43 34 38 46 E89C11A976DEC48F
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1> 32: 42 46 44 34 44 44 31 33 32 46 43 31 36 33 36 39 BFD4DD132FC16369
Jul 30 01:02:39 48[IKE] <ikev2-mschapv2|1> 48: 33 35 31 351
Jul 30 01:02:39 48[ENC] <ikev2-mschapv2|1> added payload of type EAP to message
Jul 30 01:02:39 124[ENC] <ikev2-mschapv2|1> parsed IKE_AUTH request 4 [ EAP/RES/MSCHAPV2 ]
Jul 30 01:02:39 124[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 6 bytes @ 0x7f55d80012f0
Jul 30 01:02:39 124[IKE] <ikev2-mschapv2|1> 0: 02 02 00 06 1A 03 ......
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> => 171 bytes @ 0x7f55d8000980
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 0: 01 A8 00 AB CA 0B A5 7E 53 26 BB 1F 7B F5 BC 66 .......~S&..{..f
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 16: BD 7B 9D 87 01 12 72 34 32 6D 33 6E 63 76 2D 65 .{....r42m3ncv-e
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00 8wfpg3=.........
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D ........W.ikev2-
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E mschapv2...4.#..
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36 196.52.46.35..66
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 08 02 02 .207.208.226O...
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 112: 00 06 1A 03 20 13 63 61 2D 30 30 31 5F 73 74 72 .... .ca-001_str
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 128: 6F 6E 67 73 77 61 6E 18 12 01 A0 90 AE 00 A2 8A ongswan.........
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 144: DA 3E A1 21 17 0E 05 88 2C 50 12 AA 6E 35 90 03 .>.!....,P..n5..
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 160: 74 77 80 4A 2E BD FD A7 B2 C5 5B tw.J......[
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> received RADIUS Access-Accept from server '127.0.0.1'
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> => 182 bytes @ 0x7f55d8001750
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 0: 02 A8 00 B6 61 C5 9A 92 51 CB DD 0B DF 37 3A 0F ....a...Q....7:.
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 16: 83 40 AB F2 1A 0C 00 00 01 37 1C 06 0A FF FF 03 .@.......7......
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 32: 1A 0C 00 00 01 37 07 06 00 00 00 01 1A 0C 00 00 .....7..........
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 48: 01 37 08 06 00 00 00 06 1A 2A 00 00 01 37 10 24 .7.......*...7.$
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 64: E6 DC E1 89 5C 76 E8 8A BA 58 F7 7B B6 5E 62 4C ....\v...X.{.^bL
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 80: 7F EB BB C2 45 5A 6B F7 0E 01 F3 9E 0F AD 0E AE ....EZk.........
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 96: A3 92 1A 2A 00 00 01 37 11 24 ED F6 C9 A5 D7 3A ...*...7.$.....:
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 112: 0D C4 4D 93 4F 99 6E 81 28 AC B1 CE 30 DA A0 AF ..M.O.n.(...0...
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 128: 4F 28 71 60 12 E5 35 39 04 27 A6 68 4F 06 03 02 O(q`..59.'.hO...
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 144: 00 04 50 12 C3 89 53 1A 29 FD 07 DD 11 FB 65 82 ..P...S.).....e.
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 160: 73 93 0C B2 01 12 72 34 32 6D 33 6E 63 76 2D 65 s.....r42m3ncv-e
Jul 30 01:02:39 124[CFG] <ikev2-mschapv2|1> 176: 38 77 66 70 67 33 8wfpg3
Теперь разговор EAP с моим POC:
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> => 168 bytes @ 0x7fc2800019c0
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 0: 01 56 00 A8 C3 0E 12 EC A6 1A 72 E2 3C CA 4A 78 .V........r.<.Jx
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 16: 54 E4 35 51 01 12 72 34 32 6D 33 6E 63 76 2D 65 T.5Q..r42m3ncv-e
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00 8wfpg3=.........
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D ........W.ikev2-
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E mschapv2...4.#..
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36 196.52.46.35..66
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 17 02 00 .207.208.226O...
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 112: 00 15 01 72 34 32 6D 33 6E 63 76 2D 65 38 77 66 ...r42m3ncv-e8wf
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 128: 70 67 33 20 13 63 61 2D 30 30 31 5F 73 74 72 6F pg3 .ca-001_stro
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 144: 6E 67 73 77 61 6E 50 12 0F F1 22 79 D1 AD DE 25 ngswanP..."y...%
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 160: 5B 01 3D A7 19 81 8A AC [.=.....
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> => 100 bytes @ 0x7fc280000d20
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 0: 0B 56 00 64 BF 61 D9 0F 42 95 2C 76 A4 41 C3 0F .V.d.a..B.,v.A..
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 16: 59 9B A4 FA 4F 2C 01 01 00 2A 1A 01 01 00 25 10 Y...O,...*....%.
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 32: 15 C1 FB 92 B0 5A D7 64 1D 60 C5 46 69 00 DA E5 .....Z.d.`.Fi...
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 48: 72 34 32 6D 33 6E 63 76 2D 65 38 77 66 70 67 33 r42m3ncv-e8wfpg3
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 64: 18 12 15 C1 FB 92 B0 5A D7 64 1D 60 C5 46 69 00 .......Z.d.`.Fi.
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 80: DA E5 50 12 41 E8 6C 15 EF 59 DC CC A0 C7 7A A7 ..P.A.l..Y....z.
Jul 30 00:33:24 89[CFG] <ikev2-mschapv2|1> 96: 3A 70 2D 82 :p-.
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 42 bytes @ 0x7fc280001650
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1> 0: 01 01 00 2A 1A 01 01 00 25 10 15 C1 FB 92 B0 5A ...*....%......Z
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1> 16: D7 64 1D 60 C5 46 69 00 DA E5 72 34 32 6D 33 6E .d.`.Fi...r42m3n
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1> 32: 63 76 2D 65 38 77 66 70 67 33 cv-e8wfpg3
Jul 30 00:33:24 89[IKE] <ikev2-mschapv2|1> initiating EAP_MSCHAPV2 method (id 0x01)
Jul 30 00:33:24 100[ENC] <ikev2-mschapv2|1> parsed IKE_AUTH request 3 [ EAP/RES/MSCHAPV2 ]
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 75 bytes @ 0x7fc2940069c0
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 0: 02 01 00 4B 1A 02 01 00 46 31 B2 2F A8 1C 2F 1A ...K....F1./../.
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 16: EF 66 C0 F1 A6 B7 27 BD 51 5F 00 00 00 00 00 00 .f....'.Q_......
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 32: 00 00 64 97 7D 85 D1 6B DD 8C 82 82 A0 CB EB D7 ..d.}..k........
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 48: D8 D0 21 1C 27 96 63 7B 3D 13 00 72 34 32 6D 33 ..!.'.c{=..r42m3
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 64: 6E 63 76 2D 65 38 77 66 70 67 33 ncv-e8wfpg3
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> sending RADIUS Access-Request to server '127.0.0.1'
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> => 240 bytes @ 0x7fc294003d60
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 0: 01 7C 00 F0 DB AB 7C BF 31 2A CA A3 A1 33 93 7B .|....|.1*...3.{
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 16: DB A4 B3 C5 01 12 72 34 32 6D 33 6E 63 76 2D 65 ......r42m3ncv-e
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 32: 38 77 66 70 67 33 3D 06 00 00 00 05 06 06 00 00 8wfpg3=.........
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 48: 00 02 05 06 00 00 00 01 57 10 69 6B 65 76 32 2D ........W.ikev2-
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 64: 6D 73 63 68 61 70 76 32 04 06 C4 34 2E 23 1E 0E mschapv2...4.#..
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 80: 31 39 36 2E 35 32 2E 34 36 2E 33 35 1F 10 36 36 196.52.46.35..66
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 96: 2E 32 30 37 2E 32 30 38 2E 32 32 36 4F 4D 02 01 .207.208.226OM..
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 112: 00 4B 1A 02 01 00 46 31 B2 2F A8 1C 2F 1A EF 66 .K....F1./../..f
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 128: C0 F1 A6 B7 27 BD 51 5F 00 00 00 00 00 00 00 00 ....'.Q_........
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 144: 64 97 7D 85 D1 6B DD 8C 82 82 A0 CB EB D7 D8 D0 d.}..k..........
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 160: 21 1C 27 96 63 7B 3D 13 00 72 34 32 6D 33 6E 63 !.'.c{=..r42m3nc
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 176: 76 2D 65 38 77 66 70 67 33 20 13 63 61 2D 30 30 v-e8wfpg3 .ca-00
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 192: 31 5F 73 74 72 6F 6E 67 73 77 61 6E 18 12 15 C1 1_strongswan....
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 208: FB 92 B0 5A D7 64 1D 60 C5 46 69 00 DA E5 50 12 ...Z.d.`.Fi...P.
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 224: DC 26 57 40 79 91 11 FC 3F 6A C0 AD 0A 66 A0 4D .&W@y...?j...f.M
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> received RADIUS Access-Challenge from server '127.0.0.1'
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> => 121 bytes @ 0x7fc294006930
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 0: 0B 7C 00 79 35 C3 A8 F7 CC BE 84 13 5D 37 B0 66 .|.y5.......]7.f
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 16: A7 78 94 4A 1A 0C 00 00 01 37 1C 06 0A FF FF 02 .x.J.....7......
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 32: 4F 35 01 01 00 33 1A 03 01 00 2E 53 3D 33 39 39 O5...3.....S=399
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 48: 45 33 42 36 43 43 43 31 46 42 44 32 37 36 41 42 E3B6CCC1FBD276AB
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 64: 34 45 39 32 33 33 31 33 32 42 34 33 46 37 39 41 4E9233132B43F79A
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 80: 31 31 39 45 37 18 12 15 C1 FB 92 B0 5A D7 64 1D 119E7.......Z.d.
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 96: 60 C5 46 69 00 DA E5 50 12 1F C6 29 3B 96 8E C4 `.Fi...P...);...
Jul 30 00:33:24 100[CFG] <ikev2-mschapv2|1> 112: EE A4 39 67 FB 3B AE 12 8E ..9g.;...
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> EAP_MSCHAPV2 payload => 51 bytes @ 0x7fc2940045e0
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 0: 01 01 00 33 1A 03 01 00 2E 53 3D 33 39 39 45 33 ...3.....S=399E3
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 16: 42 36 43 43 43 31 46 42 44 32 37 36 41 42 34 45 B6CCC1FBD276AB4E
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 32: 39 32 33 33 31 33 32 42 34 33 46 37 39 41 31 31 9233132B43F79A11
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 48: 39 45 37 9E7
Jul 30 00:33:24 100[ENC] <ikev2-mschapv2|1> added payload of type EAP to message
На этом этапе клиент больше не общается. На стороне клиента отображается ошибка 691. Это означает, что клиент не смог проверить Access-Challenge, отправленный моим POC. Это происходит либо из-за неправильного формата пакета, либо из-за неверного значения пакета.
Я взял вызовы однорангового узла и аутентификатора из успешного журнала и пропустил его через свой код, чтобы увидеть, могу ли я получить тот же результат успешного пакета, и он действительно генерирует такое же значение.
Глядя на формат пакета байт за байтом, я не вижу разницы ни в формате, ни в значении, но Windows отклоняет этот ответ и прекращает диалог EAP.
Если у кого-то есть какие-либо глубокие знания о реализациях Windows + EAP + MSCHAPv2, я был бы очень признателен за помощь, так как на этом этапе я сравнил данные побайтно и не вижу никаких различий.
Вот еще ссылки на реализованные RFC:
Дополнительные замечания:
Изначально я подозревал, что проблема может быть в пакетах RADIUS, а не в сообщениях EAP, поскольку полезные данные EAP выглядят одинаково как в диалоге FreeRadius (рабочий), так и в моем POC. Причина, по которой я отказался от этой теории, заключается в том, что журналы клиента и сервера показывают, что ошибка возникает на этапе аутентификации EAP.
Может ли быть что-то в протоколе / пакетах RADIUS, что может повлиять на достоверность или принятие сообщений EAP клиентом?
Кроме того, ошибка возникает во время этапа запроса доступа «Успешный пакет» в диалоге EAP, но могут ли предыдущие шаги автоматически завершиться неудачей и вызвать эту ошибку на более позднем этапе? Я не нашел ни в одном из вышеупомянутых RFC ничего, что предлагало бы это, но я не исключаю чего-либо на данный момент, поскольку я занимался этим почти 2 недели.
Наконец, я попытался получить больше отладочной информации из Windows, чтобы увидеть точные данные, которые Windows использует для определения действительности сообщения, но все, что я смог получить из «Диагностического отчета удаленного доступа», это следующее:
[3004] 07-30 11:38:21:863: EapBegin(fServer=0)
[3004] 07-30 11:38:21:863: EapBegin: EapTypeToBeUsed=26, EapAuthType=2
[3004] 07-30 11:38:21:863: EapBegin: ThisIsARenegotiation=0, SaveCredsToCredMan=0, UseWinlogonCredentials=0.
[3004] 07-30 11:38:21:864: EapBegin: Connection handle: 1835008
[3004] 07-30 11:38:21:864: EapBegin: EAP user blob is not passed so using the credentials.
[3004] 07-30 11:38:21:864: fRetry = 0.
[3004] 07-30 11:38:21:865: Eap user data size: 1021.
[3004] 07-30 11:38:21:865: EapBegin done
[3004] 07-30 11:38:21:865: EapMakeMessage,RBuf=4b78910
[3004] 07-30 11:38:21:865: MakeAuthenticateeMessage...
[3004] 07-30 11:38:21:865: EAPSTATE_Initial
[3004] 07-30 11:38:21:865: EapMethodBegin(Flags=0x10, Remaining retry count=3)
[3004] 07-30 11:38:21:866: EAPSTATE_Working
[3004] 07-30 11:38:21:866: HandleEapResponse -- Entering.
[3004] 07-30 11:38:21:866: EapHost returned Action = EapHostPeerResponseSend. Processing send packet...
[3004] 07-30 11:38:21:866: RasProcessEapHostSendPacket -- Entering.
[3004] 07-30 11:38:21:866: Got identity: r42m3ncv-e8wfpg3.
[3004] 07-30 11:38:21:866: RasProcessEapHostSendPacket: Sending packet.
[3004] 07-30 11:38:21:866: RasProcessEapHostSendPacket -- Leaving: 0x0.
[3004] 07-30 11:38:21:866: HandleEapResponse -- Leaving: 0x0.
[3004] 07-30 11:38:21:869: EapMakeMessage,RBuf=4b78910
[3004] 07-30 11:38:21:869: MakeAuthenticateeMessage...
[3004] 07-30 11:38:21:869: EAPSTATE_Working
[3004] 07-30 11:38:21:870: HandleEapResponse -- Entering.
[3004] 07-30 11:38:21:870: EapHost returned Action = EapHostPeerResponseSend. Processing send packet...
[3004] 07-30 11:38:21:870: RasProcessEapHostSendPacket -- Entering.
[3004] 07-30 11:38:21:870: RasProcessEapHostSendPacket: Sending packet.
[3004] 07-30 11:38:21:870: RasProcessEapHostSendPacket -- Leaving: 0x0.
[3004] 07-30 11:38:21:870: HandleEapResponse -- Leaving: 0x0.
[3004] 07-30 11:38:21:873: EapMakeMessage,RBuf=4b78910
[3004] 07-30 11:38:21:873: MakeAuthenticateeMessage...
[3004] 07-30 11:38:21:873: EAPSTATE_Working
[3004] 07-30 11:38:21:873: HandleEapResponse -- Entering.
[3004] 07-30 11:38:21:873: EapHost returned Action = EapHostPeerResponseResult. Retreiving result...
[3004] 07-30 11:38:21:873: RasGetEapHostAuthResult -- Entering.
[3004] 07-30 11:38:21:873: RasSetQuarantineStatus -- Entering.
[3004] 07-30 11:38:21:873: ISOLATION_STATE_UNKNOWN
[3004] 07-30 11:38:21:873: RasSetQuarantineStatus -- Leaving: 0x0.
[3004] 07-30 11:38:21:873: EAP Authentication failed with error: Internal = 0x2b3, External = 0x80420112.
[3004] 07-30 11:38:21:873: RasGetEapHostAuthResult -- Leaving: 0x0.
[3004] 07-30 11:38:21:873: HandleEapResponse -- Leaving: 0x0.
[960] 07-30 11:38:21:881: EapEnd
[960] 07-30 11:38:21:881: EapMethodEnd called for EAP Index 26
Если кто-нибудь знает, как получить какие-либо полезные отладочные данные для EAP-MSCHAPV2 в Windows, это тоже может быть очень полезно. В идеале я хотел бы видеть отдельные входные данные для различных вычислений, выполняемых реализацией Windows, поскольку я не вижу логической причины, почему она не работает, поскольку соблюдается спецификация.
Что ж, с проблемой разобрался. Поле идентификатора EAP для пакета успеха необходимо было увеличить.
Jul 30 00:33:24 100[IKE] <ikev2-mschapv2|1> 0: 01 01 00 33 1A 03 01 00 2E 53 3D 33 39 39 45 33
Второй октет должен был быть увеличен до 02
. Я не нашел упоминаний об этом в RFC, и я до сих пор не понимаю, почему это работает для всех платформ, кроме Windows.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | OpCode | MS-CHAPv2-ID | MS-Length...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MS-Length | Message...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
MS-CHAPv2-ID
The MS-CHAPv2-ID field is one octet and aids in matching MSCHAP-v2
responses with requests. Typically, the MS-CHAPv2-ID field is the
same as the Identifier field.
Это работает, если вы НЕ устанавливаете то же значение, что и идентификатор EAP.
Вскоре я опубликую здесь свои выводы + пример: https://github.com/Windscribe/radius
Насколько мне известно, это единственная работающая реализация RADIUS / EAP-MSCHAPv2, кроме FreeRadius.
По моему опыту, сочетание StrongSwan и Windows проблематично. И у вас довольно много переменных. Я не могу дать вам точный ответ, так как не знаю всей схемы. Microsoft любит ретро-шифры и алгоритмы хеширования.
Убедитесь, что dh-group соответствует ожиданиям, и кажется, что есть разница в формате пароля, это может быть связано с Win auth и NTLM-хешем? И, как я вижу, размер пакетов для POC и Win различается, что может быть хешем, dh-группой или используемым сертификатом (это описано ниже).
В любых связанных проектах ниже вы сможете повторно использовать библиотеки или проверить свою реализацию, иначе это может помочь: https://github.com/enaess/ppp-eap-mschapv2
https://forums.freebsd.org/threads/howto-set-up-a-l2tp-ipsec-vpn-dial-in-server-part-i-to-iii.26755/
Включает аутентификацию по базе данных паролей системы. Эти параметры можно использовать только с PAP и MS-CHAP, но не с CHAP-MD5. Если вы собираетесь использовать это с MS-CHAP, то пароли в master.passwd должны быть NT-хэшами. Вы можете включить это, поместив: passwd_format = nth: в ваш /etc/login.conf, но вам понадобится как минимум FreeBSD 5.2.
Кажется, есть и необычное поведение: https://github.com/FreeRADIUS/freeradius-server/issues/679
Невозможно подключиться к коммерческой VPN Windows Server 2008: https://wiki.strongswan.org/issues/1252
https://wiki.strongswan.org/issues/2352
Это связано с тем, что mschapv2 требует реализации алгоритма MD4, который реализуется плагином md4, и вы не загружаете его.
некоторые части также упоминаются в комментариях для каждого значения https://wiki.strongswan.org/projects/strongswan/wiki/Win7EapMultipleConfig
rightsendcert=never Since the clients authenticate themselves using EAP-MSCHAPv2 the gateway is not going to send any certificate requests. However, if strongSwan serves other clients using certificate authentication, never should not be used, as a responder usually can not enforce this option for specific connections. eap_identity=%any The strongSwan gateway is using the EAP Identity protocol to request an EAP identity different from the peer's IKEv2 identity. auto=add The connection win7 is parsed and loaded by the the IKEv2 charon daemon but the VPN gateway will act as a responder and passively wait for the Window 7 client to start the IKE negotiation.
Это частично описано в Документы MS
"Типичная причина этой ошибки заключается в том, что сервер политики сети указал условие аутентификации, которое клиент не может выполнить. Например, сервер политики сети может указать использование сертификата для защиты соединения PEAP, но клиент пытается использовать EAP-MSCHAPv2. . "
Убедитесь, что вы соответствуете всем требованиям, часто это просто неправильная группа или шифр: https://support.microsoft.com/en-us/help/2744850/implementing-peap-ms-chap-v2-authentication-for-microsoft-pptp-vpns
Не ответ, скорее направление. Надеюсь, поможет.