|
@@ -21,7 +21,6 @@ import io.netty.handler.ssl.SslContext; |
|
@@ -21,7 +21,6 @@ import io.netty.handler.ssl.SslContext; |
21
|
import io.netty.handler.ssl.SslContextBuilder;
|
21
|
import io.netty.handler.ssl.SslContextBuilder;
|
22
|
import lombok.Data;
|
22
|
import lombok.Data;
|
23
|
import lombok.extern.slf4j.Slf4j;
|
23
|
import lombok.extern.slf4j.Slf4j;
|
24
|
-import org.thingsboard.mqtt.MqttClientConfig;
|
|
|
25
|
import org.apache.commons.codec.binary.Base64;
|
24
|
import org.apache.commons.codec.binary.Base64;
|
26
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
25
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
27
|
import org.bouncycastle.openssl.PEMDecryptorProvider;
|
26
|
import org.bouncycastle.openssl.PEMDecryptorProvider;
|
|
@@ -30,15 +29,26 @@ import org.bouncycastle.openssl.PEMKeyPair; |
|
@@ -30,15 +29,26 @@ import org.bouncycastle.openssl.PEMKeyPair; |
30
|
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
|
29
|
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
|
31
|
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
|
30
|
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
|
32
|
import org.springframework.util.StringUtils;
|
31
|
import org.springframework.util.StringUtils;
|
|
|
32
|
+import org.thingsboard.mqtt.MqttClientConfig;
|
33
|
|
33
|
|
|
|
34
|
+import javax.crypto.Cipher;
|
|
|
35
|
+import javax.crypto.EncryptedPrivateKeyInfo;
|
|
|
36
|
+import javax.crypto.SecretKeyFactory;
|
|
|
37
|
+import javax.crypto.spec.PBEKeySpec;
|
34
|
import javax.net.ssl.KeyManagerFactory;
|
38
|
import javax.net.ssl.KeyManagerFactory;
|
35
|
import javax.net.ssl.TrustManagerFactory;
|
39
|
import javax.net.ssl.TrustManagerFactory;
|
36
|
import java.io.ByteArrayInputStream;
|
40
|
import java.io.ByteArrayInputStream;
|
37
|
-import java.security.*;
|
41
|
+import java.security.AlgorithmParameters;
|
|
|
42
|
+import java.security.Key;
|
|
|
43
|
+import java.security.KeyFactory;
|
|
|
44
|
+import java.security.KeyPair;
|
|
|
45
|
+import java.security.KeyStore;
|
|
|
46
|
+import java.security.PrivateKey;
|
|
|
47
|
+import java.security.Security;
|
38
|
import java.security.cert.Certificate;
|
48
|
import java.security.cert.Certificate;
|
39
|
import java.security.cert.CertificateFactory;
|
49
|
import java.security.cert.CertificateFactory;
|
40
|
import java.security.cert.X509Certificate;
|
50
|
import java.security.cert.X509Certificate;
|
41
|
-import java.security.interfaces.RSAPrivateKey;
|
51
|
+import java.security.spec.KeySpec;
|
42
|
import java.security.spec.PKCS8EncodedKeySpec;
|
52
|
import java.security.spec.PKCS8EncodedKeySpec;
|
43
|
import java.util.Optional;
|
53
|
import java.util.Optional;
|
44
|
|
54
|
|
|
@@ -138,16 +148,36 @@ public class CertPemClientCredentials implements MqttClientCredentials { |
|
@@ -138,16 +148,36 @@ public class CertPemClientCredentials implements MqttClientCredentials { |
138
|
}
|
148
|
}
|
139
|
|
149
|
|
140
|
private PrivateKey readPrivateKeyFile(String fileContent) throws Exception {
|
150
|
private PrivateKey readPrivateKeyFile(String fileContent) throws Exception {
|
141
|
- RSAPrivateKey privateKey = null;
|
151
|
+ PrivateKey privateKey = null;
|
142
|
if (fileContent != null && !fileContent.isEmpty()) {
|
152
|
if (fileContent != null && !fileContent.isEmpty()) {
|
143
|
fileContent = fileContent.replaceAll(".*BEGIN.*PRIVATE KEY.*", "")
|
153
|
fileContent = fileContent.replaceAll(".*BEGIN.*PRIVATE KEY.*", "")
|
144
|
.replaceAll(".*END.*PRIVATE KEY.*", "")
|
154
|
.replaceAll(".*END.*PRIVATE KEY.*", "")
|
145
|
.replaceAll("\\s", "");
|
155
|
.replaceAll("\\s", "");
|
146
|
byte[] decoded = Base64.decodeBase64(fileContent);
|
156
|
byte[] decoded = Base64.decodeBase64(fileContent);
|
147
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
157
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
148
|
- privateKey = (RSAPrivateKey) keyFactory.generatePrivate(new PKCS8EncodedKeySpec(decoded));
|
158
|
+ KeySpec keySpec = getKeySpec(decoded);
|
|
|
159
|
+ privateKey = keyFactory.generatePrivate(keySpec);
|
149
|
}
|
160
|
}
|
150
|
return privateKey;
|
161
|
return privateKey;
|
151
|
}
|
162
|
}
|
152
|
|
163
|
|
|
|
164
|
+ private KeySpec getKeySpec(byte[] encodedKey) throws Exception {
|
|
|
165
|
+ KeySpec keySpec;
|
|
|
166
|
+ if (password == null) {
|
|
|
167
|
+ keySpec = new PKCS8EncodedKeySpec(encodedKey);
|
|
|
168
|
+ } else {
|
|
|
169
|
+ PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
|
|
|
170
|
+
|
|
|
171
|
+ EncryptedPrivateKeyInfo privateKeyInfo = new EncryptedPrivateKeyInfo(encodedKey);
|
|
|
172
|
+ String algorithmName = privateKeyInfo.getAlgName();
|
|
|
173
|
+ Cipher cipher = Cipher.getInstance(algorithmName);
|
|
|
174
|
+ SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithmName);
|
|
|
175
|
+
|
|
|
176
|
+ Key pbeKey = secretKeyFactory.generateSecret(pbeKeySpec);
|
|
|
177
|
+ AlgorithmParameters algParams = privateKeyInfo.getAlgParameters();
|
|
|
178
|
+ cipher.init(Cipher.DECRYPT_MODE, pbeKey, algParams);
|
|
|
179
|
+ keySpec = privateKeyInfo.getKeySpec(cipher);
|
|
|
180
|
+ }
|
|
|
181
|
+ return keySpec;
|
|
|
182
|
+ }
|
153
|
} |
183
|
} |