ONVIF Profile V的认证可谓相当丰富,作者在测试的时候发现整理这些模式是相当烧脑的事情。
文档中提到了Oauth2 和Uplink的认证,我们在此以Uplink为主线来分析。Uplink 支持了如下两种模式:
1. mTLS需要提前在设备和云端设置对应的证书,当然云端的证书可以是所有设备统一一个,但是设备的证书需要一机一密。
<SetUplink xmlns="http://www.onvif.org/ver10/uplink/wsdl">
<Configuration>
<RemoteAddress>wss://10.168.1.195:21574</RemoteAddress>
<CertificateID>Cert-faeb526c-df37-11f1-b259-e454e89daf79</CertificateID>
<UserLevel>Administrator</UserLevel>
<CertPathValidationPolicyID>Policy-f79ca0fc-df37-11f1-91ca-e454e89daf79</CertPathValidationPolicyID>
</Configuration>
</SetUplink>
2. oAuth2 又分如下三种模式,如下的三种模式a 不需要提前在服务端设置对应的证书,但是需要设置clientID clientSecrt, 这里有多种实现方法, 一批设备一个client_secret和一个设备一个client_secret(一机一密), b模式需要提前在服务器上设置对应设备的公钥证书,当然设备需要提前设置好自己的证书,这里也必须是一机一密。c 方法是设备和服务器都需要提前设置好自己的证书。
a.client_secret_basic
b.private_key_jwt
c.mtls(tls_client_auth)
<SetUplink xmlns="http://www.onvif.org/ver10/uplink/wsdl">
<Configuration>
<RemoteAddress>wss://10.168.1.195:21650</RemoteAddress>
<UserLevel>Administrator</UserLevel>
<CertPathValidationPolicyID>Policy-1efac5e8-df38-11f1-9b55-e454e89daf79</CertPathValidationPolicyID>
<AuthorizationServer>AuthSrv-1ed32f42-df38-11f1-8ef9-e454e89daf79</AuthorizationServer>
</Configuration>
</SetUplink>
<CreateAuthorizationServerConfiguration xmlns="http://www.onvif.org/ver10/advancedsecurity/wsdl">
<Configuration Type="OAuthClientCredentials" ClientAuth="client_secret_basic">
<ServerUri>https://10.168.1.195:20885/.well-known/openid-configuration</ServerUri>
<ClientID>client1</ClientID>
<ClientSecret>client-secret1</ClientSecret>
<Scope>scope1</Scope>
<CertPathValidationPolicyID>Policy-d61ad61c-df35-11f1-8b0b-e454e89daf79</CertPathValidationPolicyID>
</Configuration>
</CreateAuthorizationServerConfiguration>
总结一下,除了client_secret_basic模式绕开在服务器上为每台设备设置证书的情况,其他都必须一机一密,当然client_secret_basic是不推荐的。所以在设计Profile V的架构的时候尽量往一机一密上靠。
当需要接上万台甚至几十几百万台的服务的时候,性能也很重要,可以通过oauth2 的scope 做分区来提升服务器的性能。如果不使用oAuth2的话 分区还是比较难的。所以我们推荐的方法是private_key_jwt和mtls(tls_client_auth) ,服务器根据scope 分区来提高查询速度。
