我正在尝试使用提供的示例“发送消息”;SendEventX509.java“;但我面临着这个问题。Stacktrace如下所述

我正在尝试使用提供的示例“发送消息”;SendEventX509.java“;但我面临着这个问题。Stacktrace如下所述,java,azure-iot-hub,azure-iot-sdk,Java,Azure Iot Hub,Azure Iot Sdk,我正在尝试使用提供的示例“SendEventX509.java”发送消息,但我遇到了一个问题。Stacktrace如下所述 操作系统-视窗10 使用的Java运行时:JDK 11.0.3 使用的SDK版本:物联网中心Java设备SDK 1.17.5 “”中提供的示例 证书已从“ProvisioningX509CertGen.java”生成,设备已通过X509认证在IoHub中成功注册和设置 问题的控制台日志: Exception in thread "main" java.io.IOExcept

我正在尝试使用提供的示例“SendEventX509.java”发送消息,但我遇到了一个问题。Stacktrace如下所述 操作系统-视窗10

使用的Java运行时:JDK 11.0.3

使用的SDK版本:物联网中心Java设备SDK 1.17.5

“”中提供的示例

证书已从“ProvisioningX509CertGen.java”生成,设备已通过X509认证在IoHub中成功注册和设置

问题的控制台日志:

Exception in thread "main" java.io.IOException: Could not open the connection
at com.microsoft.azure.sdk.iot.device.DeviceIO.open(DeviceIO.java:164)
at com.microsoft.azure.sdk.iot.device.InternalClient.open(InternalClient.java:130)
at com.microsoft.azure.sdk.iot.device.DeviceClient.open(DeviceClient.java:317)
at samples.com.microsoft.azure.sdk.iot.SendEventX509.main(SendEventX509.java:136)
Caused by: com.microsoft.azure.sdk.iot.device.exceptions.TransportException: java.io.IOException: java.security.KeyStoreException: Key protection algorithm not found: java.security.UnrecoverableKeyException: Encrypt Private Key failed: password has been cleared
at com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection.open(MqttIotHubConnection.java:204)
at com.microsoft.azure.sdk.iot.device.transport.IotHubTransport.openConnection(IotHubTransport.java:700)
at com.microsoft.azure.sdk.iot.device.transport.IotHubTransport.open(IotHubTransport.java:280)
at com.microsoft.azure.sdk.iot.device.DeviceIO.open(DeviceIO.java:160)
... 3 more
Caused by: java.io.IOException: java.security.KeyStoreException: Key protection algorithm not found: java.security.UnrecoverableKeyException: Encrypt Private Key failed: password has been cleared
at com.microsoft.azure.sdk.iot.device.auth.IotHubX509SoftwareAuthenticationProvider.getSSLContext(IotHubX509SoftwareAuthenticationProvider.java:66)
at com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection.open(MqttIotHubConnection.java:125)
... 6 more
Caused by: java.security.KeyStoreException: Key protection algorithm not found: java.security.UnrecoverableKeyException: Encrypt Private Key failed: password has been cleared
at java.base/sun.security.pkcs12.PKCS12KeyStore.setKeyEntry(PKCS12KeyStore.java:704)
at java.base/sun.security.pkcs12.PKCS12KeyStore.engineSetKeyEntry(PKCS12KeyStore.java:601)
at java.base/sun.security.util.KeyStoreDelegator.engineSetKeyEntry(KeyStoreDelegator.java:111)
at java.base/java.security.KeyStore.setKeyEntry(KeyStore.java:1174)
at com.microsoft.azure.sdk.iot.deps.auth.IotHubSSLContext.generateSSLContextWithKeys(IotHubSSLContext.java:208)
at com.microsoft.azure.sdk.iot.deps.auth.IotHubSSLContext.(IotHubSSLContext.java:168)
at com.microsoft.azure.sdk.iot.device.auth.IotHubX509SoftwareAuthenticationProvider.generateSSLContext(IotHubX509SoftwareAuthenticationProvider.java:96)
at com.microsoft.azure.sdk.iot.device.auth.IotHubX509SoftwareAuthenticationProvider.getSSLContext(IotHubX509SoftwareAuthenticationProvider.java:56)
... 7 more
Caused by: java.security.UnrecoverableKeyException: Encrypt Private Key failed: password has been cleared
at java.base/sun.security.pkcs12.PKCS12KeyStore.encryptPrivateKey(PKCS12KeyStore.java:951)
at java.base/sun.security.pkcs12.PKCS12KeyStore.setKeyEntry(PKCS12KeyStore.java:641)
... 14 more
Caused by: java.lang.IllegalStateException: password has been cleared
at java.base/javax.crypto.spec.PBEKeySpec.getPassword(PBEKeySpec.java:196)
at org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey.getPassword(Unknown Source)
at java.base/com.sun.crypto.provider.PKCS12PBECipherCore.implInit(PKCS12PBECipherCore.java:268)
at java.base/com.sun.crypto.provider.PKCS12PBECipherCore.implInit(PKCS12PBECipherCore.java:379)
at java.base/com.sun.crypto.provider.PKCS12PBECipherCore.implInit(PKCS12PBECipherCore.java:364)
at java.base/com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndDESede.engineInit(PKCS12PBECipherCore.java:473)
at java.base/javax.crypto.Cipher.implInit(Cipher.java:847)
at java.base/javax.crypto.Cipher.chooseProvider(Cipher.java:901)
at java.base/javax.crypto.Cipher.init(Cipher.java:1576)
at java.base/javax.crypto.Cipher.init(Cipher.java:1507)
at java.base/sun.security.pkcs12.PKCS12KeyStore.encryptPrivateKey(PKCS12KeyStore.java:934)
... 15 more

请帮助解决此问题

自Java 9以来,默认密钥库类型已从jks更改为pkcs12。上面的azure SDK代码似乎可以与JKS密钥库一起正常工作。 您有两个选择:

  • 在java 11 jdk/jre安装中,将java.security文件中的keystore.type更改为jks。这将对所有应用程序产生更广泛的影响。所以要小心

  • 如果已从github克隆azure示例的完整repo,请更改com.microsoft.azure.sdk.iot.deps.auth.IotHubSSLContext.generateSSLContextWithKeys(),并获取JKS密钥库的实例,而不是默认实例。因此,改变:

    KeyStore KeyStore=KeyStore.getInstance(KeyStore.getDefaultType())


  • 这很有希望为您提供帮助。

    正在执行的代码是:
    私有静态字符串publicKeyCertificateString=----开始证书------\r\n“+”XXXX\r\n“+”----结束证书------;私有静态字符串privateKeyString=“----开始私钥------\r\n“+”XXXX\r\n“+”-----结束私钥------\r\n“字符串连接字符串=“主机名=”;DeviceId=;x509=true“IoTubClientProtocol=IoTubClientProtocol.MQTT;DeviceClient=new DeviceClient(connectionString,protocol,publicKeyCertificateString,false,privateKeyString,false);client.open();
    KeyStore keystore = KeyStore.getInstance("jks");