問題タブ [mqttnet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - MQTTnet クライアント メッセージの TLS/SSL 暗号化用にインポートされた PFX 証明書は、サービスでは機能しますが、Xamarin UWP アプリでは失敗します
私たちがやろうとしていること
MQTT メッセージを暗号化しています。MQTTnet を使用しています。これは TLS 暗号化をサポートしているため、既存のソリューションでこの機能を有効にするかどうかは問題です。UWP Xamarin アプリケーションと .NET コンソール アプリケーションはどちらも、MQTT のすべてに同じ .NET 標準 DLL を使用します。ブローカーには Mosquitto を使用していましたが、MQTTnet サーバーを使用する単純なアプリケーションに切り替える予定です。
これが問題です
ブローカー側とコンソール アプリケーションの 1 つに TLS 暗号化を正常に追加しましたが、UWP Xamarin アプリケーションで問題が発生しています。現在の状態では、「提供されたクライアント証明書には、必要な秘密鍵情報がありません」というメッセージとともに例外がスローされています。
私たちが求めているもの
- これが可能であることの確認
- これが機能しない理由の基本的な理解 (つまり、仮定の確認またはその他)
- この問題の解決策
- 確認事項の考え方。
したがって、誰かが「答え」を知っていれば、素晴らしいことです。そうでなければ、アイデア、アドバイス、専門知識、経験の共有など。
私たちの仮定
- これが可能であると仮定しています
- これは MQTTnet のバグや制限ではないようです
- Xamarin UWP アプリケーションを使用しているときにこのエラーが発生する理由は、ディスク アクセスまたはレジストリ アクセスに対する何らかの制限が原因であると想定しています。
- PFX ファイルはコンソール アプリケーションで動作するため、Xamarin UWP アプリケーションでも動作するはずであると想定してきました (ただし、Xamarin UWP アプリケーションはユーザー キーでしかアクセスできないため、どのストアにあるのかを試してみました。お店)
試したこと
- MSDN で仕様書を読みました
- 私たちはブログ記事を読みました
- さまざまなスタック オーバーフローの投稿からのアドバイスを読み、それに従いました。
- さまざまな MQTTnet サポート投稿からのアドバイスを読み、それに従いました
- 2 つの異なるブローカー (Mosquitto と、MQTTnet サーバーを使用するサンプル アプリケーション) を試しました。
- OpenSSL を使用し、OS (Windows 10) を介して手動で証明書を作成しようとしました。より制御可能/決定論的/再現可能な結果を得るには、後者の PS スクリプトの使用に切り替えます
- ユーザーストアとマシンストアの証明書を作成しようとしました
- 証明書をストアにインポートしようとしました (コードを参照)
- X509KeyStorage フラグのさまざまな組み合わせを試しました (つまり、エクスポート可能、永続化、ユーザー キー セットなど)。
- Visual Studio を管理者として実行してみました
- SysInternals ProcMon を使用して、これがどこで失敗しているか (つまり、HD アクセスまたはレジストリ アクセス) を特定しようとしました。
- Xamarin アプリケーションのさまざまな機能を有効にしてみました
便利なリンク
- https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/working-with-certificates
- https://docs.microsoft.com/en-us/troubleshoot/iis/cannot-import-ssl-pfx-local-certificate
- https://github.com/chkr1011/MQTTnet/wiki/Server-and-client-method-documentation
- https://github.com/chkr1011/MQTTnet/issues/115
- https://github.com/chkr1011/MQTTnet/issues/124
- https://paulstovell.com/x509certificate2/
- MQTTnet クライアントがサーバー証明書に接続できない
- Windows で OpenSSL を使用せずに、pfx ファイルまたは証明書ストアから秘密鍵を抽出する
私たちの行動規範の一部
スタックトレース
c# - クライアント証明書が xamarin.android で機能しない
xamarin.android プロジェクトでhttps://github.com/chkr1011/MQTTnetライブラリを使用して mtls 接続を確立しようとしています。このプロセス中に、conResult.Wait(TimeSpan.FromSeconds(60)); の呼び出し時に Init メソッドでこのような例外が発生しました。
{MQTTnet.Exceptions.MqttCommunicationException: 認証に失敗しました。内部例外を参照してください。---> System.Security.Authentication.AuthenticationException: 認証に失敗しました。内部例外を参照してください。---> System.Security.Cryptography.CryptographicException: Caught…} {System.Security.Cryptography.CryptographicException: で未処理の例外をキャッチしましたMonoBtlsSslCtx.ProcessHandshake
。---> System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。Mono.Btls.MonoBtlsSsl.SetPrivateKey で (Mono.Btls.…}
これは私のコードです:
いくつかのオプションがあります:
- GetCertificate メソッドでの証明書の作成に問題がある可能性があります。
- MqttNet ライブラリ自体に問題があります。次のようなトピックが見つかったため、ライブラリが xamarin.android の証明書で機能しないと思われます: https://github.com/xamarin/xamarin-android/issues/4481、https://github.com/chkr1011/MQTTnet /issues/883 .
この方法で証明書を作成しようとしましたが、xamarin は rsa.ImportRSAPrivateKey をサポートしていません。System.PlatformNotSupportedException: このプラットフォームでは操作がサポートされていません。