У меня есть простой сервер MQTT Mosquitto, работающий на моем Raspberry Pi в локальной сети, и машина Windows с простым приложением java в Eclipse IDE. Все работает нормально, если я запускаю тестовое приложение mosquitto_sub
с моей Windows машины:
mosquitto_sub -h 192.168.1.8 -t sensor --cafile c:\projects\certs\ca.crt --cert c:\projects\certs\client.crt --key c:\projects\certs\client.key -p 8884 -d -u b -P b
Я получил исключение ниже, если я запускаю свою программу Java:
MqttException (0) - javax.net.ssl.SSLHandshakeException: No subject alternative names present
at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:736)
at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: javax.net.ssl.SSLHandshakeException: No subject alternative names present
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:324)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:267)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:262)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:641)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:460)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:360)
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:396)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422)
at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:181)
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1460)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1368)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:437)
at org.eclipse.paho.client.mqttv3.internal.SSLNetworkModule.start(SSLNetworkModule.java:149)
at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:722)
... 1 more
Java код программы:
package artifact_id;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileReader;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMDecryptorProvider;
import org.bouncycastle.openssl.PEMEncryptedKeyPair;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
public class TestMQTT2 {
public static void main(String[] args) {
String serverUrl = "ssl://192.168.1.8:8884";
String path= "C:\\projects\\certs\\";
String caFilePath =path+"ca.crt";
String clientCrtFilePath = path+ "client.crt";
String clientKeyFilePath = path+ "client.key";
String mqttUserName = "b";
String mqttPassword = "b";
MqttClient client;
try {
client = new MqttClient(serverUrl, "2");
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(mqttUserName);
options.setPassword(mqttPassword.toCharArray());
options.setConnectionTimeout(60);
options.setKeepAliveInterval(60);
options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);
SSLSocketFactory socketFactory = getSocketFactory(caFilePath,clientCrtFilePath, clientKeyFilePath, "");
options.setSocketFactory(socketFactory);
System.out.println("starting connect the server...");
client.connect(options);
System.out.println("connected!");
Thread.sleep(1000);
client.subscribe(
"/u/56ca327d17531d08e76bddd4a215e37f5fd6082f7442151c4d3f1d100a0ffd4e",
0);
client.disconnect();
System.out.println("disconnected!");
} catch (MqttException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
private static SSLSocketFactory getSocketFactory(final String caCrtFile,
final String crtFile, final String keyFile, final String password)
throws Exception {
Security.addProvider(new BouncyCastleProvider());
// load CA certificate
X509Certificate caCert = null;
FileInputStream fis = new FileInputStream(caCrtFile);
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
caCert = (X509Certificate) cf.generateCertificate(bis);
// System.out.println(caCert.toString());
}
// load client certificate
bis = new BufferedInputStream(new FileInputStream(crtFile));
X509Certificate cert = null;
while (bis.available() > 0) {
cert = (X509Certificate) cf.generateCertificate(bis);
// System.out.println(caCert.toString());
}
// load client private key
PEMParser pemParser = new PEMParser(new FileReader(keyFile));
Object object = pemParser.readObject();
PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder()
.build(password.toCharArray());
JcaPEMKeyConverter converter = new JcaPEMKeyConverter()
.setProvider("BC");
KeyPair key;
if (object instanceof PEMEncryptedKeyPair) {
System.out.println("Encrypted key - we will use provided password");
key = converter.getKeyPair(((PEMEncryptedKeyPair) object)
.decryptKeyPair(decProv));
} else {
System.out.println("Unencrypted key - no password needed");
key = converter.getKeyPair((PEMKeyPair) object);
}
pemParser.close();
// CA certificate is used to authenticate server
KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());
caKs.load(null, null);
caKs.setCertificateEntry("ca-certificate", caCert);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(caKs);
// client key and certificates are sent to server so it can authenticate
// us
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry("certificate", cert);
ks.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(),
new java.security.cert.Certificate[] { cert });
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
.getDefaultAlgorithm());
kmf.init(ks, password.toCharArray());
// finally, create SSL socket factory
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return context.getSocketFactory();
}
}
Я использовал те же сертификаты, что и с mosquitto_sub.exe
.
Сертификаты были сгенерированы на сервере в соответствии с приведенной ниже процедурой:
openssl genrsa -des3 -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=LT/ST=Some-State/O=KPV/CN=192.168.1.8"
openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key -subj "/C=LT/ST=Some-State/O=Internet Widgits Pty Ltd/CN=192.168.1.8"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 720
openssl genrsa -out client.key 2048
openssl req -new -out client.csr -key client.key -subj "/C=LT/ST=Some-State/O=Internet Widgits Pty Ltd/CN=192.168.1.103"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 720
Похоже, у меня проблема с именем CN в сертификате, но как это исправить и почему у меня нет проблем с souch в тестовое приложение mosquitto_sub.exe
?
UPD Больше отладки до исключения:
javax.net.ssl|INFO|0D|MQTT Con: 2|2020-01-07 17:44:03.059 EET|AlpnExtension.java:161|No available application protocols
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.060 EET|SSLExtensions.java:257|Ignore, context unavailable extension: application_layer_protocol_negotiation
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.060 EET|SessionTicketExtension.java:396|Stateless resumption not supported
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.060 EET|SSLExtensions.java:257|Ignore, context unavailable extension: session_ticket
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.061 EET|SSLExtensions.java:257|Ignore, context unavailable extension: renegotiation_info
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.064 EET|ClientHello.java:652|Produced ClientHello handshake message (
"ClientHello": {
"client version" : "TLSv1.2",
"random" : "1C 28 DD BE 41 96 3B 8F A6 22 7E CB 82 E2 0B 0E EF 76 40 6C D5 15 13 BF E0 7C AB 41 70 05 2B F1",
"session id" : "",
"cipher suites" : "[TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA9), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030), TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCCA8), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCCAA), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(0xC024), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(0xC028), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(0xC023), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(0xC027), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(0xC02E), TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(0xC032), TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(0xC02D), TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(0xC031), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(0xC026), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(0xC02A), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(0xC025), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(0xC029), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(0xC00A), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(0xC009), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(0xC005), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(0xC00F), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(0xC004), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(0xC00E), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]",
"compression methods" : "00",
"extensions" : [
"server_name (0)": {
type=host_name (0), value=192.168.1.8
},
"status_request (5)": {
"certificate status type": ocsp
"OCSP status request": {
"responder_id": <empty>
"request extensions": {
<empty>
}
}
},
"supported_groups (10)": {
"versions": [x25519, secp256r1, secp384r1, secp521r1, x448, ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192]
},
"ec_point_formats (11)": {
"formats": [uncompressed]
},
"signature_algorithms (13)": {
"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
},
"signature_algorithms_cert (50)": {
"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]
},
"status_request_v2 (17)": {
"cert status request": {
"certificate status type": ocsp_multi
"OCSP status request": {
"responder_id": <empty>
"request extensions": {
<empty>
}
}
}
},
"extended_master_secret (23)": {
<empty>
},
"supported_versions (43)": {
"versions": [TLSv1.2, TLSv1.1, TLSv1]
}
]
}
)
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.070 EET|ServerHello.java:887|Consuming ServerHello handshake message (
"ServerHello": {
"server version" : "TLSv1.2",
"random" : "6E 73 51 92 10 7B F4 71 50 89 30 98 CB DC 33 27 EA 68 5D 31 94 21 CA D2 3C 1F 01 73 B9 3B 27 6C",
"session id" : "75 88 F5 E8 C1 D6 04 15 B6 9C BC 00 F8 01 97 5E B2 26 D9 72 CD EB D0 20 2F 11 33 10 F4 F9 70 56",
"cipher suite" : "TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D)",
"compression methods" : "00",
"extensions" : [
"renegotiation_info (65,281)": {
"renegotiated connection": [<no renegotiated connection>]
}
]
}
)
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.070 EET|SSLExtensions.java:170|Ignore unavailable extension: supported_versions
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.070 EET|ServerHello.java:983|Negotiated protocol version: TLSv1.2
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.071 EET|SSLExtensions.java:189|Consumed extension: renegotiation_info
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.071 EET|SSLExtensions.java:170|Ignore unavailable extension: server_name
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.071 EET|SSLExtensions.java:170|Ignore unavailable extension: max_fragment_length
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.071 EET|SSLExtensions.java:170|Ignore unavailable extension: status_request
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.072 EET|SSLExtensions.java:170|Ignore unavailable extension: ec_point_formats
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.072 EET|SSLExtensions.java:170|Ignore unavailable extension: status_request_v2
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.072 EET|SSLExtensions.java:170|Ignore unavailable extension: session_ticket
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.072 EET|SSLExtensions.java:189|Consumed extension: renegotiation_info
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.072 EET|SSLExtensions.java:204|Ignore unavailable extension: server_name
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.072 EET|SSLExtensions.java:204|Ignore unavailable extension: max_fragment_length
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.072 EET|SSLExtensions.java:204|Ignore unavailable extension: status_request
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.073 EET|SSLExtensions.java:204|Ignore unavailable extension: ec_point_formats
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.073 EET|SSLExtensions.java:204|Ignore unavailable extension: application_layer_protocol_negotiation
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.073 EET|SSLExtensions.java:204|Ignore unavailable extension: status_request_v2
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.073 EET|SSLExtensions.java:204|Ignore unavailable extension: extended_master_secret
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.073 EET|SSLExtensions.java:204|Ignore unavailable extension: session_ticket
javax.net.ssl|WARNING|0D|MQTT Con: 2|2020-01-07 17:44:03.073 EET|SSLExtensions.java:212|Ignore impact of unsupported extension: renegotiation_info
javax.net.ssl|DEBUG|0D|MQTT Con: 2|2020-01-07 17:44:03.079 EET|CertificateMessage.java:357|Consuming server Certificate handshake message (
"Certificates": [
"certificate" : {
"version" : "v1",
"serial number" : "00 9B F1 5B 97 E0 29 8B C5",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=192.168.1.8, O=KPV, ST=Some-State, C=LT",
"not before" : "2020-01-07 14:55:40.000 EET",
"not after" : "2021-12-27 14:55:40.000 EET",
"subject" : "CN=192.168.1.8, O=Internet Widgits Pty Ltd, ST=Some-State, C=LT",
"subject public key" : "RSA"},
"certificate" : {
"version" : "v3",
"serial number" : "00 97 DB 51 A5 2E 74 11 D5",
"signature algorithm": "SHA256withRSA",
"issuer" : "CN=192.168.1.8, O=KPV, ST=Some-State, C=LT",
"not before" : "2020-01-07 14:55:08.000 EET",
"not after" : "2030-01-04 14:55:08.000 EET",
"subject" : "CN=192.168.1.8, O=KPV, ST=Some-State, C=LT",
"subject public key" : "RSA",
"extensions" : [
{
ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: EE 78 20 C5 B4 0F 52 AE 10 78 6D 4F E6 F9 01 FC .x ...R..xmO....
0010: C5 FE 43 3A ..C:
]
]
},
{
ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:true
PathLen:2147483647
]
},
{
ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: EE 78 20 C5 B4 0F 52 AE 10 78 6D 4F E6 F9 01 FC .x ...R..xmO....
0010: C5 FE 43 3A ..C:
]
]
}
]}
]
)
UPD
Я добавил SAN в свой сертификат CA, но все еще с той же ошибкой:
*** Certificate chain
chain [0] = [
[
Version: V1
Subject: CN=192.168.1.8, O=Internet Widgits Pty Ltd, L=London, ST=Some-State, C=LT
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
Key: Sun RSA public key, 2048 bits
modulus: 26919970067664277046938740179646593770595070258539214027906489317270223306613773873574865971989417280121938347002713257983436007635951198166738943346774588648713868326559124372172220920255122744458481363586362998906174514508772548930887656233482327964167952459414376684269324538787753885909740701792244833405807399341202234562923325267930504133404200586110018959746363653784682525123525070031800151860156030452288371417726351186685188182156815653674462798515566058503087254867011627827960607372111926413977520280936130030617572396272525859532888254937560715723226670006379354402328441621835955075995305208788762081261
public exponent: 65537
Validity: [From: Sat Jan 11 23:48:05 EET 2020,
To: Fri Dec 31 23:48:05 EET 2021]
Issuer: CN=192.168.1.8, O=KKK, L=London, ST=Some-State, C=LT
SerialNumber: [ ecd92b00 b3fb8404]
]
Algorithm: [SHA256withRSA]
Signature:
0000: 10 F0 2D F7 A9 DE A8 8A 57 71 48 8E 32 CF E4 EC ..-.....WqH.2...
0010: 6A 3B CD CB C9 85 31 72 15 75 DA 31 C6 43 28 F1 j;....1r.u.1.C(.
0020: 83 8B E2 4A A9 3E 61 CB FE FD FB 29 17 2F 52 C4 ...J.>a....)./R.
0030: 78 0F 98 C4 B4 07 52 EA 5D DF 3C 0F E7 6B 40 D6 x.....R.].<..k@.
0040: 0D 49 30 09 86 95 12 45 4B 80 2F F0 88 E1 51 51 .I0....EK./...QQ
0050: C3 00 9B 3F AE 9D BD 60 C3 53 62 61 EC 27 6C 0A ...?...`.Sba.'l.
0060: 9D 05 E1 C1 FE 47 1C C5 C2 73 E9 83 EB AC 40 35 .....G...s....@5
0070: AA DF 91 08 D1 1F 7C 88 D4 AA E4 0B 5E 76 96 C4 ............^v..
0080: 3F A4 D1 EC 0A FA 92 62 6D 4D 60 6E 09 C1 15 7A ?......bmM`n...z
0090: EF 69 F8 D2 97 34 6B 85 17 DB EB E0 85 5B 65 A6 .i...4k......[e.
00A0: F9 DE 36 E3 2B 3E 6F 66 E4 8E CE C3 1B 03 35 A1 ..6.+>of......5.
00B0: 5F 69 23 7B E7 14 3C F4 55 76 A0 2A BE 2D D1 E5 _i#...<.Uv.*.-..
00C0: FB DD BB F8 35 53 74 36 03 1B BA 50 1D CE 05 9A ....5St6...P....
00D0: CC 97 53 7A DD D8 6E 37 E7 F8 09 8A A2 6F 0D 33 ..Sz..n7.....o.3
00E0: 54 48 F3 8F EF E8 88 2C 08 AF A7 9B 36 4B A5 A1 TH.....,....6K..
00F0: B3 B3 59 BD 7D 4F 7F 2A A8 9A F5 0C 47 7D 24 7A ..Y..O.*....G.$z
]
chain [1] = [
[
Version: V3
Subject: CN=192.168.1.8, O=KKK, L=London, ST=Some-State, C=LT
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11
Key: Sun RSA public key, 2048 bits
modulus: 31551203319810981527233108446277563899213631125603579886371381656574566442248231160813967318138442441980845850377045783621105463065795094893428617296088707718259604057777847574260781634181942686117058391728751388056270282953662924658304160145891369274665499267192236359779564085533171204924942738308750731046065622639002103867771100617956654808689710961525820799371720055164697637203950227358935150462633808444574452627369987264554040538022692854734546152796362958992623680453477746700586578324657604996075661091524016670709534134322927064318932802387986606076073044828169821618812887782445389598990772050583953284467
public exponent: 65537
Validity: [From: Sat Jan 11 23:47:58 EET 2020,
To: Tue Jan 08 23:47:58 EET 2030]
Issuer: CN=192.168.1.8, O=KKK, L=London, ST=Some-State, C=LT
SerialNumber: [ 8bc631cb f446d8a2]
Certificate Extensions: 1
[1]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: 192.168.1.8
DNSName: glass
]
]
Algorithm: [SHA256withRSA]
Signature:
0000: 71 8F 65 90 D5 B3 74 DA 56 2F 11 B0 26 83 B1 D6 q.e...t.V/..&...
0010: 2A B7 3B B3 EC 00 C4 B5 97 94 72 7F 8F 8B 59 96 *.;.......r...Y.
0020: B0 B2 8D 09 6C 04 9D CE A7 F6 C8 9B 4D FA 10 77 ....l.......M..w
0030: 73 57 61 C2 D3 02 00 98 AC AC 17 2E B2 94 24 BD sWa...........$.
0040: 3E D0 F3 8F 65 36 DE 47 19 27 30 13 6D 8C 98 16 >...e6.G.'0.m...
0050: D5 31 B0 41 11 35 76 E4 B9 C8 5B F9 20 5C 2C BC .1.A.5v...[. \,.
0060: 75 6C 2F 9D D2 5B BE 11 61 59 48 D6 75 37 60 A7 ul/..[..aYH.u7`.
0070: 24 79 DF C4 A5 BE 92 6F C0 8F 2E F1 AC 41 71 07 $y.....o.....Aq.
0080: 95 6B C6 FA E1 B3 75 76 1D 35 1E 5E 8E 14 E4 D8 .k....uv.5.^....
0090: 33 46 9F B9 98 99 70 C2 8A E6 AF 6C E8 E7 71 71 3F....p....l..qq
00A0: 76 A5 9C 0E 47 F5 24 EC 45 3C 49 EC 3F 5F 81 BA v...G.$.E<I.?_..
00B0: CD C6 C1 31 C2 CC 4D E5 CA 88 C8 34 85 91 51 A3 ...1..M....4..Q.
00C0: 6C CB 7E 69 12 1E B8 A7 EE 3B 67 D8 7D 4D 4E 6E l..i.....;g..MNn
00D0: 05 BC F1 E6 BA 05 DF A9 99 6B 27 D8 62 CD C8 F6 .........k'.b...
00E0: BF 7D 0D 39 BD 54 86 ED CE 99 D7 89 45 6F 65 4A ...9.T......EoeJ
00F0: A3 C9 9A 69 EE 46 14 6E EF 61 64 20 82 01 E8 A5 ...i.F.n.ad ....
]
***
%% Invalidated: [Session-1, TLS_RSA_WITH_AES_256_GCM_SHA384]
MQTT Con: 2, SEND TLSv1.2 ALERT: fatal, description = certificate_unknown
MQTT Con: 2, WRITE: TLSv1.2 Alert, length = 2
MQTT Con: 2, called closeSocket()
MQTT Con: 2, handling exception: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
MQTT Con: 2, called close()
MQTT Con: 2, called closeInternal(true)
MqttException (0) - javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:736)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1640)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
at org.eclipse.paho.client.mqttv3.internal.SSLNetworkModule.start(SSLNetworkModule.java:149)
at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:722)
... 1 more
Caused by: java.security.cert.CertificateException: No subject alternative names present
at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:145)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:94)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:459)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:427)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:209)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:132)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1622)
... 10 more