我正在Linux客户端设备上使用Azure IOT Hub / Edge和Python。我已经从SDK修改了iothub_client_sample_x509.py示例程序,以使用任意X509证书(实际上是使用OpenSSL创建)连接到IoT Hub。设备证书是CA结构的一部分,顶部有两层证书链(即两层CA)。
只要我在IoT Hub上将设备注册为“X.509 Self-Signed”并且设备证书的SHA1指纹作为主要/次要指纹,连接建立就可以正常工作。但是,当我尝试以'X.509 CA-Signed'模式连接时,我失败了'未接受连接:0x5:未授权'(在后一种情况下,我在IoT Hub上将设备注册为'X.509 CA签名')。链(CA)证书文件在IoT Hub的“证书”下上载,状态为“已验证”。
在这两种情况下,我都使用如下连接字符串:“HostName =<主机名,完整DNS名称&gt ;; DeviceId =<设备ID&gt ;; x509 = true”。
这是“X.509 CA-Signed”案例的正确连接字符串吗?我连接时是否需要传输证书链(除了设备证书)?我该怎么办?设备证书中的公用名称为“CN =< device ID> .westeurope.cloudapp.azure.com”,而不是“CN =< device ID> .azure-devices.net”。这可能是个问题吗?
请注意,我无法在客户端设备上轻松设置C#/ .NET进行测试,所以我现在想坚持使用Python(或者可能是C)。有没有机会激活一些更精细的日志记录,以了解为什么连接建立失败'0x5:未授权'?还有什么我可能错过的?
感谢您的帮助,迈克尔
更新2018-05-16: 嗨迈克尔,谢谢你的评论。实际上,我已经能够通过使用MS PowerShell脚本(https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-security-x509-create-certificates)设置证书,在“X.509 CA-Signed”模式下建立连接。但是,将CN更改为设备名称并不能解决原始PKI设置的问题。我猜我将不得不分析PKI设置中的每一点差异。
PKI设置的两个明显区别是:
我的设置使用双层PKI(一个根CA和一个中间/签名CA),而不是仅使用一个CA.两者的证书都存储在IoTHub(已验证)中。
根CA和签名CA具有384位密钥(ECC - secp384r1曲线)而不是256位(prime256v1曲线)。在IOTHub中,两个CA证书都可以存储和验证,而不会出现任何问题。
是否已知这些差异会导致问题?
谢谢,迈克尔
答案 0 :(得分:1)
将CN设置为设备名称只是解决方案的一部分。另外,我必须更正根CA证书中的细微错误。 它包含:
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE, pathlen:0
'pathlen:0'表示此CA不允许任何后续的中间CA低于其自身。并且 - 记住我的PKI设置 - 有一个中间CA最终会颁发设备证书。在根CA证书中将pathlen设置为1可解决问题。显然,IoTHub对证书链进行了非常彻底的验证。
具有讽刺意味的是,只需删除IoTHub的“证书”部分中的根CA证书也可以解决问题。虽然证书链不再完整(中间CA的签名者丢失),但IoTHub在连接建立期间批准证书链。也许这是因为中间CA证书在IoTHub中处于“已验证”状态。
答案 1 :(得分:0)
即使您没有提供有关如何为设备生成x509证书的详细步骤,我很久以前也遇到过类似的issue。请尝试将公用名(CN)更改为设备名称在Azure门户(IoTHub-> IoT设备)中创建的。如果错误仍然无法解决,请随时告诉我。