Azure нисходящее устройство к пограничному шлюзу с python - PullRequest
2 голосов
/ 25 марта 2020

Я пытаюсь установить связь между нисходящим устройством и сценарием Azure. Raspberry Pi - это IoT-устройство, и я использую Jetson nano в качестве пограничного устройства, я пробовал как метод симметрии c, так и самоподписанный, оба кажутся неудачными. Пожалуйста, помогите мне с этим. Я попытался из этого azure учебника https://docs.microsoft.com/en-us/azure/iot-edge/how-to-authenticate-downstream-deviceand Я попробовал send_message.py и send_message_x509.py отсюда: https://github.com/Azure/azure-iot-sdk-python/tree/master/azure-iot-device/samples/async-hub-scenariosAnd Я использую azure -iot-test-only. root .ca.cert.pem (ROOTCA), iot-edge-device-downedge-full-chain.cert.pem (сертификат устройства) и iot-edge-device-downedge.key.pem (ключ устройства) как учетные данные внутри скрипта .py ... и имя хоста в качестве имени хоста пограничного шлюза ... Но это ошибка. Эта команда работает нормально и возвращает статус OK:

"openssl s_client -connect mygateway.contoso.com:8883 -CAfile /certs/azure-iot-test-only.root.ca.cert. pem -showcerts "

Но все равно .py возвращается с ошибкой аутентификации TLS следующим образом

TLS handshake failed., System.AggregateException: One or more errors occurred. (Authentication failed, see inner exception.) ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception. ---> Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL. ---> Interop+Crypto+OpenSslCryptographicException: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca
   --- End of inner exception stack trace ---
   at Interop.OpenSsl.DoSslHandshake(SafeSslHandle context, Byte[] recvBuf, Int32 recvOffset, Int32 recvCount, Byte[]& sendBuf, Int32& sendCount)
   at System.Net.Security.SslStreamPal.HandshakeInternal(SafeFreeCredentials credential, SafeDeleteContext& context, ArraySegment`1 inputBuffer, Byte[]& outputBuffer, SslAuthenticationOptions sslAuthenticationOptions)
   --- End of inner exception stack trace ---
   at System.Net.Security.SslStream.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)
   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.PartialFrameCallback(AsyncProtocolRequest asyncRequest)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Security.SslStream.EndProcessAuthentication(IAsyncResult result)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
   --- End of inner exception stack trace ---
---> (Inner Exception #0) System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception. ---> Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL. ---> Interop+Crypto+OpenSslCryptographicException: error:14094418:SSL routines:ssl3_read_bytes:tlsv1 alert unknown ca
   --- End of inner exception stack trace ---

Пожалуйста, дайте мне знать, как устранить эту ошибку, или любой другой код для достижения того же.

1 Ответ

0 голосов
/ 01 апреля 2020

изменили ли вы send_message.py, чтобы добавить доверенные пограничные устройства root ca сертификат (azure -iot-test-only. root .ca.cert.pem) в качестве доверенного сертификата? чтобы использовать этот python SDK в конечном устройстве, вы должны использовать перегрузку функции create_from_connection_string, которая позволяет вам передавать сертификат периферийных устройств root ca (чтобы SDK «доверял» ему).

например, я изменил первые несколько строк send_message.py для этого, и он работает (после копирования по root ca cert на мое конечное устройство)

async def main():
    # Fetch the connection string from an enviornment variable
    conn_str ="<your connection string, including GatewayHostName>"

    #change this path to YOUR cert -- just left mine in as an example...
    certfile = open("/home/stevebus/edge/certs/azure-iot-test-only.root.ca.cert.pem")
    root_ca_cert = certfile.read()

    # Create instance of the device client using the connection string

device_client = IoTHubDeviceClient. create_from_connection_string (connection_string = conn_str, server_verification_cert = root_ca_cert)

это работает для меня ...

...