Spanish [Ayuda] MQTT SSL con Certificado pkcs12 .pfx

RICARDO RESINES

New Member
Licensed User
Hola, he añadido el certificado a la conexión como lo hace https://www.b4x.com/android/forum/t...tputils2-sslcontext-kickstart.132549/#content

Además, he probado con https://www.b4x.com/android/forum/t...eer-certificate-a-website.133479/#post-843768

La conexión he incluido https://www.b4x.com/android/forum/threads/b4x-mqtt-ssl-and-self-signed-certificates.100973/#content

pero me da el error: (SSLHandshakeException) javax.net.ssl.SSLHandshakeException: Connection closed by peer

con B4J me funciona los certificados y me conecta: https://www.b4x.com/android/forum/t...ires-a-client-certificate.111881/#post-771036

Pruebas:
He instalado el certificado en mi móvil, Ajustes > Seguridad > Certificado VPN y Aplicaciones.
He agregado -> Press Ctrl + B and add HU2_PUBLIC as a conditional symbol!
Manifest: CreateResourceFromFile(Macro, Core.NetworkClearText)


utilizando lo anterior me queda

B4X:
Private StorePasswordstr As String = "771ef89xxx"
Private serverURI As String = "ssl://alu1y79tgeq5a-ats.iot.us-east-1.amazonaws.com:8883"

B4X:
Root = Root1
Root.LoadLayout("MainPage")
mytopic = "MAC/estado" '& mqtt.ClientId
ConectarMQTT

B4X:
Sub ConectarMQTT
    SetSSLFactory
    mqtt.Initialize("mqtt", serverURI, Rnd(0, 999999999)) ' & Rnd(0, 999999999) & DateTime.No
    Dim mo As MqttConnectOptions
    mo.Initialize("", "")
    TrustAll(mo)
    'SetSSLFactory
    mqtt.Connect2(mo)
    'SetSSLFactory
End Sub

B4X:
Sub TrustAll (mo As MqttConnectOptions)
   Dim SSLContext As JavaObject
   SSLContext = SSLContext.InitializeStatic("javax.net.ssl.SSLContext").RunMethod("getInstance", Array("TLS"))
   Dim tm As CustomTrustManager
   tm.InitializeAcceptAll
   SSLContext.RunMethod("init", Array(Null, tm, Null))
   Dim jmo As JavaObject = mo
   jmo.RunMethod("setSocketFactory", Array(SSLContext.RunMethod("getSocketFactory", Null)))
End Sub


B4X:
Private Sub SetSSLFactory
    Dim hc As OkHttpClient = HttpUtils2Service.hc
    Dim builder As JavaObject = hc.As(JavaObject).RunMethod("sharedInit", Array("hc"))
    Dim sslfactoryBuilder As JavaObject
    sslfactoryBuilder = sslfactoryBuilder.InitializeStatic("nl.altindag.sslcontext.SSLFactory").RunMethod("builder", Null)
 
    Dim in As InputStream = File.OpenInput(File.DirAssets, "771ef8945f-certificate.pfx")
    Dim keystore As JavaObject
    keystore.InitializeStatic("java.security.KeyStore")
    Dim password As Object = StorePasswordstr.As(JavaObject).RunMethod("toCharArray", Null) 'ignore
    Dim store As JavaObject = keystore.RunMethodJO("getInstance", Array("pkcs12"))
    store.RunMethod("load", Array(in, password))
 
    sslfactoryBuilder.RunMethod("withIdentityMaterial", Array(store, password))
    sslfactoryBuilder.RunMethod("withTrustMaterial", Array(store, password))
 
    Dim sslfactory As JavaObject = sslfactoryBuilder.RunMethod("build", Null)
    Dim socketfactory As JavaObject = sslfactory.RunMethodJO("getSslContext", Null).RunMethod("getSocketFactory", Null)
 
    Dim trustmanager As JavaObject = sslfactory.RunMethodJO("getTrustManager", Null)
    builder.RunMethod("sslSocketFactory", Array(socketfactory, trustmanager.RunMethod("get", Null)))
 
    Dim jo As JavaObject
    jo.InitializeNewInstance(Application.PackageName & ".b4xmainpage$MyVerifier", Array(Me))
    builder.RunMethod("hostnameVerifier", Array(jo))
    hc.As(JavaObject).SetField("client", builder.RunMethod("build", Null))
End Sub

B4X:
Private Sub Verify_Verify (Host As String, Session As Object)
    Log("verify")
    Dim jo As JavaObject = Session
    Dim certificates() As Object = jo.RunMethod("getPeerCertificates", Null)
    For Each certificate As JavaObject In certificates
        Dim PublicKey As JavaObject = certificate.RunMethod("getPublicKey", Null)
        Log(PublicKey) 'ignore
        Dim b() As Byte = certificate.RunMethod("getEncoded", Null)
        Log(BytesToString(b, 0, b.Length, "ASCII"))
    Next
End Sub

B4X:
#if Java
public class MyVerifier implements javax.net.ssl.HostnameVerifier {
     public boolean verify(java.lang.String host, javax.net.ssl.SSLSession session) {
         getBA().raiseEventFromDifferentThread(null, null, 0, "verify_verify", true, new Object[] {host, session});
         return true;
     }
}
#End If
 
Last edited:
Top