我正在尝试设置用户通过 VPN 连接到我们的 Azure 托管网络。所有客户端计算机都运行 Windows 10。通过将所需设置直接添加到系统电话簿文件 ( C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk
),在客户端计算机上安装连接。
我遇到了一个有趣的情况,有些用户可以正常连接,但其他用户只有在尝试使用管理员权限启动连接时才能连接。
这些用户得到的错误是:
错误 798:找不到可用于此可扩展身份验证协议的证书
尝试通过 Windows 工具栏中的网络菜单连接或尝试通过 rasphone 或 rasdial 连接时会出现此错误。但是有两件有趣的事情需要注意:
- 首次安装 VPN 连接时,这些相同的用户没有遇到此问题。起初它工作正常。几天后开始出现此问题。
- 以管理员身份运行 rasphone 或 rasdial 时不会发生此错误。以管理员身份运行时,连接已成功建立。
如您所知,身份验证应该通过证书完成。确切地说是自签名证书。客户端证书安装在Current User\Personal
证书存储中。由于根证书是自签名的,因此需要将其添加为客户端设备的 CA,以便将客户端证书识别为有效。因此根证书安装在Current User\Trusted Root Certification Authorities
和Local Machine\Trusted Root Certification Authorities
证书存储中。
这种完全相同的设置,在完全相同的商店中具有完全相同的证书,以及完全相同的电话簿条目,在某些设备上一直有效,但在其他设备上需要管理员权限。证书必须有效,否则连接将永远无法工作。那么在普通用户上下文中是什么导致连接失败呢?
下面是有问题的完整电话簿条目(连接名称和网关地址已删除)。
[Connection Name]
Encoding=1
PBVersion=6
Type=2
AutoLogon=0
UseRasCredentials=1
DialParamsUID=394750015
Guid=C461B777D7AB504AB0AECABC914B7A56
VpnStrategy=7
ExcludedProtocols=0
LcpExtensions=1
DataEncryption=256
SwCompression=1
NegotiateMultilinkAlways=1
SkipDoubleDialDialog=0
DialMode=0
RedialAttempts=3
RedialSeconds=5
IdleDisconnectSeconds=0
RedialOnLinkFailure=1
CallbackMode=0
CustomDialDll=
CustomDialFunc=
CustomRasDialDll=
ForceSecureCompartment=0
DisableIKENameEkuCheck=0
AuthenticateServer=0
ShareMsFilePrint=1
BindMsNetClient=1
SharedPhoneNumbers=0
GlobalDeviceSettings=0
PrerequisiteEntry=
PrerequisitePbk=
ShowMonitorIconInTaskBar=1
CustomAuthKey=13
CustomAuthData=314442430D00000048000000020000004800000017000000000000000000000000000000000000000000000000000000000000000000FE0006000100FD001800
CustomAuthData=97390292EA748C1C312875C0B087FFECAD8EACD100000000
AuthRestrictions=128
IpPrioritizeRemote=0
IpInterfaceMetric=0
IpHeaderCompression=0
IpAddress=0.0.0.0
IpDnsAddress=10.20.0.5
IpDns2Address=10.20.0.6
IpWinsAddress=0.0.0.0
IpWins2Address=0.0.0.0
IpAssign=1
IpNameAssign=2
IpDnsFlags=0
IpNBTFlags=1
TcpWindowSize=0
UseFlags=2
IpSecFlags=0
IpDnsSuffix=
DisableClassBasedDefaultRoute=1
IDI=
IDR=
ImsConfig=0
IdiType=0
IdrType=0
ProvisionType=0
PreSharedKey=
CacheCredentials=0
NumCustomPolicy=0
NumEku=0
UseMachineRootCert=0
Disable_IKEv2_Fragmentation=0
PlumbIKEv2TSAsRoutes=0
NumServers=0
RouteVersion=1
NumRoutes=1
Routes=0100000002000000100000000A0000000000000000000000000000000000000000000000
NumNrptRules=0
AutoTiggerCapable=1
NumAppIds=0
NumClassicAppIds=0
SecurityDescriptor=
ApnInfoProviderId=
ApnInfoUsername=
ApnInfoPassword=
ApnInfoAccessPoint=
ApnInfoAuthentication=1
ApnInfoCompression=0
DeviceComplianceEnabled=0
DeviceComplianceSsoEnabled=0
DeviceComplianceSsoEku=
DeviceComplianceSsoIssuer=
WebAuthEnabled=0
WebAuthClientId=
FlagsSet=0
Options=0
DisableDefaultDnsSuffixes=0
NumTrustedNetworks=0
NumDnsSearchSuffixes=0
PowershellCreatedProfile=0
ProxyFlags=0
ProxySettingsModified=0
ProvisioningAuthority=
AuthTypeOTP=0
GREKeyDefined=0
NumPerAppTrafficFilters=0
AlwaysOnCapable=0
DeviceTunnel=0
PrivateNetwork=0
NETCOMPONENTS=
ms_msclient=1
ms_server=1
MEDIA=rastapi
Port=VPN3-0
Device=WAN Miniport (IKEv2)
DEVICE=vpn
PhoneNumber=MyAzureGatewayAddress.vpn.azure.com
AreaCode=
CountryCode=0
CountryID=0
UseDialingRules=0
Comment=
FriendlyName=
LastSelectedPhone=0
PromoteAlternates=0
TryNextAlternateOnFail=1
这是在 GUI 中打开连接文件时的样子:
事实证明,问题根本不在于 VPN 配置,甚至不在于证书本身,而在于证书的安装方式。
我的问题有很多部分,所以我试图从我的问题中省略“不相关”的信息。其中一条信息是我正在使用我开发的自定义软件以编程方式完成整个 VPN 安装。
似乎这个问题是由于我的程序在以 Administrator 身份运行时安装了客户端证书这一事实引起的。当我尝试从在普通用户上下文(非管理员)中运行的程序安装客户端证书时,不再出现此问题。
(有关程序化证书安装的更多详细信息,我在 StackOverflow 上发表了这篇文章:X509Certificate2 仅在以管理员身份添加到当前用户存储时暂时有效)
至于问题的“它在某些设备上工作”部分,我对两个因素感到困惑:
因此,我运行自动安装程序的计算机将“工作”,直到重新启动。我碰巧手动安装证书的计算机将无限期地工作,直到我再次尝试运行安装程序,此时它们将回到前一个类别。
当时我对此一无所知,所以看起来就像“有些工作,有些不工作”。